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
4 effects.parser kernel lexer parser sequences
5 sequences.generalizations sets words ;
8 : all-slots-assoc ( class -- slots )
10 [ "slots" word-prop ] keep '[ _ ] { } map>assoc
13 MACRO:: slots>boa ( slots class -- quot )
14 class all-slots-assoc slots [ '[ first name>> _ = ] find-last nip ] with map :> slot-assoc
15 class all-slots-assoc [ [ ] [ first initial>> ] bi ] { } map>assoc :> default-params
19 _ narray slot-assoc swap zip
20 default-params swap assoc-union values _ firstn class boa
23 ERROR: repeated-constructor-parameters class effect ;
25 ERROR: unknown-constructor-parameters class effect unknown ;
27 : ensure-constructor-parameters ( class effect -- class effect )
28 dup in>> all-unique? [ repeated-constructor-parameters ] unless
29 2dup [ all-slots [ name>> ] map ] [ in>> ] bi* swap diff
30 [ unknown-constructor-parameters ] unless-empty ;
32 : constructor-boa-quot ( constructor-word class effect -- word quot )
33 in>> swap '[ _ _ slots>boa ] ; inline
35 : define-constructor ( constructor-word class effect -- )
36 ensure-constructor-parameters
37 [ constructor-boa-quot ] keep define-declared ;
39 : create-reset ( string -- word )
40 create-word-in dup reset-generic ;
42 : scan-constructor ( -- word class )
43 scan-new-word scan-class ;
45 : parse-constructor ( -- word class effect def )
46 scan-constructor scan-effect ensure-constructor-parameters
51 [ [ constructor-boa-quot ] dip compose ]
52 [ drop ] 2bi define-declared ;
54 : scan-rest-input-effect ( -- effect )
55 ")" parse-effect-tokens nip
58 : scan-full-input-effect ( -- effect )
59 "(" expect scan-rest-input-effect ;
61 SYNTAX: SLOT-CONSTRUCTOR:
62 scan-new-word [ name>> "(" append create-reset ] keep
63 '[ scan-rest-input-effect in>> _ '[ _ _ slots>boa ] append! ] define-syntax ;