From: John Benediktsson Date: Sat, 20 Mar 2021 03:59:22 +0000 (-0700) Subject: locals.rewrite: merge all locals.rewrite.* code... X-Git-Tag: 0.99~2408 X-Git-Url: https://gitweb.factorcode.org/gitweb.cgi?p=factor.git;a=commitdiff_plain;h=10b15e91c3c621e3785c4f3d5920097bc83d9cbd locals.rewrite: merge all locals.rewrite.* code... --- diff --git a/core/locals/parser/parser.factor b/core/locals/parser/parser.factor index 45dfaa815f..06be0bff16 100644 --- a/core/locals/parser/parser.factor +++ b/core/locals/parser/parser.factor @@ -1,7 +1,7 @@ ! Copyright (C) 2007, 2009 Slava Pestov, Eduardo Cavazos. ! See http://factorcode.org/license.txt for BSD license. USING: accessors arrays assocs effects.parser generic.parser -kernel lexer locals.errors locals.rewrite.closures locals.types +kernel lexer locals.errors locals.rewrite locals.types make namespaces parser quotations sequences splitting vocabs.parser words ; IN: locals.parser diff --git a/core/locals/rewrite/closures/closures.factor b/core/locals/rewrite/closures/closures.factor deleted file mode 100644 index 36762575cf..0000000000 --- a/core/locals/rewrite/closures/closures.factor +++ /dev/null @@ -1,55 +0,0 @@ -! Copyright (C) 2007, 2008 Slava Pestov, Eduardo Cavazos. -! See http://factorcode.org/license.txt for BSD license. -USING: accessors kernel locals.rewrite.point-free -locals.rewrite.sugar locals.types macros.expander make -quotations sequences sets words ; -IN: locals.rewrite.closures - -! Step 2: identify free variables and make them into explicit -! parameters of lambdas which are curried on - -GENERIC: rewrite-closures* ( obj -- ) - -: (rewrite-closures) ( form -- form' ) - [ [ rewrite-closures* ] each ] [ ] make ; - -: rewrite-closures ( form -- form' ) - expand-macros (rewrite-sugar) (rewrite-closures) point-free ; - -GENERIC: defs-vars* ( seq form -- seq' ) - -: defs-vars ( form -- vars ) { } [ defs-vars* ] reduce members ; - -M: multi-def defs-vars* locals>> [ unquote suffix ] each ; - -M: quotation defs-vars* [ defs-vars* ] each ; - -M: object defs-vars* drop ; - -GENERIC: uses-vars* ( seq form -- seq' ) - -: uses-vars ( form -- vars ) { } [ uses-vars* ] reduce members ; - -M: local-writer uses-vars* "local-reader" word-prop suffix ; - -M: lexical uses-vars* suffix ; - -M: quote uses-vars* local>> uses-vars* ; - -M: object uses-vars* drop ; - -M: quotation uses-vars* [ uses-vars* ] each ; - -: free-vars ( form -- seq ) - [ uses-vars ] [ defs-vars ] bi diff ; - -M: callable rewrite-closures* - ! Turn free variables into bound variables, curry them - ! onto the body - dup free-vars [ ] map - [ % ] - [ var-defs prepend (rewrite-closures) point-free , ] - [ length \ curry % ] - tri ; - -M: object rewrite-closures* , ; diff --git a/core/locals/rewrite/closures/summary.txt b/core/locals/rewrite/closures/summary.txt deleted file mode 100644 index d0a28aad4f..0000000000 --- a/core/locals/rewrite/closures/summary.txt +++ /dev/null @@ -1 +0,0 @@ -Rewriting closures to not have any free variables diff --git a/core/locals/rewrite/point-free/point-free.factor b/core/locals/rewrite/point-free/point-free.factor deleted file mode 100644 index e956062956..0000000000 --- a/core/locals/rewrite/point-free/point-free.factor +++ /dev/null @@ -1,48 +0,0 @@ -! Copyright (C) 2007, 2008 Slava Pestov, Eduardo Cavazos. -! See http://factorcode.org/license.txt for BSD license. -USING: accessors arrays combinators fry.private kernel -locals.backend locals.errors locals.types make math quotations -sequences words ; -IN: locals.rewrite.point-free - -! Step 3: rewrite locals usage within a single quotation into -! retain stack manipulation - -: local-index ( args obj -- n ) - 2dup '[ unquote _ eq? ] find drop - [ 2nip ] [ bad-local ] if* ; - -: read-local-quot ( args obj -- quot ) - local-index neg [ get-local ] curry ; - -GENERIC: localize ( args obj -- args quot ) - -M: local localize dupd read-local-quot ; - -M: quote localize dupd local>> read-local-quot ; - -M: local-reader localize dupd read-local-quot [ local-value ] append ; - -M: local-writer localize - dupd "local-reader" word-prop - read-local-quot [ set-local-value ] append ; - -M: multi-def localize - locals>> - [ prepend ] - [ [ [ local-reader? ] dip '[ [ 1array ] _ [ndip] ] [ [ ] ] if ] map-index concat ] - [ - length { - { [ dup 1 > ] [ [ load-locals ] curry ] } - { [ dup 1 = ] [ drop [ load-local ] ] } - [ drop [ ] ] - } cond - ] tri append ; - -M: object localize 1quotation ; - -: drop-locals-quot ( args -- ) - [ length , [ drop-locals ] % ] unless-empty ; - -: point-free ( quot -- newquot ) - [ { } swap [ localize % ] each drop-locals-quot ] [ ] make ; diff --git a/core/locals/rewrite/point-free/summary.txt b/core/locals/rewrite/point-free/summary.txt deleted file mode 100644 index 40ab193d72..0000000000 --- a/core/locals/rewrite/point-free/summary.txt +++ /dev/null @@ -1 +0,0 @@ -Rewriting applicative code to use the retain stack instead of named values diff --git a/core/locals/rewrite/sugar/sugar.factor b/core/locals/rewrite/sugar/sugar.factor deleted file mode 100644 index 8dc3babed4..0000000000 --- a/core/locals/rewrite/sugar/sugar.factor +++ /dev/null @@ -1,115 +0,0 @@ -! Copyright (C) 2007, 2008 Slava Pestov, Eduardo Cavazos. -! See http://factorcode.org/license.txt for BSD license. -USING: accessors arrays assocs classes classes.tuple fry -sequences.generalizations hashtables kernel locals locals.backend -locals.errors locals.types make math quotations sequences vectors -words ; -IN: locals.rewrite.sugar - -! Step 1: rewrite [| into :> forms, turn -! literals with locals in them into code which constructs -! the literal after pushing locals on the stack - -GENERIC: rewrite-sugar* ( obj -- ) - -: (rewrite-sugar) ( form -- form' ) - [ rewrite-sugar* ] [ ] make ; - -GENERIC: quotation-rewrite ( form -- form' ) - -M: callable quotation-rewrite [ [ rewrite-sugar* ] each ] [ ] make ; - -: var-defs ( vars -- defs ) - [ [ ] ] [ 1quotation ] if-empty ; - -M: lambda quotation-rewrite - [ body>> ] [ vars>> var-defs ] bi prepend quotation-rewrite ; - -M: callable rewrite-sugar* quotation-rewrite , ; - -M: lambda rewrite-sugar* quotation-rewrite , ; - -GENERIC: rewrite-literal? ( obj -- ? ) - -M: special rewrite-literal? drop t ; - -M: array rewrite-literal? [ rewrite-literal? ] any? ; - -M: quotation rewrite-literal? [ rewrite-literal? ] any? ; - -M: vector rewrite-literal? [ rewrite-literal? ] any? ; - -M: wrapper rewrite-literal? wrapped>> rewrite-literal? ; - -M: hashtable rewrite-literal? >alist rewrite-literal? ; - -M: tuple rewrite-literal? tuple>array rewrite-literal? ; - -M: object rewrite-literal? drop f ; - -GENERIC: rewrite-element ( obj -- ) - -: rewrite-elements ( seq -- ) - [ rewrite-element ] each ; - -: rewrite-sequence ( seq -- ) - [ rewrite-elements ] [ length ] [ 0 head ] tri '[ _ _ nsequence ] % ; - -M: array rewrite-element - dup rewrite-literal? [ rewrite-sequence ] [ , ] if ; - -M: vector rewrite-element - dup rewrite-literal? [ rewrite-sequence ] [ , ] if ; - -M: hashtable rewrite-element - dup rewrite-literal? [ >alist rewrite-sequence \ >hashtable , ] [ , ] if ; - -M: tuple rewrite-element - dup rewrite-literal? [ - [ tuple-slots rewrite-elements ] [ class-of ] bi '[ _ boa ] % - ] [ , ] if ; - -M: quotation rewrite-element rewrite-sugar* ; - -M: lambda rewrite-element rewrite-sugar* ; - -M: let rewrite-element let-form-in-literal-error ; - -M: local rewrite-element , ; - -M: local-reader rewrite-element , ; - -M: local-writer rewrite-element - local-writer-in-literal-error ; - -M: word rewrite-element , ; - -: rewrite-wrapper ( wrapper -- ) - dup rewrite-literal? [ wrapped>> rewrite-element ] [ , ] if ; - -M: wrapper rewrite-element - rewrite-wrapper \ , ; - -M: object rewrite-element , ; - -M: array rewrite-sugar* rewrite-element ; - -M: vector rewrite-sugar* rewrite-element ; - -M: tuple rewrite-sugar* rewrite-element ; - -M: multi-def rewrite-sugar* , ; - -M: hashtable rewrite-sugar* rewrite-element ; - -M: wrapper rewrite-sugar* - rewrite-wrapper ; - -M: word rewrite-sugar* - dup { load-locals get-local drop-locals } member-eq? - [ >r/r>-in-lambda-error ] [ call-next-method ] if ; - -M: object rewrite-sugar* , ; - -M: let rewrite-sugar* - body>> quotation-rewrite % ; diff --git a/core/locals/rewrite/sugar/summary.txt b/core/locals/rewrite/sugar/summary.txt deleted file mode 100644 index 485bb844e4..0000000000 --- a/core/locals/rewrite/sugar/summary.txt +++ /dev/null @@ -1 +0,0 @@ -Desugaring locals in literals and let binding diff --git a/core/locals/rewrite/summary.txt b/core/locals/rewrite/summary.txt new file mode 100644 index 0000000000..04070f15c5 --- /dev/null +++ b/core/locals/rewrite/summary.txt @@ -0,0 +1 @@ +Rewriting locals to bindings, closures, and retain stack usage. diff --git a/extra/smalltalk/compiler/compiler-tests.factor b/extra/smalltalk/compiler/compiler-tests.factor index 5b558a8b4f..60b24c5644 100644 --- a/extra/smalltalk/compiler/compiler-tests.factor +++ b/extra/smalltalk/compiler/compiler-tests.factor @@ -1,5 +1,5 @@ USING: smalltalk.compiler tools.test prettyprint smalltalk.ast -smalltalk.compiler.lexenv stack-checker locals.rewrite.closures +smalltalk.compiler.lexenv stack-checker locals.rewrite kernel accessors compiler.units sequences arrays ; IN: smalltalk.compiler.tests diff --git a/extra/smalltalk/compiler/return/return.factor b/extra/smalltalk/compiler/return/return.factor index f34aba012b..673628ae6d 100644 --- a/extra/smalltalk/compiler/return/return.factor +++ b/extra/smalltalk/compiler/return/return.factor @@ -1,7 +1,7 @@ ! Copyright (C) 2009 Slava Pestov. ! See http://factorcode.org/license.txt for BSD license. USING: accessors arrays combinators.short-circuit continuations -fry generalizations kernel locals locals.types locals.rewrite.closures +fry generalizations kernel locals locals.types locals.rewrite namespaces make sequences smalltalk.ast ; IN: smalltalk.compiler.return diff --git a/extra/smalltalk/listener/listener.factor b/extra/smalltalk/listener/listener.factor index dd65a7a95b..37418f9ef7 100644 --- a/extra/smalltalk/listener/listener.factor +++ b/extra/smalltalk/listener/listener.factor @@ -1,7 +1,7 @@ ! Copyright (C) 2009 Slava Pestov. ! See http://factorcode.org/license.txt for BSD license. USING: kernel prettyprint io io.styles colors.constants compiler.units -fry debugger sequences locals.rewrite.closures smalltalk.ast +fry debugger sequences locals.rewrite smalltalk.ast smalltalk.eval smalltalk.printer smalltalk.listener ; IN: smalltalk.listener