]> gitweb.factorcode.org Git - factor.git/blob - basis/locals/rewrite/closures/closures.factor
Fix comments to be ! not #!.
[factor.git] / basis / locals / rewrite / closures / closures.factor
1 ! Copyright (C) 2007, 2008 Slava Pestov, Eduardo Cavazos.
2 ! See http://factorcode.org/license.txt for BSD license.
3 USING: accessors kernel locals.rewrite.point-free
4 locals.rewrite.sugar locals.types macros.expander make
5 quotations sequences sets words ;
6 IN: locals.rewrite.closures
7
8 ! Step 2: identify free variables and make them into explicit
9 ! parameters of lambdas which are curried on
10
11 GENERIC: rewrite-closures* ( obj -- )
12
13 : (rewrite-closures) ( form -- form' )
14     [ [ rewrite-closures* ] each ] [ ] make ;
15
16 : rewrite-closures ( form -- form' )
17     expand-macros (rewrite-sugar) (rewrite-closures) point-free ;
18
19 GENERIC: defs-vars* ( seq form -- seq' )
20
21 : defs-vars ( form -- vars ) { } [ defs-vars* ] reduce members ;
22
23 M: def defs-vars* local>> unquote suffix ;
24
25 M: quotation defs-vars* [ defs-vars* ] each ;
26
27 M: object defs-vars* drop ;
28
29 GENERIC: uses-vars* ( seq form -- seq' )
30
31 : uses-vars ( form -- vars ) { } [ uses-vars* ] reduce members ;
32
33 M: local-writer uses-vars* "local-reader" word-prop suffix ;
34
35 M: lexical uses-vars* suffix ;
36
37 M: quote uses-vars* local>> uses-vars* ;
38
39 M: object uses-vars* drop ;
40
41 M: quotation uses-vars* [ uses-vars* ] each ;
42
43 : free-vars ( form -- seq )
44     [ uses-vars ] [ defs-vars ] bi diff ;
45
46 M: callable rewrite-closures*
47     ! Turn free variables into bound variables, curry them
48     ! onto the body
49     dup free-vars [ <quote> ] map
50     [ % ]
51     [ var-defs prepend (rewrite-closures) point-free , ]
52     [ length \ curry <repetition> % ]
53     tri ;
54
55 M: object rewrite-closures* , ;