Som parse tree (som v1.5)
list
.--.--
. . . .--/
| |
A list is linked dot-pairs. A dot-pair has two fields:
head.tail. The head can be either a dot-pair or an atom.
The tail is a pointer points to list or nil (end of list). An
atom has two fields: type.value. An atom is distinguishable
from a dot-pair because its type field has a small value (0..9), this
value is less than any pointer to dot-pair.
Example of a list of A, B, C (A B C)
atom ::
oper.op
gname.idx lname.idx string.str
num.value
op ::
add sub mul div eq ne lt le gt ge
not band bor bxor mod shl shr
set vec mac fun call mx if ifelse
while for break array case sys
program ::
fun/mac definition
(oper.fun/mac gname.idx e...)
for
(oper.for lv
ex0 ex0 ex)
while
(oper.while ex0 ex)
if
(oper.if ex0 ex)
ifelse
(oper.ifelse ex0 ex
ex)
case
(oper.case ex0 block)
assign
(oper.set var ex)
call/mx
(oper.call/mx gname.idx e...)
block
(oper.block e...)
syscall
(oper.sys num.value e...)
var ::
gname.idx lname.idx
(oper.vec var ex)
Example
to
sort | i j =
for i 0 maxdata-1
for j 0
maxdata-2
if
data[j+1] < data[j]
swap j j+1
(fun sort
(for #1 0 (- 20 1 )
(for #2 0 (-
20 2 )
(if (< (vec data (+ #2 1 ))(vec data #2 ))
(call swap #2 (+ #2 1 )))))))
:
print x = syscall {1 x}
(mac print (sys 1 #1 ))
encoding
encoding of type (0..9)
sp
0 oper 1 num 2 gname 3
lname 4 * 5 string 6
encoding of op
mul
50 div 51 sub
52 add 53 set 54
eq
55 band 56 bor
57 bxor 58 mod 59
not
60 ne 61 lt
62 le 63 shl 64
gt
65 ge 66 shr
67 mac 68 * 69
*
70 vec 71 mx
72 block 73 call 74
fun
75 if 76 ifelse 77
while 78 for 79
break
80 array 81 case 82 *
83 sys 84
24 Feb 2005