1 ! Copyright (C) 2007, 2008 Slava Pestov, Eduardo Cavazos.
2 ! See http://factorcode.org/license.txt for BSD license.
3 USING: accessors combinators kernel sequences words ;
6 TUPLE: lambda vars body ;
10 TUPLE: binding-form bindings body ;
12 TUPLE: let < binding-form ;
16 TUPLE: let* < binding-form ;
20 TUPLE: wlet < binding-form ;
28 : unquote ( quote -- local ) dup quote? [ local>> ] when ; inline
34 PREDICATE: local < word "local?" word-prop ;
36 : <local> ( name -- word )
37 #! Create a local variable identifier
39 dup t "local?" set-word-prop ;
41 PREDICATE: local-word < word "local-word?" word-prop ;
43 : <local-word> ( name -- word )
44 f <word> dup t "local-word?" set-word-prop ;
46 PREDICATE: local-reader < word "local-reader?" word-prop ;
48 : <local-reader> ( name -- word )
50 dup t "local-reader?" set-word-prop ;
52 PREDICATE: local-writer < word "local-writer?" word-prop ;
54 : <local-writer> ( reader -- word )
55 dup name>> "!" append f <word> {
56 [ nip t "local-writer?" set-word-prop ]
57 [ swap "local-reader" set-word-prop ]
58 [ "local-writer" set-word-prop ]
62 UNION: lexical local local-reader local-writer local-word ;
63 UNION: special lexical quote def ;