2009-06-04 11:17:09 -04:00
|
|
|
! Copyright (C) 2009 Slava Pestov, Doug Coleman.
|
2009-01-30 15:40:08 -05:00
|
|
|
! See http://factorcode.org/license.txt for BSD license.
|
2010-04-23 21:12:54 -04:00
|
|
|
USING: accessors arrays assocs classes classes.tuple
|
2010-05-18 18:36:47 -04:00
|
|
|
effects.parser fry generalizations sequences.generalizations
|
|
|
|
generic.standard kernel lexer locals macros parser sequences
|
|
|
|
sets slots vocabs words ;
|
2009-01-30 15:40:08 -05:00
|
|
|
IN: constructors
|
|
|
|
|
|
|
|
! An experiment
|
|
|
|
|
2009-06-04 11:17:09 -04:00
|
|
|
: initializer-name ( class -- word )
|
|
|
|
name>> "initialize-" prepend ;
|
2009-01-30 15:56:44 -05:00
|
|
|
|
2009-06-04 11:17:09 -04:00
|
|
|
: lookup-initializer ( class -- word/f )
|
|
|
|
initializer-name "initializers" lookup ;
|
2009-01-30 15:40:08 -05:00
|
|
|
|
2009-06-04 11:17:09 -04:00
|
|
|
: initializer-word ( class -- word )
|
|
|
|
initializer-name
|
|
|
|
"initializers" create-vocab create
|
|
|
|
[ t "initializer" set-word-prop ] [ ] bi ;
|
|
|
|
|
|
|
|
: define-initializer-generic ( name -- )
|
|
|
|
initializer-word (( object -- object )) define-simple-generic ;
|
|
|
|
|
|
|
|
: define-initializer ( class def -- )
|
|
|
|
[ drop define-initializer-generic ]
|
|
|
|
[ [ dup lookup-initializer ] dip H{ } clone define-typecheck ] 2bi ;
|
|
|
|
|
2009-06-09 12:31:00 -04:00
|
|
|
: all-slots-assoc ( class -- slots )
|
|
|
|
superclasses [ [ "slots" word-prop ] keep '[ _ ] { } map>assoc ] map concat ;
|
|
|
|
|
2009-06-04 11:17:09 -04:00
|
|
|
MACRO:: slots>constructor ( class slots -- quot )
|
2009-06-09 12:31:00 -04:00
|
|
|
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
|
2009-06-04 15:57:10 -04:00
|
|
|
slots length
|
2009-06-09 12:31:00 -04:00
|
|
|
default-params length
|
2009-06-04 11:17:09 -04:00
|
|
|
'[
|
2009-06-09 12:31:00 -04:00
|
|
|
_ narray slot-assoc swap zip
|
|
|
|
default-params swap assoc-union values _ firstn class boa
|
2009-06-04 11:17:09 -04:00
|
|
|
] ;
|
|
|
|
|
2010-04-23 21:12:54 -04:00
|
|
|
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 ;
|
|
|
|
|
2009-06-09 00:18:15 -04:00
|
|
|
:: (define-constructor) ( constructor-word class effect def -- word quot )
|
2009-06-04 11:17:09 -04:00
|
|
|
constructor-word
|
|
|
|
class def define-initializer
|
2009-06-09 00:18:15 -04:00
|
|
|
class effect in>> '[ _ _ slots>constructor ] ;
|
|
|
|
|
2009-07-23 16:59:55 -04:00
|
|
|
:: define-constructor ( constructor-word class effect def reverse? -- )
|
2009-06-09 00:18:15 -04:00
|
|
|
constructor-word class effect def (define-constructor)
|
2009-06-11 15:31:04 -04:00
|
|
|
class superclasses [ lookup-initializer ] map sift
|
|
|
|
reverse? [ reverse ] when
|
2009-06-09 00:18:15 -04:00
|
|
|
'[ @ _ [ execute( obj -- obj ) ] each ] effect define-declared ;
|
|
|
|
|
2010-01-04 15:24:13 -05:00
|
|
|
: scan-constructor ( -- word class )
|
|
|
|
scan-word [ name>> "<" ">" surround create-in dup reset-generic ] keep ;
|
2009-01-30 15:40:08 -05:00
|
|
|
|
2009-06-09 00:18:15 -04:00
|
|
|
: parse-constructor ( -- class word effect def )
|
2010-04-23 21:12:54 -04:00
|
|
|
scan-constructor complete-effect ensure-constructor-parameters
|
|
|
|
parse-definition ;
|
2009-06-09 00:18:15 -04:00
|
|
|
|
2009-07-23 16:59:55 -04:00
|
|
|
SYNTAX: CONSTRUCTOR: parse-constructor f define-constructor ;
|
2009-06-04 16:30:17 -04:00
|
|
|
|
|
|
|
"initializers" create-vocab drop
|