Lambda fixes - added alien input

matthew.willis 2006-08-23 23:05:25 +00:00
parent 850c5705fd
commit 2710626ca8
5 changed files with 34 additions and 22 deletions

View File

@ -15,18 +15,21 @@ IN: lambda
0 lfrom 26 swap ltake list>array 0 lfrom 26 swap ltake list>array
[ [
[ ":" , dup 65 + ch>string , " " , number>string , ] { } make concat [ ":" , 65 + dup ch>string , " " , number>string , ] { } make concat
] map append ] map append
{ {
":LF 10" ":LF 10"
":FALSE (t.(f.f))" ":FALSE (t.(f.f))"
":TRUE (t.(f.t))" ":TRUE (t.(f.t))"
":AND (p.(q.((p q) FALSE)))"
":OR (p.(q.((p TRUE) q)))"
":ISZERO (num.((num (pred. FALSE)) TRUE))" ":ISZERO (num.((num (pred. FALSE)) TRUE))"
":ADD (num.(other.((num SUCC) other)))" ":ADD (num.(other.((num SUCC) other)))"
":MULT (num.(other.((num (ADD other)) 0)))" ":MULT (num.(other.((num (ADD other)) 0)))"
":PRED (n.(f.(x.(((n (g.(h.(h(g f))))) (u. x)) (u.u)))))" ":PRED (n.(f.(x.(((n (g.(h.(h(g f))))) (u. x)) (u.u)))))"
":SUBFROM (num.(other.((num PRED) other)))" ":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))))))" ":FACT (fact.(num.(((ISZERO num) 1) ((MULT num) (fact (PRED num))))))"
":YCOMBINATOR (func.((y. (func (y y)))(y. (func (y y)))))" ":YCOMBINATOR (func.((y. (func (y y)))(y. (func (y y)))))"
":FACTORIAL (YCOMBINATOR FACT)" ":FACTORIAL (YCOMBINATOR FACT)"
@ -36,13 +39,12 @@ IN: lambda
":PCONS (pcons.(num.(cons.(((ISZERO num) (PRINTSPECIAL LF)) ((PRINTCHAR (CAR cons)) ((pcons (PRED num)) (CDR cons)))))))" ":PCONS (pcons.(num.(cons.(((ISZERO num) (PRINTSPECIAL LF)) ((PRINTCHAR (CAR cons)) ((pcons (PRED num)) (CDR cons)))))))"
":PRINTCONS (YCOMBINATOR PCONS)" ":PRINTCONS (YCOMBINATOR PCONS)"
":NUMTOCHAR (num. ((ADD 48) num))" ":NUMTOCHAR (num. ((ADD 48) num))"
":ALPHATOCHAR (num. ((ADD 65) num))" ":PRINTNUM (num.(PRINTCHAR (NUMTOCHAR num)))"
":PRINTNUM (num.([PRINTCHAR] (ALIENNUM (NUMTOCHAR num))))" ":PRINTCHAR (char.([PRINTCHAR] (ALIENNUM char)))"
":PRINTCHAR (char.([PRINTCHAR] (ALIENNUM (ALPHATOCHAR char))))"
":PRINTSPECIAL (special.([PRINTCHAR] (ALIENNUM special)))" ":PRINTSPECIAL (special.([PRINTCHAR] (ALIENNUM special)))"
":ALIEN0 alienbaseonenum" ":ALIEN0 alienbaseonenum"
":ALIENNUM (num.((num [ALIENSUCC]) ALIEN0))" ":ALIENNUM (num.((num [ALIENSUCC]) ALIEN0))"
":HELLOCONS ((CONS H) ((CONS E) ((CONS Y) nil)))" ":HELLOCONS ((CONS H) ((CONS E) ((CONS Y) ((CONS 0) nil))))"
":HELLO ((PRINTCONS 3) HELLOCONS)" ":HELLO ((PRINTCONS 3) HELLOCONS)"
"(([HELLO] nil) ([INFO] nil))" "(([HELLO] nil) ([INFO] nil))"
} append ; } append ;
@ -59,7 +61,18 @@ IN: lambda
: ALIENSUCC ( node -- node ) : ALIENSUCC ( node -- node )
variable-node-var "a" append <variable-node> ; variable-node-var "a" append <variable-node> ;
: ALIENPRED ( node -- node )
variable-node-var dup length 1 - swap remove-nth <variable-node> ;
: ALIENISZERO ( node -- node )
;
: PRINTCHAR ( node -- node ) : PRINTCHAR ( node -- node )
#! takes a base one num and prints its char equivalent #! takes a base one num and prints its char equivalent
variable-node-var length "alienbaseonenum" length - ch>string print-return ; variable-node-var length "alienbaseonenum" length - ch>string print-return ;
: READCHAR ( node -- node )
#! reads one character of input and stores it as a base one num
"alienbaseonenum" read1 [ "a" append ] times <variable-node> ;

View File

