2009-01-28 16:07:16 -05:00
|
|
|
! Copyright (C) 2008, 2009 Slava Pestov.
|
2008-11-14 21:18:16 -05:00
|
|
|
! See http://factorcode.org/license.txt for BSD license.
|
2009-10-28 00:50:48 -04:00
|
|
|
USING: accessors arrays assocs classes.mixin classes.parser
|
2015-06-22 18:58:59 -04:00
|
|
|
classes.singleton classes.tuple classes.tuple.parser combinators
|
|
|
|
effects.parser fry functors.backend generic generic.parser
|
|
|
|
interpolate io.streams.string kernel lexer locals.parser
|
|
|
|
locals.types macros make namespaces parser quotations sequences
|
|
|
|
vocabs.parser words words.symbol ;
|
2016-03-15 19:12:37 -04:00
|
|
|
|
2008-11-14 21:18:16 -05:00
|
|
|
IN: functors
|
|
|
|
|
2009-01-28 16:07:16 -05:00
|
|
|
! This is a hack
|
|
|
|
|
2009-01-28 18:07:31 -05:00
|
|
|
<PRIVATE
|
|
|
|
|
2009-04-26 22:22:20 -04:00
|
|
|
TUPLE: fake-call-next-method ;
|
|
|
|
|
2009-01-28 16:07:16 -05:00
|
|
|
TUPLE: fake-quotation seq ;
|
|
|
|
|
|
|
|
GENERIC: >fake-quotations ( quot -- fake )
|
|
|
|
|
|
|
|
M: callable >fake-quotations
|
|
|
|
>array >fake-quotations fake-quotation boa ;
|
|
|
|
|
|
|
|
M: array >fake-quotations [ >fake-quotations ] { } map-as ;
|
|
|
|
|
|
|
|
M: object >fake-quotations ;
|
|
|
|
|
2009-04-26 22:22:20 -04:00
|
|
|
GENERIC: (fake-quotations>) ( fake -- )
|
|
|
|
|
|
|
|
: fake-quotations> ( fake -- quot )
|
|
|
|
[ (fake-quotations>) ] [ ] make ;
|
2009-01-28 16:07:16 -05:00
|
|
|
|
2009-04-26 22:22:20 -04:00
|
|
|
M: fake-quotation (fake-quotations>)
|
|
|
|
[ seq>> [ (fake-quotations>) ] each ] [ ] make , ;
|
2009-01-28 16:07:16 -05:00
|
|
|
|
2009-04-26 22:22:20 -04:00
|
|
|
M: array (fake-quotations>)
|
|
|
|
[ [ (fake-quotations>) ] each ] { } make , ;
|
2009-01-28 16:07:16 -05:00
|
|
|
|
2009-04-26 22:22:20 -04:00
|
|
|
M: fake-call-next-method (fake-quotations>)
|
2010-02-01 02:08:24 -05:00
|
|
|
drop \ method get literalize , \ (call-next-method) , ;
|
2009-04-26 22:22:20 -04:00
|
|
|
|
|
|
|
M: object (fake-quotations>) , ;
|
2009-01-28 16:07:16 -05:00
|
|
|
|
2009-03-17 03:19:50 -04:00
|
|
|
: parse-definition* ( accum -- accum )
|
2009-10-28 14:38:27 -04:00
|
|
|
parse-definition >fake-quotations suffix!
|
2009-10-28 16:29:01 -04:00
|
|
|
[ fake-quotations> first ] append! ;
|
2009-01-28 16:07:16 -05:00
|
|
|
|
2009-03-21 04:17:35 -04:00
|
|
|
: parse-declared* ( accum -- accum )
|
2011-10-17 01:50:30 -04:00
|
|
|
scan-effect
|
2009-03-21 04:17:35 -04:00
|
|
|
[ parse-definition* ] dip
|
2009-10-28 14:38:27 -04:00
|
|
|
suffix! ;
|
2009-03-21 04:17:35 -04:00
|
|
|
|
2017-08-26 15:05:26 -04:00
|
|
|
FUNCTOR-SYNTAX: \TUPLE:
|
2009-10-28 14:38:27 -04:00
|
|
|
scan-param suffix!
|
2011-10-01 19:42:37 -04:00
|
|
|
scan-token {
|
2009-10-28 14:38:27 -04:00
|
|
|
{ ";" [ tuple suffix! f suffix! ] }
|
|
|
|
{ "<" [ scan-param suffix! [ parse-tuple-slots ] { } make suffix! ] }
|
2008-11-14 21:18:16 -05:00
|
|
|
[
|
2009-10-28 14:38:27 -04:00
|
|
|
[ tuple suffix! ] dip
|
2008-11-14 21:18:16 -05:00
|
|
|
[ parse-slot-name [ parse-tuple-slots ] when ] { }
|
2009-10-28 14:38:27 -04:00
|
|
|
make suffix!
|
2008-11-14 21:18:16 -05:00
|
|
|
]
|
|
|
|
} case
|
2010-02-17 09:56:41 -05:00
|
|
|
\ define-tuple-class* suffix! ;
|
2008-11-14 21:18:16 -05:00
|
|
|
|
2010-02-17 08:19:57 -05:00
|
|
|
FUNCTOR-SYNTAX: final
|
2013-03-23 19:05:14 -04:00
|
|
|
[ last-word make-final ] append! ;
|
2010-02-17 08:19:57 -05:00
|
|
|
|
2017-08-26 15:05:26 -04:00
|
|
|
FUNCTOR-SYNTAX: \SINGLETON:
|
2009-10-28 14:38:27 -04:00
|
|
|
scan-param suffix!
|
|
|
|
\ define-singleton-class suffix! ;
|
2009-07-22 03:06:24 -04:00
|
|
|
|
2017-08-26 15:05:26 -04:00
|
|
|
FUNCTOR-SYNTAX: \MIXIN:
|
2009-10-28 14:38:27 -04:00
|
|
|
scan-param suffix!
|
|
|
|
\ define-mixin-class suffix! ;
|
2009-07-22 03:06:24 -04:00
|
|
|
|
2017-08-26 15:05:26 -04:00
|
|
|
FUNCTOR-SYNTAX: \M:
|
2009-10-28 14:38:27 -04:00
|
|
|
scan-param suffix!
|
|
|
|
scan-param suffix!
|
2010-02-01 02:08:24 -05:00
|
|
|
[ create-method-in dup \ method set ] append!
|
2009-01-28 16:07:16 -05:00
|
|
|
parse-definition*
|
2009-10-28 14:38:27 -04:00
|
|
|
\ define* suffix! ;
|
2008-11-14 21:18:16 -05:00
|
|
|
|
2009-08-29 22:04:19 -04:00
|
|
|
FUNCTOR-SYNTAX: C:
|
2009-10-28 14:38:27 -04:00
|
|
|
scan-param suffix!
|
2017-07-24 20:29:31 -04:00
|
|
|
scan-param [
|
|
|
|
suffix!
|
|
|
|
[ [ boa ] curry ] append!
|
|
|
|
] keep suffix! \ boa-effect suffix!
|
2009-10-28 14:38:27 -04:00
|
|
|
\ define-declared* suffix! ;
|
2008-11-14 21:18:16 -05:00
|
|
|
|
2009-08-29 22:04:19 -04:00
|
|
|
FUNCTOR-SYNTAX: :
|
2009-10-28 14:38:27 -04:00
|
|
|
scan-param suffix!
|
2009-03-21 04:17:35 -04:00
|
|
|
parse-declared*
|
2009-10-28 14:38:27 -04:00
|
|
|
\ define-declared* suffix! ;
|
2008-11-14 21:18:16 -05:00
|
|
|
|
2009-08-29 22:04:19 -04:00
|
|
|
FUNCTOR-SYNTAX: SYMBOL:
|
2009-10-28 14:38:27 -04:00
|
|
|
scan-param suffix!
|
|
|
|
\ define-symbol suffix! ;
|
2009-04-27 15:02:14 -04:00
|
|
|
|
2009-08-29 22:04:19 -04:00
|
|
|
FUNCTOR-SYNTAX: SYNTAX:
|
2009-10-28 14:38:27 -04:00
|
|
|
scan-param suffix!
|
2009-03-21 02:27:50 -04:00
|
|
|
parse-definition*
|
2009-10-28 14:38:27 -04:00
|
|
|
\ define-syntax suffix! ;
|
2008-11-14 21:18:16 -05:00
|
|
|
|
2009-08-29 22:04:19 -04:00
|
|
|
FUNCTOR-SYNTAX: INSTANCE:
|
2009-10-28 14:38:27 -04:00
|
|
|
scan-param suffix!
|
|
|
|
scan-param suffix!
|
|
|
|
\ add-mixin-instance suffix! ;
|
2008-11-14 21:18:16 -05:00
|
|
|
|
2009-08-29 22:04:19 -04:00
|
|
|
FUNCTOR-SYNTAX: GENERIC:
|
2009-10-28 14:38:27 -04:00
|
|
|
scan-param suffix!
|
2011-10-17 01:50:30 -04:00
|
|
|
scan-effect suffix!
|
2009-10-28 14:38:27 -04:00
|
|
|
\ define-simple-generic* suffix! ;
|
2009-05-01 17:16:40 -04:00
|
|
|
|
2009-08-29 22:04:19 -04:00
|
|
|
FUNCTOR-SYNTAX: MACRO:
|
2009-10-28 14:38:27 -04:00
|
|
|
scan-param suffix!
|
2009-05-24 10:36:24 -04:00
|
|
|
parse-declared*
|
2009-10-28 14:38:27 -04:00
|
|
|
\ define-macro suffix! ;
|
2009-05-24 10:36:24 -04:00
|
|
|
|
2013-03-23 19:05:14 -04:00
|
|
|
FUNCTOR-SYNTAX: inline [ last-word make-inline ] append! ;
|
2008-11-14 21:18:16 -05:00
|
|
|
|
2009-10-28 14:38:27 -04:00
|
|
|
FUNCTOR-SYNTAX: call-next-method T{ fake-call-next-method } suffix! ;
|
2009-04-26 22:22:20 -04:00
|
|
|
|
2008-11-14 21:18:16 -05:00
|
|
|
: (INTERPOLATE) ( accum quot -- accum )
|
2016-03-29 16:03:38 -04:00
|
|
|
[ scan-token interpolate-locals-quot ] dip
|
2009-10-28 14:38:27 -04:00
|
|
|
'[ _ with-string-writer @ ] suffix! ;
|
2008-11-14 21:18:16 -05:00
|
|
|
|
2009-01-28 18:07:31 -05:00
|
|
|
PRIVATE>
|
|
|
|
|
2011-10-14 15:31:06 -04:00
|
|
|
SYNTAX: IS [ parse-word ] (INTERPOLATE) ;
|
2008-11-14 21:18:16 -05:00
|
|
|
|
2015-06-08 15:38:38 -04:00
|
|
|
SYNTAX: DEFERS [ current-vocab create-word ] (INTERPOLATE) ;
|
2009-07-07 15:34:08 -04:00
|
|
|
|
2015-06-08 15:38:38 -04:00
|
|
|
SYNTAX: DEFINES [ create-word-in ] (INTERPOLATE) ;
|
2008-11-14 21:18:16 -05:00
|
|
|
|
2015-06-08 15:38:38 -04:00
|
|
|
SYNTAX: DEFINES-PRIVATE [ begin-private create-word-in end-private ] (INTERPOLATE) ;
|
2009-09-04 02:21:59 -04:00
|
|
|
|
2009-03-21 02:27:50 -04:00
|
|
|
SYNTAX: DEFINES-CLASS [ create-class-in ] (INTERPOLATE) ;
|
2009-02-06 03:45:21 -05:00
|
|
|
|
2017-08-05 21:41:19 -04:00
|
|
|
DEFER: ;FUNCTOR> delimiter
|
2008-11-14 21:18:16 -05:00
|
|
|
|
2009-01-28 18:07:31 -05:00
|
|
|
<PRIVATE
|
|
|
|
|
2016-03-15 13:34:07 -04:00
|
|
|
: parse-binding ( end -- pair/f )
|
|
|
|
scan-token {
|
|
|
|
{ [ 2dup = ] [ 2drop f ] }
|
|
|
|
[ nip scan-object 2array ]
|
|
|
|
} cond ;
|
|
|
|
|
2009-10-28 00:50:48 -04:00
|
|
|
: parse-bindings ( end -- words assoc )
|
2016-03-15 19:12:37 -04:00
|
|
|
'[
|
2012-07-19 12:50:09 -04:00
|
|
|
building get use-words
|
2016-03-15 19:12:37 -04:00
|
|
|
[ _ parse-binding dup ]
|
|
|
|
[ first2 [ make-local ] dip 2array ]
|
|
|
|
produce nip
|
2015-06-22 18:58:59 -04:00
|
|
|
] H{ } make ;
|
2009-10-28 00:50:48 -04:00
|
|
|
|
2008-11-14 21:18:16 -05:00
|
|
|
: parse-functor-body ( -- form )
|
2015-06-22 18:58:59 -04:00
|
|
|
functor-words [
|
|
|
|
"WHERE" parse-bindings drop
|
|
|
|
[ swap <def> suffix ] { } assoc>map concat
|
2017-08-05 21:41:19 -04:00
|
|
|
\ ;FUNCTOR> parse-until [ ] append-as
|
2016-03-15 19:12:37 -04:00
|
|
|
qualified-vocabs pop* ! unuse the bindings
|
2015-06-22 18:58:59 -04:00
|
|
|
] with-lambda-scope ;
|
2008-11-14 21:18:16 -05:00
|
|
|
|
2017-08-05 21:41:19 -04:00
|
|
|
: (<FUNCTOR:) ( -- word def effect )
|
2011-09-27 16:20:07 -04:00
|
|
|
scan-new-word [ parse-functor-body ] parse-locals-definition ;
|
2008-11-14 21:18:16 -05:00
|
|
|
|
2009-01-28 18:07:31 -05:00
|
|
|
PRIVATE>
|
|
|
|
|
2017-08-26 15:05:26 -04:00
|
|
|
SYNTAX: \<FUNCTOR: (<FUNCTOR:) define-declared ;
|