Basics of Icon
Description of the page content
Conversion of old BASIC programs to Icon in order to learn the basics of this language.
Tags:
3D Plot
# 3D Plot
#
# Original version in BASIC:
# Creative Computing (Morristown, New Jersey, USA), ca. 1980.
#
# This version in Icon:
# Copyright (c) 2023, Marcos Cruz (programandala.net)
# SPDX-License-Identifier: Fair
#
# Written in 2023-03-03/21.
#
# Last modified 20231103T2341+0100.
link iscreen # clear()
$define dot "*"
$define space " "
$define width 56
procedure print_credits()
clear()
write("3D Plot\n")
write("Original version in BASIC:")
write(" Creative computing (Morristown, New Jersey, USA), ca. 1980.\n")
write("This version in Icon:")
write(" Copyright (c) 2023, Marcos Cruz (programandala.net)")
write(" SPDX-License-Identifier: Fair\n")
write("Press Enter to start the program.")
read()
end
procedure a(z)
return 30 * exp(-z * z / 100)
end
procedure draw()
clear()
x := -30
while x <= 30 do {
line := repl(space,width)
l := 0
y1 := 5 * integer(sqrt(900 - x * x) / 5)
y := y1
while y >= -y1 do {
z := integer(25 + a(sqrt(x * x + y * y)) - .7 * y)
if z > l then {
l := z
line[z + 1] := dot
}
y -:= 5
}
write(line)
x +:= 1.50
}
end
procedure main()
print_credits()
draw()
end
Bunny
# Bunny
#
# Original version in BASIC:
# Creative Computing (Morristown, New Jersey, USA), 1978.
#
# This version in Icon:
# Copyright (c) 2023, Marcos Cruz (programandala.net)
# SPDX-License-Identifier: Fair
#
# Written in 2023-09.
#
# Last modified 20231103T2341+0100.
link iscreen # clear()
# Print the credits and wait for a keypress.
procedure print_credits()
write("Bunny\n")
write("Original version in BASIC:")
write(" Creative Computing (Morristown, New Jersey, USA), 1978.\n")
write("This version in Icon:")
write(" Copyright (c) 2023, Marcos Cruz (programandala.net)")
write(" SPDX-License-Identifier: Fair\n")
write("Press Enter to start the program.")
read()
end
$define width 53
$define EOL -1 # end of line identifier
global data
global data_index
procedure next_datum()
data_index +:= 1
return data[data_index]
end
# Draw the graphic out of `data` and `letter`.
procedure draw()
letter := ["B", "U", "N", "N", "Y"]
data := [
1, 2, EOL, 0, 2, 45, 50, EOL, 0, 5, 43, 52, EOL, 0, 7, 41, 52, EOL,
1, 9, 37, 50, EOL, 2, 11, 36, 50, EOL, 3, 13, 34, 49, EOL, 4, 14,
32, 48, EOL, 5, 15, 31, 47, EOL, 6, 16, 30, 45, EOL, 7, 17, 29, 44,
EOL, 8, 19, 28, 43, EOL, 9, 20, 27, 41, EOL, 10, 21, 26, 40, EOL,
11, 22, 25, 38, EOL, 12, 22, 24, 36, EOL, 13, 34, EOL, 14, 33, EOL,
15, 31, EOL, 17, 29, EOL, 18, 27, EOL, 19, 26, EOL, 16, 28, EOL,
13, 30, EOL, 11, 31, EOL, 10, 32, EOL, 8, 33, EOL, 7, 34, EOL, 6,
13, 16, 34, EOL, 5, 12, 16, 35, EOL, 4, 12, 16, 35, EOL, 3, 12, 15,
35, EOL, 2, 35, EOL, 1, 35, EOL, 2, 34, EOL, 3, 34, EOL, 4, 33,
EOL, 6, 33, EOL, 10, 32, 34, 34, EOL, 14, 17, 19, 25, 28, 31, 35,
35, EOL, 15, 19, 23, 30, 36, 36, EOL, 14, 18, 21, 21, 24, 30, 37, 37,
EOL, 13, 18, 23, 29, 33, 38, EOL, 12, 29, 31, 33, EOL, 11, 13, 17,
17, 19, 19, 22, 22, 24, 31, EOL, 10, 11, 17, 18, 22, 22, 24, 24, 29,
29, EOL, 22, 23, 26, 29, EOL, 27, 29, EOL, 28, 29, EOL ]
line_buffer := list(width, " ")
data_index := 0
while data_index <= *data do {
first_column := next_datum()
if first_column == EOL then {
every column := 1 to width do
writes(line_buffer[column])
write()
line_buffer := list(width, " ")
} else {
last_column := next_datum()
every column := first_column to last_column do
line_buffer[column + 1] := letter[column % *letter + 1]
}
}
end
procedure main()
clear()
print_credits()
clear()
draw()
end
Diamond
# Diamond
#
# Original version in BASIC:
# Example included in Vintage BASIC 1.0.3.
# http://www.vintage-basic.net
#
# This version in Icon:
# Copyright (c) 2023, Marcos Cruz (programandala.net)
# SPDX-License-Identifier: Fair
#
# Written in 2023-03-03.
#
# Last modified 20231103T2342+0100.
$define lines 17
procedure main()
every i := 1 to lines / 2 + 1 do {
every j := 1 to (lines + 1) / 2 - i + 1 do writes(" ")
every j := 1 to i * 2 - 1 do writes("*")
write()
}
every i := 1 to lines / 2 do {
every j := 1 to i + 1 do writes(" ")
every j := 1 to ((lines + 1) / 2 - i) * 2 - 1 do writes("*")
write()
}
end
Math
# Math
#
# Original version in BASIC:
# Example included in Vintage BASIC 1.0.3.
# http://www.vintage-basic.net
#
# This version in Icon:
# Copyright (c) 2023, Marcos Cruz (programandala.net)
# SPDX-License-Identifier: Fair
#
# Written in 2023-03, 2023-09.
#
# Last modified 20231103T2342+0100.
link numbers # sign(), trunc()
procedure main()
writes("Enter a number ")
n := read()
write("ABS(", n, ") --> abs(", n, ") --> ", abs(n))
write("ATN(", n, ") --> atan(", n, ") --> ", atan(n))
write("COS(", n, ") --> cos(", n, ") --> ", cos(n))
write("EXP(", n, ") --> exp(", n, ") --> ", exp(n))
write("INT(", n, ") --> trunc(", n, ") --> ", trunc(n))
write("LOG(", n, ") --> log(", n, ") --> ", log(n))
write("SGN(", n, ") --> sign(", n, ") --> ", sign(n))
write("SQR(", n, ") --> sqrt(", n, ") --> ", sqrt(n))
write("TAN(", n, ") --> tan(", n, ") --> ", tan(n))
end
Sine Wave
# Sine Wave
#
# Original version in BASIC:
# Creative Computing (Morristown, New Jersey, USA), ca. 1980.
#
# This version in Icon:
# Copyright (c) 2023, Marcos Cruz (programandala.net)
# SPDX-License-Identifier: Fair
#
# Written in 2023-03-02/21.
#
# Last modified 20231103T2342+0100.
link iscreen # clear()
global word
procedure print_credits()
write("Sine Wave\n")
write("Original version in BASIC:")
write(" Creative computing (Morristown, New Jersey, USA), ca. 1980.\n")
write("This version in Icon:")
write(" Copyright (c) 2023, Marcos Cruz (programandala.net)")
write(" SPDX-License-Identifier: Fair\n")
write("Press Enter to start the program.")
read()
end
procedure get_words()
word := ["", ""]
every w := (1 | 2) do {
write("Enter the " || ["first", "second"][w] || " word ")
word[w] := read()
}
end
procedure draw()
step := 2
every angle := 0 to 4000 by 25 do
write(repl(" ", 26 + 25 * sin(angle/100.0)), word[step := [2, 1][step]])
end
procedure main()
clear()
print_credits()
clear()
get_words()
clear()
draw()
end
