]> gitweb.factorcode.org Git - factor.git/blob - basis/locals/types/types.factor
Merge branch 'master' into experimental (untested!)
[factor.git] / basis / locals / types / types.factor
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 ;
4 IN: locals.types
5
6 TUPLE: lambda vars body ;
7
8 C: <lambda> lambda
9
10 TUPLE: binding-form bindings body ;
11
12 TUPLE: let < binding-form ;
13
14 C: <let> let
15
16 TUPLE: let* < binding-form ;
17
18 C: <let*> let*
19
20 TUPLE: wlet < binding-form ;
21
22 C: <wlet> wlet
23
24 TUPLE: quote local ;
25
26 C: <quote> quote
27
28 : unquote ( quote -- local ) dup quote? [ local>> ] when ; inline
29
30 TUPLE: def local ;
31
32 C: <def> def
33
34 PREDICATE: local < word "local?" word-prop ;
35
36 : <local> ( name -- word )
37     #! Create a local variable identifier
38     f <word>
39     dup t "local?" set-word-prop ;
40
41 PREDICATE: local-word < word "local-word?" word-prop ;
42
43 : <local-word> ( name -- word )
44     f <word> dup t "local-word?" set-word-prop ;
45
46 PREDICATE: local-reader < word "local-reader?" word-prop ;
47
48 : <local-reader> ( name -- word )
49     f <word>
50     dup t "local-reader?" set-word-prop ;
51
52 PREDICATE: local-writer < word "local-writer?" word-prop ;
53
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 ]
59         [ nip ]
60     } 2cleave ;
61
62 UNION: lexical local local-reader local-writer local-word ;
63 UNION: special lexical quote def ;