79 lines
2.7 KiB
Factor
79 lines
2.7 KiB
Factor
USING: arrays lazy-lists io strings sequences math namespaces
|
|
kernel ;
|
|
IN: lambda
|
|
|
|
: lambda-core ( -- expr-string-array )
|
|
{
|
|
":0 (one.(zero.zero))"
|
|
":SUCC (num.(one.(zero.(one((num one) zero)))))"
|
|
}
|
|
|
|
0 lfrom 100 swap ltake list>array
|
|
[
|
|
[ ":" , dup 1 + number>string , " (SUCC " , number>string ,
|
|
")" , ] { } make concat
|
|
] map append
|
|
|
|
0 lfrom 26 swap ltake list>array
|
|
[
|
|
[ ":" , 65 + dup 1string , " " , number>string , ] { } make concat
|
|
] map append
|
|
|
|
{
|
|
":LF 10"
|
|
":FALSE (t.(f.f))"
|
|
":TRUE (t.(f.t))"
|
|
":AND (p.(q.((p q) FALSE)))"
|
|
":OR (p.(q.((p TRUE) q)))"
|
|
":ISZERO (num.((num (pred. FALSE)) TRUE))"
|
|
":ADD (num.(other.((num SUCC) other)))"
|
|
":MULT (num.(other.((num (ADD other)) 0)))"
|
|
":PRED (n.(f.(x.(((n (g.(h.(h(g f))))) (u. x)) (u.u)))))"
|
|
":SUBFROM (num.(other.((num PRED) other)))"
|
|
":EQUAL (num.(other.((AND (ISZERO ((SUBFROM num) other))) (ISZERO ((SUBFROM other) num)))))"
|
|
":FACT (fact.(num.(((ISZERO num) 1) ((MULT num) (fact (PRED num))))))"
|
|
":YCOMBINATOR (func.((y. (func (y y)))(y. (func (y y)))))"
|
|
":FACTORIAL (YCOMBINATOR FACT)"
|
|
":CONS (car.(cdr.(which.((which car) cdr))))"
|
|
":CAR (cons.(cons TRUE))"
|
|
":CDR (cons.(cons FALSE))"
|
|
":PCONS (pcons.(num.(cons.(((ISZERO num) (PRINTSPECIAL LF)) ((PRINTCHAR (CAR cons)) ((pcons (PRED num)) (CDR cons)))))))"
|
|
":PRINTCONS (YCOMBINATOR PCONS)"
|
|
":NUMTOCHAR (num. ((ADD 48) num))"
|
|
":PRINTNUM (num.(PRINTCHAR (NUMTOCHAR num)))"
|
|
":PRINTCHAR (char.([PRINTCHAR] (ALIENNUM char)))"
|
|
":PRINTSPECIAL (special.([PRINTCHAR] (ALIENNUM special)))"
|
|
":ALIEN0 alienbaseonenum"
|
|
":ALIENNUM (num.((num [ALIENSUCC]) ALIEN0))"
|
|
":HELLOCONS ((CONS H) ((CONS E) ((CONS Y) ((CONS 0) nil))))"
|
|
":HELLO ((PRINTCONS 3) HELLOCONS)"
|
|
"(([HELLO] nil) ([INFO] nil))"
|
|
} append ;
|
|
|
|
: print-return ( -- node )
|
|
write "(nil.nil)" lambda-parse second ;
|
|
|
|
: HELLO ( node -- node )
|
|
drop "\nHello and Welcome to Lambda!\n" print-return ;
|
|
|
|
: INFO ( node -- node )
|
|
drop "Type HELLO and wait 10 seconds to see me flex my io muscles.\n" print-return ;
|
|
|
|
: ALIENSUCC ( node -- node )
|
|
var-node-name "a" append <var-node> ;
|
|
|
|
: ALIENPRED ( node -- node )
|
|
var-node-name 1 tail <var-node> ;
|
|
|
|
: ALIENISZERO ( node -- node )
|
|
;
|
|
|
|
: PRINTCHAR ( node -- node )
|
|
#! takes a base one num and prints its char equivalent
|
|
var-node-name length "alienbaseonenum" length - 1string print-return ;
|
|
|
|
: READCHAR ( node -- node )
|
|
#! reads one character of input and stores it as a base one num
|
|
"alienbaseonenum" read1 "a" <array> >string <var-node> ;
|
|
|
|
|