2 USING: kernel words namespaces combinators math
3 quotations strings arrays hashtables sequences
4 namespaces.lib rewrite-closures ;
8 ! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
10 : && ( obj seq -- ? ) [ call ] with all? ;
12 ! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
18 : quote-exp? ( exp -- ? ) { [ array? ] [ length 2 = ] [ first quote = ] } && ;
20 : eval-quote ( exp -- val ) second ;
22 ! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
24 : eval-symbol ( exp -- val ) get ;
26 ! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
30 ! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
36 : begin-exp? ( exp -- ? ) { [ array? ] [ length 2 >= ] [ first begin = ] } && ;
38 : eval-begin ( exp -- val ) 1 tail dup peek >r 1 head* [ eval ] each r> eval ;
40 ! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
42 ! (omega parameters ...)
46 : omega-exp? ( exp -- ? ) { [ array? ] [ length 3 >= ] [ first omega = ] } && ;
48 : eval-omega ( exp -- val )
49 dup second swap 2 tail { begin } swap append [ eval ] curry lambda ;
51 ! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
53 ! (let ((var val) ...) exp ...)
57 : let-exp? ( exp -- ? ) { [ array? ] [ length 2 >= ] [ first let = ] } && ;
59 : eval-let ( exp -- val )
60 dup >r second [ second ] map r>
61 dup 2 tail swap second [ first ] map add* omega add* add* eval ;
63 ! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
65 ! (df name (param ...) exp ...)
69 : df-exp? ( exp -- ? ) { [ array? ] [ length 3 >= ] [ first df = ] } && ;
71 : eval-df ( exp -- val ) dup 2 tail omega add* eval swap second tuck set ;
73 ! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
79 : dv-exp? ( exp -- ? ) { [ array? ] [ length 3 = ] [ first dv = ] } && ;
81 : eval-dv ( exp -- val ) dup >r third eval r> second set ;
83 ! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
89 : set!-exp? ( exp -- ? ) { [ array? ] [ length 3 = ] [ first set! = ] } && ;
91 : eval-set! ( exp -- val ) dup >r third eval r> second set* ;
93 ! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
95 ! (dyn (param ...) exp ...)
99 : dyn-exp? ( exp -- ? ) { [ array? ] [ length 3 >= ] [ first dyn = ] } && ;
101 : eval-dyn ( exp -- val )
102 dup second swap 2 tail begin add* [ eval ] curry parametric-quot scoped-quot ;
104 ! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
106 ! (dy name (param ...) exp ...)
110 : dy-exp? ( exp -- ? ) { [ array? ] [ length 3 >= ] [ first dy = ] } && ;
112 : eval-dy ( exp -- val ) dup 2 tail dyn add* eval swap second tuck set ;
114 ! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
116 ! : eval-list ( exp -- val )
117 ! [ eval ] map unclip >r [ ] each r>
118 ! { { [ dup quotation? ] [ call ] }
119 ! { [ dup word? ] [ execute ] } }
122 : eval-list ( exp -- val )
123 unclip eval >r [ eval ] each r>
124 { { [ dup quotation? ] [ call ] }
125 { [ dup word? ] [ execute ] } }
128 ! should probably be:
130 ! : eval-list ( exp -- val )
131 ! unclip >r [ eval ] each r> eval
132 ! { { [ dup quotation? ] [ call ] }
133 ! { [ dup word? ] [ execute ] } }
136 ! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
138 : eval ( exp -- val )
139 { { [ dup t eq? ] [ ] }
140 { [ dup f eq? ] [ ] }
141 { [ dup number? ] [ ] }
142 { [ dup string? ] [ ] }
143 { [ dup quotation? ] [ ] }
144 { [ dup hashtable? ] [ ] }
145 { [ dup quote-exp? ] [ eval-quote ] }
146 { [ dup begin-exp? ] [ eval-begin ] }
147 { [ dup omega-exp? ] [ eval-omega ] }
148 { [ dup let-exp? ] [ eval-let ] }
149 { [ dup df-exp? ] [ eval-df ] }
150 { [ dup dv-exp? ] [ eval-dv ] }
151 { [ dup set!-exp? ] [ eval-set! ] }
152 { [ dup dyn-exp? ] [ eval-dyn ] }
153 { [ dup dy-exp? ] [ eval-dy ] }
154 { [ dup symbol? ] [ eval-symbol ] }
155 { [ dup word? ] [ ] }
156 { [ dup array? ] [ eval-list ] }
159 ! : eval-quot-call ( exp -- val ) [ eval ] map unclip >r [ ] each r> call ;
161 ! : eval-word-call ( exp -- val ) [ eval ] map unclip >r [ ] each r> execute ;
163 ! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!