]> gitweb.factorcode.org Git - factor.git/blob - core/locals/rewrite/sugar/sugar.factor
Revert "locals: simplify by merging <def> and <multi-def>."
[factor.git] / core / locals / rewrite / sugar / sugar.factor
1 ! Copyright (C) 2007, 2008 Slava Pestov, Eduardo Cavazos.
2 ! See http://factorcode.org/license.txt for BSD license.
3 USING: accessors arrays assocs classes classes.tuple fry
4 sequences.generalizations hashtables kernel locals locals.backend
5 locals.errors locals.types make math quotations sequences vectors
6 words ;
7 IN: locals.rewrite.sugar
8
9 ! Step 1: rewrite [| into :> forms, turn
10 ! literals with locals in them into code which constructs
11 ! the literal after pushing locals on the stack
12
13 GENERIC: rewrite-sugar* ( obj -- )
14
15 : (rewrite-sugar) ( form -- form' )
16     [ rewrite-sugar* ] [ ] make ;
17
18 GENERIC: quotation-rewrite ( form -- form' )
19
20 M: callable quotation-rewrite [ [ rewrite-sugar* ] each ] [ ] make ;
21
22 : var-defs ( vars -- defs )
23     dup length 1 > [
24         <multi-def> 1quotation
25     ] [
26         <reversed> [ <def> ] [ ] map-as
27     ] if ;
28
29 M: lambda quotation-rewrite
30     [ body>> ] [ vars>> var-defs ] bi prepend quotation-rewrite ;
31
32 M: callable rewrite-sugar* quotation-rewrite , ;
33
34 M: lambda rewrite-sugar* quotation-rewrite , ;
35
36 GENERIC: rewrite-literal? ( obj -- ? )
37
38 M: special rewrite-literal? drop t ;
39
40 M: array rewrite-literal? [ rewrite-literal? ] any? ;
41
42 M: quotation rewrite-literal? [ rewrite-literal? ] any? ;
43
44 M: vector rewrite-literal? [ rewrite-literal? ] any? ;
45
46 M: wrapper rewrite-literal? wrapped>> rewrite-literal? ;
47
48 M: hashtable rewrite-literal? >alist rewrite-literal? ;
49
50 M: tuple rewrite-literal? tuple>array rewrite-literal? ;
51
52 M: object rewrite-literal? drop f ;
53
54 GENERIC: rewrite-element ( obj -- )
55
56 : rewrite-elements ( seq -- )
57     [ rewrite-element ] each ;
58
59 : rewrite-sequence ( seq -- )
60     [ rewrite-elements ] [ length ] [ 0 head ] tri '[ _ _ nsequence ] % ;
61
62 M: array rewrite-element
63     dup rewrite-literal? [ rewrite-sequence ] [ , ] if ;
64
65 M: vector rewrite-element
66     dup rewrite-literal? [ rewrite-sequence ] [ , ] if ;
67
68 M: hashtable rewrite-element
69     dup rewrite-literal? [ >alist rewrite-sequence \ >hashtable , ] [ , ] if ;
70
71 M: tuple rewrite-element
72     dup rewrite-literal? [
73         [ tuple-slots rewrite-elements ] [ class-of ] bi '[ _ boa ] %
74     ] [ , ] if ;
75
76 M: quotation rewrite-element rewrite-sugar* ;
77
78 M: lambda rewrite-element rewrite-sugar* ;
79
80 M: let rewrite-element let-form-in-literal-error ;
81
82 M: local rewrite-element , ;
83
84 M: local-reader rewrite-element , ;
85
86 M: local-writer rewrite-element
87     local-writer-in-literal-error ;
88
89 M: word rewrite-element <wrapper> , ;
90
91 : rewrite-wrapper ( wrapper -- )
92     dup rewrite-literal? [ wrapped>> rewrite-element ] [ , ] if ;
93
94 M: wrapper rewrite-element
95     rewrite-wrapper \ <wrapper> , ;
96
97 M: object rewrite-element , ;
98
99 M: array rewrite-sugar* rewrite-element ;
100
101 M: vector rewrite-sugar* rewrite-element ;
102
103 M: tuple rewrite-sugar* rewrite-element ;
104
105 M: def rewrite-sugar* , ;
106
107 M: multi-def rewrite-sugar* , ;
108
109 M: hashtable rewrite-sugar* rewrite-element ;
110
111 M: wrapper rewrite-sugar*
112     rewrite-wrapper ;
113
114 M: word rewrite-sugar*
115     dup { load-locals get-local drop-locals } member-eq?
116     [ >r/r>-in-lambda-error ] [ call-next-method ] if ;
117
118 M: object rewrite-sugar* , ;
119
120 M: let rewrite-sugar*
121     body>> quotation-rewrite % ;