R> drop ['] eval goto-deferred \ Tail call optimization
endof
- except-message: ." object not applicable." recoverable-exception throw
+ except-message: ." object '" drop print ." ' not applicable." recoverable-exception throw
endcase
;
-( Simply evaluates the given procedure with expbody as its argument. )
-: macro-expand ( proc expbody -- result )
- 2swap
- 2dup procedure-body ( expbody proc procbody )
- -2rot 2dup procedure-params ( procbody expbody proc argnames )
- -2rot procedure-env ( procbody argnames expbody procenv )
-
- -2rot 2swap
- flatten-proc-args
- 2swap 2rot
-
- extend-env eval-sequence eval
-;
-
:noname ( obj env -- result )
2swap
2over 2over ( env exp env exp )
operator ( env exp env opname )
- 2dup lookup-macro nil? false = if
- \ Macro function evaluation
+ 2swap eval ( env exp proc )
- ( env exp env opname mproc )
- 2swap 2drop -2rot 2drop cdr ( env mproc body )
+ -2rot ( proc env exp )
+ operands 2swap ( proc operands env )
+ list-of-vals ( proc argvals )
- macro-expand
+ apply
+ exit
+ then
- 2swap
- ['] eval goto-deferred
- else
- \ Regular function application
+ except-message: ." tried to evaluate object with unknown type." recoverable-exception throw
+; is eval
+
+\ }}}
+
+\ ---- Macro Expansion ---- {{{
+
+( Simply evaluates the given procedure with expbody as its argument. )
+: macro-eval ( proc expbody -- result )
+ 2swap
+ 2dup procedure-body ( expbody proc procbody )
+ -2rot 2dup procedure-params ( procbody expbody proc argnames )
+ -2rot procedure-env ( procbody argnames expbody procenv )
+
+ -2rot 2swap
+ flatten-proc-args
+ 2swap 2rot
- 2drop ( env exp env opname )
+ extend-env eval-sequence eval
+;
- 2swap eval ( env exp proc )
+:noname ( exp -- result )
- -2rot ( proc env exp )
- operands 2swap ( proc operands env )
- list-of-vals ( proc argvals )
+ quasiquote? if expand-quasiquote exit then
- apply
- exit
- then
- then
+ definition? if expand-definition exit then
- except-message: ." tried to evaluate object with unknown type." recoverable-exception throw
-; is eval
+ assignment? if expand-assignment exit then
+
+ macro-definition? if expand-define-macro exit then
+
+ if? if expand-if exit then
+
+ lambda? if expand-lambda exit then
+
+ begin? if expand-sequence exit then
+
+ application? if expand-apply exit then
+
+; is expand
\ }}}
2swap 2drop ( port obj )
+ expand
+
global-env obj@ eval ( port res )
again
;
include scheme-primitives.4th
- s" scheme-library.scm" load 2drop
+\ s" scheme-library.scm" load 2drop
\ }}}
true exit
then
+ expand
+
global-env obj@ eval
fg cyan ." ; " print reset-term
enable-gc
\ Display welcome message
- welcome-symbol nil cons global-env obj@ eval 2drop
+ \ welcome-symbol nil cons global-env obj@ eval 2drop
begin
['] repl-body catch