28 lines
918 B
Factor
28 lines
918 B
Factor
#! An interpreter for lambda expressions, by Matthew Willis
|
|
USING: io strings hashtables sequences namespaces kernel ;
|
|
IN: lambda
|
|
|
|
: lambda-print ( name/expr -- )
|
|
dup string?
|
|
[ dup lambda-names get hash expr>string " " swap
|
|
append append "DEF " swap append
|
|
] [ expr>string "=> " swap append
|
|
] if print flush ;
|
|
|
|
: lambda-define ( parse-result -- name/expr )
|
|
#! Make sure not to evaluate definitions.
|
|
first2 over [ over lambda-names get set-hash ] [ nip ] if ;
|
|
|
|
: lambda-eval ( name/expr -- name/expr )
|
|
dup string? [ normalize ] unless ;
|
|
|
|
: lambda-boot ( -- )
|
|
#! load the core lambda library
|
|
H{ } clone lambda-names set lambda-core
|
|
[ lambda-parse lambda-define lambda-eval lambda-print ] each ;
|
|
|
|
: lambda ( -- )
|
|
lambda-names get [ lambda-boot ] unless
|
|
readln dup "." = [ drop ] [
|
|
lambda-parse lambda-define lambda-eval lambda-print lambda
|
|
] if ; |