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