-
Notifications
You must be signed in to change notification settings - Fork 0
/
notes.txt
114 lines (106 loc) · 2.17 KB
/
notes.txt
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
RESERVED CHARS:
_: placeholder marker during increment
@: extra placeholder
they're not used for anything permanent
num := 0|[1-9][0-9]*
char := [^\]|\n|\\|\u|\a
builtin := quote
| eq?
| if
| c[ad]+r
| args
| c[ad]+r-args
| print
| ...
item := Lnum:num
| "char*
| Bbuiltin
contitem := NEXT num
| CONS num
| DO item
CURRENT num
CONT
contitem
contitem
...
CONTEND
ARGS
num
num
...
ARGEND
HEAP
ITEM num item
ITEM num item
ITEM num item
...
HEAPEND
A function is a list.
To call a function:
- push the args to ARGS
- push a POPARGS continuation
- evaluate the function
builtins:
[X] quote
[X] print
[X] args
[X] c[ad]+r
[X] c[ad]+r-args
[X] cons
[X] if
[X] eq?
[X] str-concat
[X] str-reverse-concat
[X] str-concatl
[X] str-reverse-concatl
[ ] str-uncons
[ ] str-unpack
[X] add
[X] dec
[ ] digit-mul (?)
[ ] lte?
[ ] collect
Plan
How continuations work:
DO:
if current.head is a builtin:
set current to current.tail
... do builtin stuff on current ...
set current to the result
else: (current.head is likely a cons cell)
push current.tail to ARGS
set current to current.head
push POPARGS continuation
Check for repeated POPARGS continuations and simplify
eval current
TAIL value:
push CONS current
if value is nil:
set current to nil
else value is a cons cell:
push TAIL value.tail
set current to value.head
eval current
CONS value:
create new cons cell Lvalue:current
set current to result
POPARGS:
pretty self-explanatory
How eval current works:
if current is a cons cell:
if current.head is Bquote:
set current to current.tail.head
else if current.head is Bif:
set current to current.tail.head
push TAILIF current.tail.tail
goto eval current
else:
push DO
push TAIL current.tail
set current to current.head
goto eval current
else current is not a cons cell:
do nothing
ARGS grows UP
CONT grows UP
HEAP grows UP