! Copyright (C) 2007, 2008 Slava Pestov, Eduardo Cavazos.
! See http://factorcode.org/license.txt for BSD license.
-USING: accessors kernel locals locals.types prettyprint.backend
-prettyprint.custom prettyprint.sections sequences words ;
+USING: accessors combinators kernel locals locals.types math
+prettyprint.backend prettyprint.custom prettyprint.sections
+sequences words ;
IN: locals.prettyprint
: pprint-var ( var -- )
M: let pprint* \ [let pprint-let ;
-M: def pprint*
- dup local>> word?
- [ <block \ :> pprint-word local>> pprint-var block> ]
- [ pprint-tuple ] if ;
-
M: multi-def pprint*
- dup locals>> [ word? ] all?
- [ <block \ :> pprint-word "(" text locals>> [ pprint-var ] each ")" text block> ]
- [ pprint-tuple ] if ;
+ dup locals>> [ word? ] all? [
+ <block \ :> pprint-word locals>> {
+ [ length 1 > [ "(" text ] when ]
+ [ [ pprint-var ] each ]
+ [ length 1 > [ ")" text ] when ]
+ } cleave block>
+ ] [ pprint-tuple ] if ;
{ "um" t } [
[
"um" parse-def
- local>> name>>
+ locals>> first name>>
qualified-vocabs last words>> keys "um" swap member?
] with-compilation-unit
] unit-test
: defs-vars ( form -- vars ) { } [ defs-vars* ] reduce members ;
-M: def defs-vars* local>> unquote suffix ;
-
M: multi-def defs-vars* locals>> [ unquote suffix ] each ;
M: quotation defs-vars* [ defs-vars* ] each ;
dupd "local-reader" word-prop
read-local-quot [ set-local-value ] append ;
-M: def localize
- local>>
- [ prefix ]
- [ local-reader? [ 1array load-local ] [ load-local ] ? ]
- bi ;
-
M: multi-def localize
locals>> <reversed>
[ prepend ]
[ [ [ local-reader? ] dip '[ [ 1array ] _ [ndip] ] [ [ ] ] if ] map-index concat ]
- [ length [ load-locals ] curry ] tri append ;
+ [
+ length {
+ { [ dup 1 > ] [ [ load-locals ] curry ] }
+ { [ dup 1 = ] [ drop [ load-local ] ] }
+ [ drop [ ] ]
+ } cond
+ ] tri append ;
M: object localize 1quotation ;
M: callable quotation-rewrite [ [ rewrite-sugar* ] each ] [ ] make ;
: var-defs ( vars -- defs )
- dup length 1 > [
- <multi-def> 1quotation
- ] [
- <reversed> [ <def> ] [ ] map-as
- ] if ;
+ [ [ ] ] [ <multi-def> 1quotation ] if-empty ;
M: lambda quotation-rewrite
[ body>> ] [ vars>> var-defs ] bi prepend quotation-rewrite ;
M: tuple rewrite-sugar* rewrite-element ;
-M: def rewrite-sugar* , ;
-
M: multi-def rewrite-sugar* , ;
M: hashtable rewrite-sugar* rewrite-element ;
! Copyright (C) 2007, 2010 Slava Pestov, Eduardo Cavazos.
! See http://factorcode.org/license.txt for BSD license.
-USING: accessors combinators kernel sequences words
-quotations ;
+USING: accessors arrays combinators kernel sequences
+quotations words ;
IN: locals.types
TUPLE: lambda vars body ;
: unquote ( quote -- local ) dup quote? [ local>> ] when ; inline
-TUPLE: def local ;
-
-C: <def> def
-
TUPLE: multi-def locals ;
C: <multi-def> multi-def
+: <def> ( local -- def ) 1array <multi-def> ;
+
PREDICATE: local < word "local?" word-prop ;
: <local> ( name -- word )
} 2cleave ;
UNION: lexical local local-reader local-writer ;
-UNION: special lexical quote def ;
+UNION: special lexical quote ;