1 ! Copyright (C) 2007, 2009 Slava Pestov, Eduardo Cavazos.
2 ! See http://factorcode.org/license.txt for BSD license.
3 USING: accessors combinators kernel sequences words
7 TUPLE: lambda vars body ;
11 TUPLE: binding-form bindings body ;
13 TUPLE: let < binding-form ;
17 TUPLE: let* < binding-form ;
21 TUPLE: wlet < binding-form ;
29 : unquote ( quote -- local ) dup quote? [ local>> ] when ; inline
35 PREDICATE: local < word "local?" word-prop ;
37 : <local> ( name -- word )
38 #! Create a local variable identifier
40 dup t "local?" set-word-prop ;
44 PREDICATE: local-word < word "local-word?" word-prop ;
46 : <local-word> ( name -- word )
47 f <word> dup t "local-word?" set-word-prop ;
49 PREDICATE: local-reader < word "local-reader?" word-prop ;
51 : <local-reader> ( name -- word )
53 dup t "local-reader?" set-word-prop ;
55 M: local-reader literalize ;
57 PREDICATE: local-writer < word "local-writer?" word-prop ;
59 : <local-writer> ( reader -- word )
60 dup name>> "!" append f <word> {
61 [ nip t "local-writer?" set-word-prop ]
62 [ swap "local-reader" set-word-prop ]
63 [ "local-writer" set-word-prop ]
67 UNION: lexical local local-reader local-writer local-word ;
68 UNION: special lexical quote def ;