]> gitweb.factorcode.org Git - factor.git/blob - basis/constructors/constructors.factor
Merge branch 'master' of git://factorcode.org/git/factor
[factor.git] / basis / constructors / constructors.factor
1 ! Copyright (C) 2009 Slava Pestov, Doug Coleman.
2 ! See http://factorcode.org/license.txt for BSD license.
3 USING: accessors assocs classes classes.tuple effects.parser
4 fry generalizations generic.standard kernel lexer locals macros
5 parser sequences slots vocabs words arrays ;
6 IN: constructors
7
8 ! An experiment
9
10 : initializer-name ( class -- word )
11     name>> "initialize-" prepend ;
12
13 : lookup-initializer ( class -- word/f )
14     initializer-name "initializers" lookup ;
15
16 : initializer-word ( class -- word )
17     initializer-name
18     "initializers" create-vocab create
19     [ t "initializer" set-word-prop ] [ ] bi ;
20
21 : define-initializer-generic ( name -- )
22     initializer-word (( object -- object )) define-simple-generic ;
23
24 : define-initializer ( class def -- )
25     [ drop define-initializer-generic ]
26     [ [ dup lookup-initializer ] dip H{ } clone define-typecheck ] 2bi ;
27
28 : all-slots-assoc ( class -- slots )
29     superclasses [ [ "slots" word-prop ] keep '[ _ ] { } map>assoc ] map concat ;
30
31 MACRO:: slots>constructor ( class slots -- quot )
32     class all-slots-assoc slots [ '[ first name>> _ = ] find-last nip ] with map :> slot-assoc
33     class all-slots-assoc [ [ ] [ first initial>> ] bi ] { } map>assoc :> default-params
34     slots length
35     default-params length
36     '[
37         _ narray slot-assoc swap zip 
38         default-params swap assoc-union values _ firstn class boa
39     ] ;
40
41 :: (define-constructor) ( constructor-word class effect def -- word quot )
42     constructor-word
43     class def define-initializer
44     class effect in>> '[ _ _ slots>constructor ] ;
45
46 :: define-constructor ( constructor-word class effect def -- )
47     constructor-word class effect def (define-constructor)
48     class lookup-initializer
49     '[ @ _ execute( obj -- obj ) ] effect define-declared ;
50
51 :: define-auto-constructor ( constructor-word class effect def reverse? -- )
52     constructor-word class effect def (define-constructor)
53     class superclasses [ lookup-initializer ] map sift
54     reverse? [ reverse ] when
55     '[ @ _ [ execute( obj -- obj ) ] each ] effect define-declared ;
56
57 : scan-constructor ( -- class word )
58     scan-word [ name>> "<" ">" surround create-in ] keep ;
59
60 : parse-constructor ( -- class word effect def )
61     scan-constructor complete-effect parse-definition ;
62
63 SYNTAX: CONSTRUCTOR: parse-constructor define-constructor ;
64 SYNTAX: FORWARD-CONSTRUCTOR: parse-constructor f define-auto-constructor ;
65 SYNTAX: BACKWARD-CONSTRUCTOR: parse-constructor t define-auto-constructor ;
66 ALIAS: AUTO-CONSTRUCTOR FORWARD-CONSTRUCTOR
67
68 "initializers" create-vocab drop