The section numbers are per the Berkeley
Logo Reference Manual in Brian Harvey's Computer Science Logo Style volume 2: Advanced Techniques
for ease of comparison. Chapter 6. Graphics is replaced by a Chapter about People and Movement.
- Data Types and Syntax
- Data Structure Primitives
- Communication
- Arithmetic
- Logical Operations
- People and Movement
Graphics
- Workspace Management
- Control Structures
Data Types and Syntax
"word
'word
number
- Word. (Quoted words are terminated by [](){} or whitespace, \ to escape.)
- show "hello
- show "hello\ logo
- show 12.34
:variable
- Input definition/variable reference
- show :name
[ word ... ]
- List of words or lists, whitespace separated
- show [1 2 3]
{ word ... }
{ word ... }@origin
- Array of words, whitespace separated
- show {1 2 3}
( expression )
- Parenthesis can be used to group expressions
- show ( 1 + 2 ) * 3
procedure input ...
- Call procedure with default number of inputs
- show "hello
( procedure input ... )
- Call procedure with an arbitrary number of inputs
- (show "hello :name)
2. Data Structure Primitives
2.1 Constructors
word expr expr
(word expr ...)
- Concatenate two (or more) words into one word
- show (word "a "b "c)
list thing1 thing2
(list thing1 thing2 ...)
- Create a new list from the inputs
- show (list 1+2 2+3 3+4)
sentence thing1 thing2
(sentence thing1 thing2 ...)
se thing1 thing2
(se thing1 thing2 ...)
- Create a new list from the inputs (if non-lists) or members of the inputs (if lists)
- show sentence [1 2 3] [and so on]
fput thing list
lput thing list
- Outputs list, but with thing added as a new first/last item; if list is a word, concatenates
- show fput 0 [ 1 2 3 ]
- show fput "a "bcd
- show lput 4 [ 1 2 3 ]
- show lput "e "bcd
array size
(array size origin)
- Create a new array. The default origin is 1.
- show array 10
mdarray [dimensions ...]
(mdarray [dimensions ...] origin)
- Create a new multi-dimensional array. The default origin is 1.
- show mdarray [2 2]
listtoarray list
(listtoarray list origin)
- Create a new array populated by members of a list
- show listtoarray [ 1 3 5 7 ]
arraytolist array
- Create a new list populated by members of a array
- show arraytolist { 2 4 6 8 }
combine thing1 thing2
- If thing2 is a word, like
word; otherwise, like fput
- show combine "a [b c]
reverse list
- Outputs a list with the items in reverse order; if input is a word, reverses characters
- show reverse [ 1 2 3 ]
- show reverse "abc
gensym
- Outputs a unique string, e.g. G1, G2, etc.
- show gensym
2.2 Data Selectors
first list
last list
- Outputs the first or last item (or character) from the list (or word), respectively
- show first [ 1 2 3 ]
- show first "abc
- show last [ 1 2 3 ]
- show last "abc
firsts listoflists
- Outputs a list of the first item (or character) of each sublist (or word)
- show firsts [ [1 2 3] [a b c] ]
- show firsts [ abc def ]
butfirst list
bf list
butlast list
bl list
- Outputs the list (or word), except for the first/last item (or character)
- show butfirst [ 1 2 3 ]
- show butfirst "abc
- show butlast [ 1 2 3 ]
- show butlast "abc
butfirsts listoflists
bfs listoflists
- Outputs a list of sublists (or words) without the first item (or characters)
- show butfirsts [ [ 1 2 3 ] [ a b c ] ]
- show butfirsts [ abc def ]
item index thing
- Outputs the indexth item of the list or array or word
- show item 2 [ 1 2 3 ]
- show item 2 "abc
mditem [index ...] thing
- Outputs an item from a multi-dimensional array
- show mditem [2 1] {{a b} {c d}}
pick list
- Outputs one item from a list (or word), at random
- show pick [ 1 2 3 ]
- show pick "abc
remove thing list
- Outputs the list (or word) with any occurences of thing removed
- show remove "b [ a b c ]
- show remove "a "banana
remdup list
- Outputs the list (or word) with duplicates removed
- show remdup [ 1 2 3 2 3 4 3 4 5 ]
- show remdup "banana
quoted thing
- Outputs thing with " prepended if a word, or just thing otherwise.
- show quoted "abc
split thing list
- Outputs the list split into a list of lists (or list of words) wherever thing appears.
- show split "a "banana
- show split 3 [1 2 3 4 1 2 3 4]
2.3 Data Mutators
setitem index array value
- Sets the indexth item of the array to value (circular arrays prevented)
- make "a { 1 2 3 } setitem 2 :a "x show :a
mdsetitem [index...] array value
- Sets an item in a multi-dimensional array to value (circular arrays prevented)
- make "a {{1 2} {3 4}} mdsetitem [2 1] :a "x show :a
.setfirst list value
- Sets the first item of the list to value
- make "a [ 1 2 3 ] .setfirst :a "7 show :a
.setbf list value
- Sets the 'butfirst' of the list to the items in value (a list)
- make "a [ 1 2 3 ] .setbf :a [ 4 9 ] show :a
.setitem index array value
- Sets the indexth item of the array to value (circular arrays allowed)
- make "a { 1 2 3 } setitem 2 :a "x show :a
push stackname thing
pop stackname
- Push to/pop from a stack i.e. list variable. Stacks grow from the front. Works on words.
- make "s [ 2 1 ] push "s 3 show :s show pop "s
- make "s "ba push "s "c show :s show pop "s
queue stackname thing
dequeue stackname
- Add/remove from a queue i.e. list variable, Queues grow from the end. Works on words.
- make "q [ 1 2 ] queue "q 3 show :q show dequeue "q
- make "q "ab queue "q "c show :q show dequeue "q
2.4 Predicates
Predicates return 1 (true) or 0 (false)
wordp thing
word? thing
listp thing
list? thing
arrayp thing
array? thing
numberp thing
number? thing
- Test if thing is a word, list, array, or number respectively.
emptyp expr
empty? expr
- Test if thing is an empty list or empty string.
equalp expr expr
equal? expr expr
expr = expr
notequalp expr expr
notequal? expr expr
expr <> expr
- Equality/inequality tests. Compares strings, numbers, or lists (equal if length and all members are equal).
beforep thing1 thing2
before? thing1 thing2
- Test string collation order.
.eq thing1 thing2
- Test if things have the same identity.
memberp thing list
member? thing list
- Test if thing is equal to any member of list.
substringp thing1 thing2
substring? thing1 thing2
- Test if thing1 is a substring of thing2.
2.5 Queries
count thing
- Outputs length of a list or number of characters in a string
- show count [ 1 2 3 ]
- show count "hello
ascii expr
- Outputs ASCII (actually, Unicode) code point for first character of string
- show ascii "abc
char expr
- Outputs Unicode character at specified code point
- show char 97
member thing list
- Outputs the list (or word) from the first occurence of thing to the end, or empty list (or word)
- show member "a "banana
- show member 2 [1 2 3 4]
uppercase expr
lowercase expr
- Outputs string converted to upper/lowercase
- show uppercase "abc
- show lowercase "ABC
standout expr
- Outputs string with alphanumeric characters in bold
- show standout "ABCabc123
parse word
- Outputs word parsed as a list.
- show parse "1+2
runparse word
- Outputs word parsed as instructions.
- show runparse "1+2
3. Communication
3.1 Transmitters
print thing
pr thing
- (
print thing1 thing2 ...)
- (
pr thing1 thing2 ...)
- Print inputs to the text screen, separated by spaces, and followed by a newline.
Square brackets are only put around sublists.
- print "hello
type thing
- (
type thing1 thing2 ...)
- Like
print but with no trailing newline.
- type "hel type "lo
show thing
- (
show thing1 thing2 ...)
- Like
print but with square brackets around list inputs.
- show "hello
3.2 Receivers
readlist
(readlist promptstr)
- Prompt the user for a line of input. The result is a list of words.
- show readlist
- make "colors (readlist [Type some colors:]) show :colors
readword
(readword promptstr)
- Prompt the user for a line of input. The result (including spaces) is the single word output.
- show readword
- make "name (readword [What is your name?]) show :name
3.4 Terminal Access
cleartext
ct
- Clear the text screen.
settextcolor color
- Change the text color.
textcolor
- Output the current text color.
increasefont
decreasefont
- Increase/decrease the text size.
settextsize height
- Change the text size (in pixels).
textsize
- Output the current text size (in pixels).
setfont name
- Change the text font.
font
- Output the current text font.
4. Arithmetic
4.1 Numeric Operations
Inputs are numbers or numeric expressions, output is a number.
sum expr expr
(sum expr ...)
expr + expr
difference expr expr
expr - expr
product expr expr
(product expr ...)
expr * expr
quotient expr expr
(quotient expr)
expr / expr
power expr expr
expr ^ expr
-
Add, subtract, multiply, divide, and raise-to-the-power-of respectively.
A single input to quotient returns the reciprocal.
remainder expr expr
expr % expr
modulo expr expr
-
Outputs the remainder (modulus). For
remainder and %
the result has the same sign as the first input; for modulo the
result has the same sign as a the second input.
minus expr
- expr
-
Unary minus sign must begin a top-level expression, follow an infix
operator, or have a leading space and no trailing space.
abs num
- Absolute value
int num
round num
- Truncate or round a number, respectively.
sqrt expr
exp expr
log10 expr
ln expr
- Square root, e to the power of, common logarithm, and natural logarithm, respectively.
arctan expr
(arctan x y)
sin expr
cos expr
tan expr
- The usual trig functions. Angles are in degrees.
radarctan expr
(radarctan x y)
radsin expr
radcos expr
radtan expr
- The usual trig functions. Angles are in radians.
iseq first last
- Outputs a list with integers from first to last, inclusive
- show iseq 1 10
rseq first last count
- Outputs a list of count numbers from first to last, inclusive
- show rseq 1 9 5
4.2 Numeric Predicates
lessp expr expr
less? expr expr
expr < expr
greaterp expr expr
greater? expr expr
expr > expr
lessequalp expr expr
lessequal? expr expr
expr <= expr
greaterequalp expr expr
greaterequal? expr expr
expr >= expr
- Less than, greater than, less than or equal to, greater than or equal to,
respectively. Inputs are numbers or numeric expressions, output is 1 (true) or 0 (false).
4.3 Random Numbers
random expr
(random start end)
- Outputs a random number from 0 through one less than expr, or from start to end inclusive.
- show random 10
- show (random 1 6)
rerandom
- (
rerandom expr)
- Reseeds the random number generator, either to a fixed value or the specified seed.
4.4 Print Formatting
form expr width precision
- Outputs a formatted string with the result of a numeric expression with precision decimal places and
padded on the left with spaces (if necessary) to be at least width characters long.
- show form 1/3 10 3
4.5 Bitwise Operations
bitand expr expr
(bitand expr ...)
bitor expr expr
(bitor expr ...)
bitxor expr expr
(bitxor expr ...)
bitnot expr
- Bitwise and, or, exclusive-or, and not, respectively.
ashift expr bitcount
- Arithmetic bit shift. If bitcount is negative, shifts to the right, preserving sign.
lshift expr bitcount
- Logical bit shift. If bitcount is negative, shifts to the right, zero-filling.
5. Logical Operations
true
- Outputs 1
false
- Outputs 0
and expr expr
(and expr ...)
or expr expr
(or expr ...)
xor expr expr
(xor expr ...)
not expr
- Logical "and", "or", "exclusive-or", and "not", respectively.
Inputs are numbers or numeric expressions, output is 1 (true) or 0 (false).
6. People and Movement
An introduction to KORO Geometry.
6.0 Heights, Directions and Distances
6.1 Limb Motion
left limb height [direction] [distance]
lt limb height [direction] [distance]
- Position a left side limb to the given height, direction and distance
- left wrist up
right limb height [direction] [distance]
rt limb height [direction] [distance]
- Position a left side limb to the given height, direction and distance
- right wrist up
both limb height [direction] [distance]
bh limb height [direction] [distance]
- Position both given limbs to the given height, direction and distance
- both wrists up
hand height [direction] [distance]
head height [direction] [distance]
hd height [direction] [distance]
- Orient the head to the given height, direction and distance
- head up
setpos [ expr expr expr ]
setxy expr expr
setx expr
sety expr
setz expr
- Move to the specified location
- setpos [ 100 -100 ]
- setxy -100 100
setheading expr
seth expr
- Rotate the turtle to the specified heading
- setheading 45
6.2 Motion Queries
pos
xcor
ycor
zcor
- Outputs the current position as [ x y z ], x, y or z respectively
- show pos
heading
- Outputs the current heading
- show heading
towards [ expr expr ]
- Outputs the heading towards the specified [ x y ] coordinates
- show towards [ 0 0 ]
s
7. Workspace Management
7.1 Procedure Definition
to procname inputs ... statements ... end
- Define a new named procedure. Inputs can be:
- Required:
:a :b
- Optional (with default values):
[:c 5] [:d 7]
- Rest (remaining inputs as a list):
[:r]
- Default number of inputs:
3
- to star :n repeat 5 [ fd :n rt 144 ] end
define procname [[inputs ...][statements ...]]
- Define a new named procedure with optional inputs
- define "star [[n][repeat 5 [fd :n rt 144]]]
def procname
- Outputs the definition of a named procedure as a string
- show def "star
text procname
- Outputs the definition of a named procedure as a list, suitable for use with
DEFINE
- show text "star
copydef newname oldname
- Copy a procedure. If a procedure newname already existed it will
be overridden. Primitive procedures can't be overridden unless
REDEFP is TRUE.
- copydef "new "old
7.2 Variable Definition
make varname expr
- Update a variable or define a new global variable. The variable name must
be quoted
- make "myvar 5
name expr varname
- Like
make but with the inputs reversed
- name 5 "myvar
local varname
(local varname ...)
- A subsequent
make will create the variable(s) in the local scope instead of the global scope
- local "myvar
localmake varname expr
- Define a variable in the local scope (shortcut for
local then make
- localmake "myvar 5
thing varname
- Outputs the value of variable.
:foo is a shortcut for thing "foo
- show thing "myvar
global varname
- Reserve the variable at the global scope. This doesn't do anything useful.
- global "myvar
7.3 Property Lists
pprop plistname propname value
- Set the property propname in the property list plistname to value value.
gprop plistname propname
- Get the value of the property propname in the property list plistname, or the empty list
if no such property.
remprop plistname propname
- Remove the property propname in the property list plistname.
plist plistname
- Return a list of properties in the property list plistname, alternating property name, property
value.
7.4 Workspace Predicates
Predicates return 1 (true) or 0 (false)
procedurep name
procedure? name
- Test if there is a procedure with the given name.
primitivep name
primitive? name
- Test if there is a built-in procedure with the given name.
definedp name
defined? name
- Test if there is a user-defined procedure with the given name.
namep name
name? name
- Test if there is a variable with the given name.
plistp name
plist? name
- Test if there is a property list with the given name.
7.5 Workspace Queries
contents
- Outputs a list with three members. The first is a list of user-defined procedure names.
The second is a list of defined variables. The third is a list of non-empty property list names.
Only non-buried procedures, variables, and property lists are included.
buried
- Outputs a list with three members. The first is a list of user-defined procedure names
The second is a list of defined variables. The third is a list of non-empty property list names.
Only buried procedures, variables, and property lists are included.
procedures
- Outputs a list of user-defined non-buried procedure names.
primitives
- Outputs a list of primitive non-buried procedure names.
globals
- Outputs a list of defined non-buried global variables.
names
- Outputs a list with two members. The first is an empty list.
The second is a list of defined non-buried variables.
plists
- Outputs a list with three members. The first is an empty list.
The second is an empty list. The third is a list of non-empty non-buried property list names.
namelist name
namelist namelist
- Return a
contents-style list with the given variable names.
pllist plname
pllist plnamelist
- Return a
contents-style list with the given property lists.
arity procname
- Return a list with the procedure's minimum, default, and maximum
number of inputs; maximum is -1 if unlimited.
7.7 Workspace Control
erase contentslist
- Takes a three member list, where the first is a list of user-defined procedure names to erase,
the second is a list of defined variables to erase, the third is a list of property lists to erase.
Primitive procedures can't be erased unless
REDEFP is TRUE.
- erase [ [myproc] [myvar] [] ]
erall
- Erase all non-buried user-defined procedures, variables and property lists.
erps
- Erase all non-buried user-defined procedures.
erns
- Erase all non-buried variables.
erpls
- Erase all non-buried property lists.
ern varname
ern varnamelist
- Erase the named variable(s).
epl plname
epl plnamelist
- Erase the named property list(s).
bury contentslist
- Takes a three member list, where the first is a list of user-defined procedure names to bury,
the second is a list of defined variables to bury, the third is a list of property lists to bury.
buryall
- Bury all user-defined procedures, variables, and property lists.
buryname varname
buryname varnamelist
- Bury the given variable (or list of variables).
unbury contentslist
- Takes a three member list, where the first is a list of user-defined procedure names to unbury,
the second is a list of defined variables to unbury, the third is a list of property lists to unbury.
unburyall
- Unbury all user-defined procedures, variables, and property lists.
unburyname varname
unburyname varnamelist
- Unbury the given variable (or list of variables).
buriedp contentslist
buried? contentslist
- Return 1 if the first named user-defined procedure, variable, or property list exists and
is buried, 0 otherwise.
8. Control Structures
8.1 Control
run [ statements ... ]
- Run the specified statements once
- run [ fd 100 rt 90 ]
runresult [ statements ... ]
- Run the specified statements once. If the statements return a value, the result is a
list with the value as a single member. Otherwise, the result is an empty list.
repeat expr [ statements ... ]
- Repeat statements expr times
- repeat 4 [ fd 100 rt 90 ]
forever [ statements ... ]
- Repeat statements forever. Used inside a user-defined procedure
that terminates with
output, stop or bye
- forever [ make "n random 100 show :n if :n == 0 [ bye ] ]
repcount
#
- Outputs the current iteration number of the current
repeat or forever
- repeat 10 [ show repcount ]
- repeat 10 [ show # ]
if expr [ statements ... ]
if [expr] [ statements ... ]
- Execute statements if the expression is non-zero
- if 2 > 1 [ show "yep ]
ifelse expr [ statements ... ] [ statements ... ]
ifelse [expr] [ statements ... ] [ statements ... ]
- Execute first set of statements if the expression is non-zero, otherwise execute the second set
- ifelse 1 > 2 [ show "yep ] [ show "nope ]
test expr
test [expr]
- Test the specified expression, save the result in the local scope for subsequent use by
iftrue or
iffalse
iftrue [ statements ...]
ift [ statements ...]
iffalse [ statements ...]
iff [ statements ...]
- Run the statements if the result of the last local
test was non-zero (true) or zero (false)
respectively.
- test 1 > 2 iftrue [ show "yep ] iffalse [ show "nope ]
stop
- End the running procedure with no output value.
output expr
op expr
- End the running procedure and output the specified value.
catch tag instructionlist
- Run instructions, but if an error with matching tag is thrown, return the thrown value (if any).
Use
"ERROR to catch errors from regular procedures.
- catch "t [ show "before throw "t show "after ]
- catch "error [ show 1 / 0 ] show error
throw tag
(throw tag value)
- Throw an error with the given tag which may be caught. An optional return value can be passed.
- show catch "t [ show "hello (throw "t "world) ]
error
- Outputs a list describing the last error caught:
an error number, an error message message, and the procedure name where the error occurred.
- catch "error [ show 1 / 0 ] show error
wait time
- Pauses execution. time is in 60ths of a second.
bye
- Terminate the program
.maybeoutput expr
- Like
output if expr returns a value, like stop otherwise
ignore expr
- Evaluate and ignore results of the expression
- make "q [ 1 2 3 ] ignore dequeue "q
` list
- Outputs the list with substitutions:
, instructionlist replaced by output
,@ instructionlist replaced by output list members
",instruction replaced by output prefixed with "
,@instruction replaced by output prefixed with :
- show `[a b ,[bf [c d e]] f ,@[bf [g h i]]]
- make "v "x show `[",:v :,:v]
for controllist [ statements ...]
- Typical
for loop. The controllist specifies three or four members:
the local varname, start value, limit value,
and optional step size.
- for [ a 1 10 ] [ show :a ]
- for [ a 0 20 2 ] [ show :a ]
dotimes [varname times] [ statements ...
- Run the statements the specified number of times. The variable
varname is set to the current iteration number.
- dotimes [ i 5 ] [ show :i * :i ]
do.while [ statements ...] expr
do.while [ statements ...] [expr]
- Runs the specified statements at least once, and repeats while the expression is non-zero (true).
- do.while [ make "a random 10 show :a ] :a < 8
while expr [ statements ...]
while [expr] [ statements ...]
- Runs the specified statements only while the expression remains non-zero (true).
- while (random 2) = 0 [ show "zero ] show "one
do.until [ statements ...] expr
do.until [ statements ...] [expr]
- Runs the specified statements at least once, and repeats while the expression is zero (false).
- do.until [ make "a random 10 show :a ] :a < 8
until expr [ statements ...]
until [expr] [ statements ...]
- Runs the specified statements only while the expression remains zero (false).
- until (random 2) = 0 [ show "one ] show "zero
case value [ clauses ... ]
- For each clause in order:
If the clause is of the form
[ ELSE expr ]
then expr is evaluated and returned.
Otherwise, if the clause is of the form [ [ matches ] expr ]
and value is a member of matches
then expr is evaluated and returned.
- show case :var [ [ ["a] "AAA ] [ ["b] "BBB ] [ else "other ] ]
cond [ clauses ... ]
- For each clause in order:
If the clause is of the form
[ ELSE expr ]
then expr is evaluated and returned.
Otherwise, if the clause is of the form [ [ expr1 ] expr2 ]
and expr1 evaluates to non-zero (true) then expr2 is evaluated and returned.
- show cond [ [ [:var = 1] "one] [ [:var = 2] "two] [ else "other ] ]
8.2 Template-based Iteration
These higher-level procedures support only the named procedure form of template.
The first input is the name of a procedure to call.
apply procname list
- Call procname with the members of list as inputs
invoke procname input1
(invoke procname input1 ...)
- Call procname with the specified inputs as inputs
- invoke "show "hello
foreach list procname
- call procname for each item in the list
- foreach [1 2 3] "show
map procname list
- Outputs a list composed of the results of calling procname for each item in the list
- to double :n output :n * 2 end show map "double [1 2 3]
filter procname list
- Outputs a list composed of the input list where procname called on the item returns non-zero (true)
- to oddp :n output bitand :n 1 end show filter "oddp [ 1 2 3 4 5 ]
find procname list
- Outputs the first item in list for which calling procname on it returns non-zero (true).
If not found, the empty list is returned.
- to oddp :n output bitand :n 1 end show find "oddp [ 2 8 4 7 10 9 ]
reduce procname list
(reduce procname list initial)
- Call procname repeatedly with two inputs - the current value and the next list item. If
initial is not specified, the first list element is used instead.
- show reduce "sum [ 1 2 3 4 5 ]
crossmap procname listlist
(crossmap procname list list ...)
- Call procname repeatedly with inputs from the lists, in all possible combinations.
- show crossmap "word [[a b] [x y]]
- show (crossmap "word [a b c] [1 2 3 4])