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.
|
2008-12-08 17:02:31 -05:00
|
|
|
USING: kernel quotations classes.tuple make combinators generic
|
|
|
|
words interpolate namespaces sequences io.streams.string fry
|
|
|
|
classes.mixin effects lexer parser classes.tuple.parser
|
2009-02-06 03:45:21 -05:00
|
|
|
effects.parser locals.types locals.parser generic.parser
|
|
|
|
locals.rewrite.closures vocabs.parser classes.parser
|
2009-04-27 15:02:14 -04:00
|
|
|
arrays accessors words.symbol ;
|
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
|
|
|
|
|
|
|
|
: scan-param ( -- obj ) scan-object literalize ;
|
2008-11-14 21:18:16 -05:00
|
|
|
|
2009-03-21 04:17:35 -04:00
|
|
|
: define* ( word def -- ) over set-word define ;
|
2008-12-02 21:35:20 -05:00
|
|
|
|
2009-03-21 04:17:35 -04:00
|
|
|
: define-declared* ( word def effect -- ) pick set-word define-declared ;
|
2009-03-21 02:27:50 -04:00
|
|
|
|
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>)
|
|
|
|
drop method-body get literalize , \ (call-next-method) , ;
|
|
|
|
|
|
|
|
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-04-26 22:22:20 -04:00
|
|
|
parse-definition >fake-quotations parsed
|
|
|
|
[ fake-quotations> first ] over push-all ;
|
2009-01-28 16:07:16 -05:00
|
|
|
|
2009-03-21 04:17:35 -04:00
|
|
|
: parse-declared* ( accum -- accum )
|
2009-03-22 18:59:40 -04:00
|
|
|
complete-effect
|
2009-03-21 04:17:35 -04:00
|
|
|
[ parse-definition* ] dip
|
|
|
|
parsed ;
|
|
|
|
|
|
|
|
: DEFINE* ( accum -- accum ) \ define-declared* parsed ;
|
2008-11-14 21:18:16 -05:00
|
|
|
|
2009-03-21 02:27:50 -04:00
|
|
|
SYNTAX: `TUPLE:
|
2008-11-14 21:18:16 -05:00
|
|
|
scan-param parsed
|
|
|
|
scan {
|
|
|
|
{ ";" [ tuple parsed f parsed ] }
|
2008-12-04 16:40:55 -05:00
|
|
|
{ "<" [ scan-param parsed [ parse-tuple-slots ] { } make parsed ] }
|
2008-11-14 21:18:16 -05:00
|
|
|
[
|
|
|
|
[ tuple parsed ] dip
|
|
|
|
[ parse-slot-name [ parse-tuple-slots ] when ] { }
|
|
|
|
make parsed
|
|
|
|
]
|
|
|
|
} case
|
2009-03-21 02:27:50 -04:00
|
|
|
\ define-tuple-class parsed ;
|
2008-11-14 21:18:16 -05:00
|
|
|
|
2009-03-21 02:27:50 -04:00
|
|
|
SYNTAX: `M:
|
2008-11-14 21:18:16 -05:00
|
|
|
scan-param parsed
|
|
|
|
scan-param parsed
|
2009-04-26 22:22:20 -04:00
|
|
|
[ create-method-in dup method-body set ] over push-all
|
2009-01-28 16:07:16 -05:00
|
|
|
parse-definition*
|
2009-03-21 04:17:35 -04:00
|
|
|
\ define* parsed ;
|
2008-11-14 21:18:16 -05:00
|
|
|
|
2009-03-21 02:27:50 -04:00
|
|
|
SYNTAX: `C:
|
2008-11-14 21:18:16 -05:00
|
|
|
scan-param parsed
|
|
|
|
scan-param parsed
|
2009-03-22 18:59:40 -04:00
|
|
|
complete-effect
|
2009-03-21 04:17:35 -04:00
|
|
|
[ [ [ boa ] curry ] over push-all ] dip parsed
|
|
|
|
\ define-declared* parsed ;
|
2008-11-14 21:18:16 -05:00
|
|
|
|
2009-03-21 02:27:50 -04:00
|
|
|
SYNTAX: `:
|
2008-11-14 21:18:16 -05:00
|
|
|
scan-param parsed
|
2009-03-21 04:17:35 -04:00
|
|
|
parse-declared*
|
|
|
|
\ define-declared* parsed ;
|
2008-11-14 21:18:16 -05:00
|
|
|
|
2009-04-27 15:02:14 -04:00
|
|
|
SYNTAX: `SYMBOL:
|
|
|
|
scan-param parsed
|
|
|
|
\ define-symbol parsed ;
|
|
|
|
|
2009-03-21 02:27:50 -04:00
|
|
|
SYNTAX: `SYNTAX:
|
2008-11-14 21:18:16 -05:00
|
|
|
scan-param parsed
|
2009-03-21 02:27:50 -04:00
|
|
|
parse-definition*
|
2009-03-21 04:17:35 -04:00
|
|
|
\ define-syntax parsed ;
|
2008-11-14 21:18:16 -05:00
|
|
|
|
2009-03-21 02:27:50 -04:00
|
|
|
SYNTAX: `INSTANCE:
|
|
|
|
scan-param parsed
|
|
|
|
scan-param parsed
|
|
|
|
\ add-mixin-instance parsed ;
|
2008-11-14 21:18:16 -05:00
|
|
|
|
2009-03-21 02:27:50 -04:00
|
|
|
SYNTAX: `inline [ word make-inline ] over push-all ;
|
2008-11-14 21:18:16 -05:00
|
|
|
|
2009-04-26 22:22:20 -04:00
|
|
|
SYNTAX: `call-next-method T{ fake-call-next-method } parsed ;
|
|
|
|
|
2008-11-14 21:18:16 -05:00
|
|
|
: (INTERPOLATE) ( accum quot -- accum )
|
|
|
|
[ scan interpolate-locals ] dip
|
|
|
|
'[ _ with-string-writer @ ] parsed ;
|
|
|
|
|
2009-01-28 18:07:31 -05:00
|
|
|
PRIVATE>
|
|
|
|
|
2009-03-21 02:27:50 -04:00
|
|
|
SYNTAX: IS [ dup search [ ] [ no-word ] ?if ] (INTERPOLATE) ;
|
2008-11-14 21:18:16 -05:00
|
|
|
|
2009-03-21 02:27:50 -04:00
|
|
|
SYNTAX: DEFINES [ create-in ] (INTERPOLATE) ;
|
2008-11-14 21:18:16 -05:00
|
|
|
|
2009-03-21 02:27:50 -04:00
|
|
|
SYNTAX: DEFINES-CLASS [ create-class-in ] (INTERPOLATE) ;
|
2009-02-06 03:45:21 -05:00
|
|
|
|
2008-11-14 21:18:16 -05:00
|
|
|
DEFER: ;FUNCTOR delimiter
|
|
|
|
|
2009-01-28 18:07:31 -05:00
|
|
|
<PRIVATE
|
|
|
|
|
2008-11-14 21:18:16 -05:00
|
|
|
: functor-words ( -- assoc )
|
|
|
|
H{
|
|
|
|
{ "TUPLE:" POSTPONE: `TUPLE: }
|
|
|
|
{ "M:" POSTPONE: `M: }
|
|
|
|
{ "C:" POSTPONE: `C: }
|
|
|
|
{ ":" POSTPONE: `: }
|
|
|
|
{ "INSTANCE:" POSTPONE: `INSTANCE: }
|
2009-03-21 02:27:50 -04:00
|
|
|
{ "SYNTAX:" POSTPONE: `SYNTAX: }
|
2009-04-27 15:02:14 -04:00
|
|
|
{ "SYMBOL:" POSTPONE: `SYMBOL: }
|
2008-11-14 21:18:16 -05:00
|
|
|
{ "inline" POSTPONE: `inline }
|
2009-04-26 22:22:20 -04:00
|
|
|
{ "call-next-method" POSTPONE: `call-next-method }
|
2008-11-14 21:18:16 -05:00
|
|
|
} ;
|
|
|
|
|
|
|
|
: push-functor-words ( -- )
|
|
|
|
functor-words use get push ;
|
|
|
|
|
|
|
|
: pop-functor-words ( -- )
|
|
|
|
functor-words use get delq ;
|
|
|
|
|
|
|
|
: parse-functor-body ( -- form )
|
2009-03-06 20:48:04 -05:00
|
|
|
push-functor-words
|
|
|
|
"WHERE" parse-bindings*
|
|
|
|
[ \ ;FUNCTOR parse-until >quotation ] ((parse-lambda)) <let*> 1quotation
|
|
|
|
pop-functor-words ;
|
2008-11-14 21:18:16 -05:00
|
|
|
|
2009-03-21 04:17:35 -04:00
|
|
|
: (FUNCTOR:) ( -- word def effect )
|
2009-03-06 20:48:04 -05:00
|
|
|
CREATE-WORD [ parse-functor-body ] parse-locals-definition ;
|
2008-11-14 21:18:16 -05:00
|
|
|
|
2009-01-28 18:07:31 -05:00
|
|
|
PRIVATE>
|
|
|
|
|
2009-03-21 04:17:35 -04:00
|
|
|
SYNTAX: FUNCTOR: (FUNCTOR:) define-declared ;
|