@ -3,4 +3,9 @@ Lambda TODO
Documentation Documentation
Unit tests Unit tests
More graceful parse error handling More graceful parse error handling
Factor out tree traversing into its own lib Factor out tree traversing into its own lib
Core
----
ISNIL
READCHAR

View File

@ -1,3 +1,4 @@
REQUIRES: lazy-lists parser-combinators ;
PROVIDE: lambda { PROVIDE: lambda {
"nodes.factor" "nodes.factor"
"parser.factor" "parser.factor"

View File

@ -1,13 +1,11 @@
#! A lambda expression manipulator, by Matthew Willis #! A lambda expression manipulator, by Matthew Willis
REQUIRES: lazy-lists ;
USING: lazy-lists strings arrays hashtables USING: lazy-lists strings arrays hashtables
sequences namespaces words parser kernel ; sequences namespaces words parser kernel ;
IN: kernel
: dip swap slip ; inline
IN: lambda IN: lambda
: dip swap slip ; inline
TUPLE: lambda-node expr original canonical ; TUPLE: lambda-node expr original canonical ;
TUPLE: apply-node func arg ; TUPLE: apply-node func arg ;
TUPLE: variable-node var ; TUPLE: variable-node var ;
@ -29,18 +27,18 @@ GENERIC: (traverse)
swap second execute ; swap second execute ;
#! Traverses the tree while executing pre and post order words #! Traverses the tree while executing pre and post order words
M: lambda-node (traverse) ( data-array word lambda-node -- node ) M: lambda-node (traverse) ( data-array words lambda-node -- node )
(pre) (pre)
[ [ lambda-node-expr (traverse) ] keep set-lambda-node-expr ] 3keep [ [ lambda-node-expr (traverse) ] keep set-lambda-node-expr ] 3keep
(post) ; (post) ;
M: apply-node (traverse) ( data-array word apply-node -- node ) M: apply-node (traverse) ( data-array words apply-node -- node )
(pre) (pre)
[ [ apply-node-func (traverse) ] keep set-apply-node-func ] 3keep [ [ apply-node-func (traverse) ] keep set-apply-node-func ] 3keep
[ [ apply-node-arg (traverse) ] keep set-apply-node-arg ] 3keep [ [ apply-node-arg (traverse) ] keep set-apply-node-arg ] 3keep
(post) ; (post) ;
M: variable-node (traverse) ( data-array word variable-node -- node ) M: variable-node (traverse) ( data-array words variable-node -- node )
(pre) (post) ; (pre) (post) ;
M: alien-node (traverse) ( data-array word alien-node -- node ) nip nip ; M: alien-node (traverse) ( data-array word alien-node -- node ) nip nip ;
@ -48,13 +46,11 @@ M: alien-node (traverse) ( data-array word alien-node -- node ) nip nip ;
: traverse ( node data-array {pre,post} -- node ) : traverse ( node data-array {pre,post} -- node )
rot (traverse) ; rot (traverse) ;
: traverse-nop ( data-array node -- node ) nip ;
: pre-order ( node data-array word -- node ) : pre-order ( node data-array word -- node )
{ traverse-nop } curry traverse ; { nip } curry traverse ;
: post-order ( node data-array word -- node ) : post-order ( node data-array word -- node )
{ traverse-nop } swap add traverse ; { nip } swap add traverse ;
GENERIC: (clone-pre) GENERIC: (clone-pre)
M: lambda-node (clone-pre) ( data lambda-node -- node ) M: lambda-node (clone-pre) ( data lambda-node -- node )
@ -71,9 +67,9 @@ M: lambda-node (clone-post) ( data lambda-node -- node )
nip [ dup <variable-node> -rot lambda-node-expr substitute ] keep nip [ dup <variable-node> -rot lambda-node-expr substitute ] keep
[ set-lambda-node-expr ] keep ; [ set-lambda-node-expr ] keep ;
M: apply-node (clone-post) ( data apply-node -- node ) traverse-nop ; M: apply-node (clone-post) ( data apply-node -- node ) nip ;
M: variable-node (clone-post) ( data variable-node -- node ) traverse-nop ; M: variable-node (clone-post) ( data variable-node -- node ) nip ;
: clone-node ( node -- clone ) : clone-node ( node -- clone )
f { (clone-pre) (clone-post) } traverse ; f { (clone-pre) (clone-post) } traverse ;

View File

@ -6,8 +6,6 @@
#! <expr> ::= (<expr> <expr>) #! <expr> ::= (<expr> <expr>)
#! <line> ::= <expr> #! <line> ::= <expr>
#! <line> ::= <name> : <expr> #! <line> ::= <name> : <expr>
REQUIRES: parser-combinators ;
USING: parser-combinators strings sequences kernel ; USING: parser-combinators strings sequences kernel ;
IN: lambda IN: lambda
@ -69,5 +67,4 @@ DEFER: <expr>
<|> "." token <name> &> f succeed <&> <|> ; <|> "." token <name> &> f succeed <&> <|> ;
: lambda-parse : lambda-parse
#! debug word to parse this <expr> and print the result
<line> some call ; <line> some call ;