1 ! Copyright (C) 2007, 2010 Slava Pestov.
2 ! See http://factorcode.org/license.txt for BSD license.
3 USING: accessors combinators compiler.units definitions effects
4 effects.parser fry kernel memoize words ;
9 : real-macro-effect ( effect -- effect' )
10 in>> { "quot" } <effect> ;
12 : check-macro-effect ( word effect -- )
13 [ real-macro-effect ] keep 2dup effect=
14 [ 3drop ] [ bad-stack-effect ] if ;
18 : define-macro ( word definition effect -- )
20 [ nip check-macro-effect ]
22 [ '[ _ _ call-effect ] ] keep
23 [ memoize-quot '[ @ call ] ] keep
26 [ drop "macro" set-word-prop ]
27 [ 2drop changed-effect ]
30 SYNTAX: MACRO: (:) define-macro ;
32 PREDICATE: macro < word "macro" word-prop >boolean ;
34 M: macro make-inline throw-cannot-be-inline ;
36 M: macro definer drop \ MACRO: \ ; ;
38 M: macro definition "macro" word-prop ;
41 [ call-next-method ] [ f "macro" set-word-prop ] bi ;
43 M: macro always-bump-effect-counter? drop t ;