"Explicit retain stack manipulation is not permitted in fried quotations" ;
: check-fry ( quot -- quot )
- dup { >r r> load-locals get-local drop-locals } intersect
- empty? [ >r/r>-in-fry-error ] unless ;
-
-: shallow-fry ( quot -- quot' )
- check-fry
- [ dup \ @ = [ drop [ _ call ] ] [ 1array ] if ] map concat
- { _ } split [ length 1- [ncurry] ] [ spread>quot ] bi prefix ;
+ dup { load-local load-locals get-local drop-locals } intersect
+ [ >r/r>-in-fry-error ] unless-empty ;
PREDICATE: fry-specifier < word { _ @ } memq? ;
M: fry-specifier count-inputs drop 1 ;
M: object count-inputs drop 0 ;
+GENERIC: deep-fry ( obj -- )
+
+: shallow-fry ( quot -- quot' curry# )
+ check-fry
+ [ [ deep-fry ] each ] [ ] make
+ [ dup \ @ = [ drop [ _ call ] ] [ 1array ] if ] map concat
+ { _ } split [ spread>quot ] [ length 1 - ] bi ;
+
PRIVATE>
-: fry ( quot -- quot' )
- [
- [
- dup callable? [
- [ count-inputs \ _ <repetition> % ] [ fry % ] bi
- ] [ , ] if
- ] each
- ] [ ] make shallow-fry ;
+: fry ( quot -- quot' ) shallow-fry [ncurry] swap prefix ;
+
+M: callable deep-fry
+ [ count-inputs \ _ <repetition> % ] [ fry % ] bi ;
+
+M: object deep-fry , ;
-: '[ \ ] parse-until fry over push-all ; parsing
+SYNTAX: '[ parse-quotation fry over push-all ;