2006-08-06 20:31:29 -04:00
|
|
|
#! An interpreter for lambda expressions, by Matthew Willis
|
2006-08-09 01:57:56 -04:00
|
|
|
REQUIRES: lazy-lists ;
|
2006-08-17 01:27:21 -04:00
|
|
|
USING: lazy-lists io strings hashtables sequences namespaces kernel ;
|
2006-08-06 20:31:29 -04:00
|
|
|
IN: lambda
|
|
|
|
|
2006-08-17 01:27:21 -04:00
|
|
|
: bound-vars ( -- lazy-list ) 65 lfrom [ ch>string ] lmap ;
|
2006-08-06 20:31:29 -04:00
|
|
|
|
2006-08-19 21:18:14 -04:00
|
|
|
: canonical-string ( expr -- string )
|
|
|
|
#! pretty print in canonical form, for use with reverse lookups
|
2006-08-17 01:27:21 -04:00
|
|
|
bound-vars swap expr>string ;
|
2006-08-06 20:31:29 -04:00
|
|
|
|
2006-08-19 21:18:14 -04:00
|
|
|
: original-string ( expr -- string )
|
|
|
|
#! pretty print with vars named as inputed
|
|
|
|
nil swap expr>string ;
|
2006-08-06 20:31:29 -04:00
|
|
|
|
2006-08-19 21:18:14 -04:00
|
|
|
: lambda-print ( names expr/name -- names )
|
|
|
|
dup string? [ over dupd hash original-string " " swap
|
|
|
|
append append "DEF " swap append
|
|
|
|
] [ original-string "=> " swap append
|
|
|
|
] if print flush ;
|
2006-08-06 20:31:29 -04:00
|
|
|
|
2006-08-19 21:18:14 -04:00
|
|
|
: lambda-eval ( names parse-result -- names name/expr )
|
|
|
|
#! Make sure not to evaluate definitions.
|
|
|
|
first2 over [
|
|
|
|
swap rot [ set-hash ] 2keep swap
|
|
|
|
] [
|
|
|
|
pick swap replace-names swap drop evaluate
|
|
|
|
] if ;
|
2006-08-06 20:31:29 -04:00
|
|
|
|
2006-08-17 01:27:21 -04:00
|
|
|
: lambda-boot ( -- names )
|
|
|
|
#! load the core lambda library
|
2006-08-21 00:35:06 -04:00
|
|
|
H{ } clone dup lambda-core
|
|
|
|
[ lambda-parse lambda-eval lambda-print drop ] each-with ;
|
2006-08-06 20:31:29 -04:00
|
|
|
|
2006-08-17 01:27:21 -04:00
|
|
|
: (lambda) ( names -- names )
|
2006-08-19 21:18:14 -04:00
|
|
|
readln dup "." = [ drop ] [
|
|
|
|
lambda-parse lambda-eval lambda-print (lambda)
|
|
|
|
] if ;
|
2006-08-06 20:31:29 -04:00
|
|
|
|
2006-08-17 01:27:21 -04:00
|
|
|
: lambda ( -- names )
|
|
|
|
lambda-boot (lambda) ;
|