65 lines
2.2 KiB
Factor
65 lines
2.2 KiB
Factor
! Copyright (C) 2009 Slava Pestov, Doug Coleman.
|
|
! See http://factorcode.org/license.txt for BSD license.
|
|
USING: accessors assocs classes classes.tuple effects
|
|
effects.parser fry kernel lexer locals macros parser
|
|
sequences sequences.generalizations sets vocabs vocabs.parser
|
|
words alien.parser ;
|
|
IN: constructors
|
|
|
|
: all-slots-assoc ( class -- slots )
|
|
superclasses-of [
|
|
[ "slots" word-prop ] keep '[ _ ] { } map>assoc
|
|
] map concat ;
|
|
|
|
MACRO:: slots>boa ( slots class -- quot )
|
|
class all-slots-assoc slots [ '[ first name>> _ = ] find-last nip ] with map :> slot-assoc
|
|
class all-slots-assoc [ [ ] [ first initial>> ] bi ] { } map>assoc :> default-params
|
|
slots length
|
|
default-params length
|
|
'[
|
|
_ narray slot-assoc swap zip
|
|
default-params swap assoc-union values _ firstn class boa
|
|
] ;
|
|
|
|
ERROR: repeated-constructor-parameters class effect ;
|
|
|
|
ERROR: unknown-constructor-parameters class effect unknown ;
|
|
|
|
: ensure-constructor-parameters ( class effect -- class effect )
|
|
dup in>> all-unique? [ repeated-constructor-parameters ] unless
|
|
2dup [ all-slots [ name>> ] map ] [ in>> ] bi* swap diff
|
|
[ unknown-constructor-parameters ] unless-empty ;
|
|
|
|
: constructor-boa-quot ( constructor-word class effect -- word quot )
|
|
in>> swap '[ _ _ slots>boa ] ; inline
|
|
|
|
: define-constructor ( constructor-word class effect -- )
|
|
ensure-constructor-parameters
|
|
[ constructor-boa-quot ] keep define-declared ;
|
|
|
|
: create-reset ( string -- word )
|
|
create-word-in dup reset-generic ;
|
|
|
|
: scan-constructor ( -- word class )
|
|
scan-new-word scan-class ;
|
|
|
|
: parse-constructor ( -- word class effect def )
|
|
scan-constructor scan-effect ensure-constructor-parameters
|
|
parse-definition ;
|
|
|
|
SYNTAX: CONSTRUCTOR:
|
|
parse-constructor
|
|
[ [ constructor-boa-quot ] dip compose ]
|
|
[ drop ] 2bi define-declared ;
|
|
|
|
: scan-rest-input-effect ( -- effect )
|
|
")" parse-effect-tokens nip
|
|
{ "obj" } <effect> ;
|
|
|
|
: scan-full-input-effect ( -- effect )
|
|
"(" expect scan-rest-input-effect ;
|
|
|
|
SYNTAX: SLOT-CONSTRUCTOR:
|
|
scan-new-word [ name>> "(" append create-reset ] keep
|
|
'[ scan-rest-input-effect in>> _ '[ _ _ slots>boa ] append! ] define-syntax ;
|