factor/basis/functors/functors.factor

108 lines
2.6 KiB
Factor
Raw Normal View History

2008-11-14 21:18:16 -05:00
! Copyright (C) 2008 Slava Pestov.
! 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
effects.parser locals.types locals.parser
locals.rewrite.closures vocabs.parser ;
2008-11-14 21:18:16 -05:00
IN: functors
: scan-param ( -- obj )
scan-object dup special? [ literalize ] unless ;
: define* ( word def effect -- ) pick set-word define-declared ;
: DEFINE* ( accum -- accum ) effect get parsed \ define* parsed ;
2008-11-14 21:18:16 -05:00
: `TUPLE:
scan-param parsed
scan {
{ ";" [ tuple parsed f parsed ] }
{ "<" [ 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
\ define-tuple-class parsed ; parsing
: `M:
effect off
2008-11-14 21:18:16 -05:00
scan-param parsed
scan-param parsed
\ create-method parsed
parse-definition parsed
DEFINE* ; parsing
2008-11-14 21:18:16 -05:00
: `C:
effect off
2008-11-14 21:18:16 -05:00
scan-param parsed
scan-param parsed
[ [ boa ] curry ] over push-all
DEFINE* ; parsing
2008-11-14 21:18:16 -05:00
: `:
effect off
2008-11-14 21:18:16 -05:00
scan-param parsed
parse-definition parsed
DEFINE* ; parsing
2008-11-14 21:18:16 -05:00
: `INSTANCE:
scan-param parsed
scan-param parsed
\ add-mixin-instance parsed ; parsing
: `inline \ inline parsed ; parsing
: `parsing \ parsing parsed ; parsing
: `(
")" parse-effect effect set ; parsing
2008-11-14 21:18:16 -05:00
: (INTERPOLATE) ( accum quot -- accum )
[ scan interpolate-locals ] dip
'[ _ with-string-writer @ ] parsed ;
: IS [ dup search [ ] [ no-word ] ?if ] (INTERPOLATE) ; parsing
2008-11-14 21:18:16 -05:00
: DEFINES [ create-in ] (INTERPOLATE) ; parsing
2008-11-14 21:18:16 -05:00
DEFER: ;FUNCTOR delimiter
: functor-words ( -- assoc )
H{
{ "TUPLE:" POSTPONE: `TUPLE: }
{ "M:" POSTPONE: `M: }
{ "C:" POSTPONE: `C: }
{ ":" POSTPONE: `: }
{ "INSTANCE:" POSTPONE: `INSTANCE: }
{ "inline" POSTPONE: `inline }
{ "parsing" POSTPONE: `parsing }
{ "(" POSTPONE: `( }
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 )
t in-lambda? [
V{ } clone
push-functor-words
"WHERE" parse-bindings* \ ;FUNCTOR (parse-lambda)
<let*> parsed-lambda
pop-functor-words
>quotation
] with-variable ;
: (FUNCTOR:) ( -- word def )
CREATE
2008-12-09 02:42:02 -05:00
parse-locals dup push-locals
2008-11-14 21:18:16 -05:00
parse-functor-body swap pop-locals <lambda>
2008-12-08 17:02:31 -05:00
rewrite-closures first ;
2008-11-14 21:18:16 -05:00
: FUNCTOR: (FUNCTOR:) define ; parsing