<?xml version="1.0" encoding="UTF-8"?>
<commit>
  <added type="array">
    <added>
      <filename>unmaintained/dns/cache/nx/nx.factor</filename>
    </added>
    <added>
      <filename>unmaintained/dns/cache/rr/rr.factor</filename>
    </added>
    <added>
      <filename>unmaintained/dns/dns.factor</filename>
    </added>
    <added>
      <filename>unmaintained/dns/forwarding/forwarding.factor</filename>
    </added>
    <added>
      <filename>unmaintained/dns/misc/misc.factor</filename>
    </added>
    <added>
      <filename>unmaintained/dns/resolver/resolver.factor</filename>
    </added>
    <added>
      <filename>unmaintained/dns/server/server.factor</filename>
    </added>
    <added>
      <filename>unmaintained/dns/stub/stub.factor</filename>
    </added>
    <added>
      <filename>unmaintained/dns/util/util.factor</filename>
    </added>
  </added>
  <modified type="array">
    <modified>
      <diff>@@ -98,7 +98,7 @@ IN: alien.parser
     type-name current-vocab create :&gt; type-word 
     type-word [ reset-generic ] [ reset-c-type ] bi
     void* type-word typedef
-    parameters return parse-arglist :&gt; callback-effect :&gt; types
+    parameters return parse-arglist :&gt; ( types callback-effect )
     type-word callback-effect &quot;callback-effect&quot; set-word-prop
     type-word lib &quot;callback-library&quot; set-word-prop
     type-word return types lib library-abi callback-quot (( quot -- alien )) ;</diff>
      <filename>basis/alien/parser/parser.factor</filename>
    </modified>
    <modified>
      <diff>@@ -113,7 +113,7 @@ PRIVATE&gt;
 M:: lsb0-bit-writer poke ( value n bs -- )
     value n &lt;widthed&gt; :&gt; widthed
     widthed
-    bs widthed&gt;&gt; #bits&gt;&gt; 8 swap - split-widthed :&gt; remainder :&gt; byte
+    bs widthed&gt;&gt; #bits&gt;&gt; 8 swap - split-widthed :&gt; ( byte remainder )
     byte bs widthed&gt;&gt; |widthed :&gt; new-byte
     new-byte #bits&gt;&gt; 8 = [
         new-byte bits&gt;&gt; bs bytes&gt;&gt; push
@@ -143,7 +143,7 @@ ERROR: not-enough-bits n bit-reader ;
     neg shift n bits ;
 
 :: adjust-bits ( n bs -- )
-    n 8 /mod :&gt; #bits :&gt; #bytes
+    n 8 /mod :&gt; ( #bytes #bits )
     bs [ #bytes + ] change-byte-pos
     bit-pos&gt;&gt; #bits + dup 8 &gt;= [
         8 - bs (&gt;&gt;bit-pos)</diff>
      <filename>basis/bitstreams/bitstreams.factor</filename>
    </modified>
    <modified>
      <diff>@@ -119,16 +119,16 @@ GENERIC: easter ( obj -- obj' )
 
 :: easter-month-day ( year -- month day )
     year 19 mod :&gt; a
-    year 100 /mod :&gt; c :&gt; b
-    b 4 /mod :&gt; e :&gt; d
+    year 100 /mod :&gt; ( b c )
+    b 4 /mod :&gt; ( d e )
     b 8 + 25 /i :&gt; f
     b f - 1 + 3 /i :&gt; g
     19 a * b + d - g - 15 + 30 mod :&gt; h
-    c 4 /mod :&gt; k :&gt; i
+    c 4 /mod :&gt; ( i k )
     32 2 e * + 2 i * + h - k - 7 mod :&gt; l
     a 11 h * + 22 l * + 451 /i :&gt; m
 
-    h l + 7 m * - 114 + 31 /mod 1 + :&gt; day :&gt; month
+    h l + 7 m * - 114 + 31 /mod 1 + :&gt; ( month day )
     month day ;
 
 M: integer easter ( year -- timestamp )</diff>
      <filename>basis/calendar/calendar.factor</filename>
    </modified>
    <modified>
      <diff>@@ -25,12 +25,11 @@ IN: channels.examples
     ] 3keep filter ;
 
 :: (sieve) ( prime c -- )
-    [let | p [ c from ] 
-           newc [ &lt;channel&gt; ] |
-        p prime to
-        [ newc p c filter ] &quot;Filter&quot; spawn drop
-        prime newc (sieve)
-    ] ;
+    c from :&gt; p
+    &lt;channel&gt; :&gt; newc
+    p prime to
+    [ newc p c filter ] &quot;Filter&quot; spawn drop
+    prime newc (sieve) ;
 
 : sieve ( prime -- ) 
     #! Send prime numbers to 'prime' channel</diff>
      <filename>basis/channels/examples/examples.factor</filename>
    </modified>
    <modified>
      <diff>@@ -24,7 +24,7 @@ PRIVATE&gt;
 
 :: hmac-stream ( stream key checksum -- value )
     checksum initialize-checksum-state :&gt; checksum-state
-    checksum key checksum-state init-key :&gt; Ki :&gt; Ko
+    checksum key checksum-state init-key :&gt; ( Ko Ki )
     checksum-state Ki add-checksum-bytes
     stream add-checksum-stream get-checksum
     checksum initialize-checksum-state</diff>
      <filename>basis/checksums/hmac/hmac.factor</filename>
    </modified>
    <modified>
      <diff>@@ -10,7 +10,7 @@ IN: classes.struct.bit-accessors
     [ 2^ 1 - ] bi@ swap bitnot bitand ;
 
 :: manipulate-bits ( offset bits step-quot -- quot shift-amount offset' bits' )
-    offset 8 /mod :&gt; start-bit :&gt; i
+    offset 8 /mod :&gt; ( i start-bit )
     start-bit bits + 8 min :&gt; end-bit
     start-bit end-bit ones-between :&gt; mask
     end-bit start-bit - :&gt; used-bits</diff>
      <filename>basis/classes/struct/bit-accessors/bit-accessors.factor</filename>
    </modified>
    <modified>
      <diff>@@ -22,12 +22,10 @@ IN: compiler.cfg.intrinsics.alien
     ] [ emit-primitive ] if ;
 
 :: inline-alien ( node quot test -- )
-    [let | infos [ node node-input-infos ] |
-        infos test call
-        [ infos quot call ]
-        [ node emit-primitive ]
-        if
-    ] ; inline
+    node node-input-infos :&gt; infos
+    infos test call
+    [ infos quot call ]
+    [ node emit-primitive ] if ; inline
 
 : inline-alien-getter? ( infos -- ? )
     [ first class&gt;&gt; c-ptr class&lt;= ]</diff>
      <filename>basis/compiler/cfg/intrinsics/alien/alien.factor</filename>
    </modified>
    <modified>
      <diff>@@ -43,17 +43,15 @@ IN: compiler.cfg.intrinsics.allot
     2 + cells array ^^allot ;
 
 :: emit-&lt;array&gt; ( node -- )
-    [let | len [ node node-input-infos first literal&gt;&gt; ] |
-        len expand-&lt;array&gt;? [
-            [let | elt [ ds-pop ]
-                   reg [ len ^^allot-array ] |
-                ds-drop
-                len reg array store-length
-                len reg elt array store-initial-element
-                reg ds-push
-            ]
-        ] [ node emit-primitive ] if
-    ] ;
+    node node-input-infos first literal&gt;&gt; :&gt; len
+    len expand-&lt;array&gt;? [
+        ds-pop :&gt; elt
+        len ^^allot-array :&gt; reg
+        ds-drop
+        len reg array store-length
+        len reg elt array store-initial-element
+        reg ds-push
+    ] [ node emit-primitive ] if ;
 
 : expand-(byte-array)? ( obj -- ? )
     dup integer? [ 0 1024 between? ] [ drop f ] if ;</diff>
      <filename>basis/compiler/cfg/intrinsics/allot/allot.factor</filename>
    </modified>
    <modified>
      <diff>@@ -156,18 +156,18 @@ MACRO: if-literals-match ( quots -- )
     [ [ ^^fill-vector ] [ ^^xor-vector ] bi ] if ;
 
 :: ((generate-compare-vector)) ( src1 src2 rep {cc,swap} -- dst )
-    {cc,swap} first2 :&gt; swap? :&gt; cc
+    {cc,swap} first2 :&gt; ( cc swap? )
     swap?
     [ src2 src1 rep cc ^^compare-vector ]
     [ src1 src2 rep cc ^^compare-vector ] if ;
 
 :: (generate-compare-vector) ( src1 src2 rep orig-cc -- dst )
-    rep orig-cc %compare-vector-ccs :&gt; not? :&gt; ccs
+    rep orig-cc %compare-vector-ccs :&gt; ( ccs not? )
 
     ccs empty?
     [ rep not? [ ^^fill-vector ] [ ^^zero-vector ] if ]
     [
-        ccs unclip :&gt; first-cc :&gt; rest-ccs
+        ccs unclip :&gt; ( rest-ccs first-cc )
         src1 src2 rep first-cc ((generate-compare-vector)) :&gt; first-dst
 
         rest-ccs first-dst</diff>
      <filename>basis/compiler/cfg/intrinsics/simd/simd.factor</filename>
    </modified>
    <modified>
      <diff>@@ -42,7 +42,7 @@ IN: compiler.cfg.intrinsics.slots
     first class&gt;&gt; immediate class&lt;= not ;
 
 :: (emit-set-slot) ( infos -- )
-    3inputs :&gt; slot :&gt; obj :&gt; src
+    3inputs :&gt; ( src obj slot )
 
     slot infos second value-tag ^^tag-offset&gt;slot :&gt; slot
 
@@ -54,7 +54,7 @@ IN: compiler.cfg.intrinsics.slots
 :: (emit-set-slot-imm) ( infos -- )
     ds-drop
 
-    2inputs :&gt; obj :&gt; src
+    2inputs :&gt; ( src obj )
 
     infos third literal&gt;&gt; :&gt; slot
     infos second value-tag :&gt; tag</diff>
      <filename>basis/compiler/cfg/intrinsics/slots/slots.factor</filename>
    </modified>
    <modified>
      <diff>@@ -121,10 +121,9 @@ PRIVATE&gt;
 PRIVATE&gt;
 
 :: live-out? ( vreg node -- ? )
-    [let | def [ vreg def-of ] |
-        {
-            { [ node def eq? ] [ vreg uses-of def only? not ] }
-            { [ def node strictly-dominates? ] [ vreg node (live-out?) ] }
-            [ f ]
-        } cond
-    ] ;
+    vreg def-of :&gt; def
+    {
+        { [ node def eq? ] [ vreg uses-of def only? not ] }
+        { [ def node strictly-dominates? ] [ vreg node (live-out?) ] }
+        [ f ]
+    } cond ;</diff>
      <filename>basis/compiler/cfg/ssa/liveness/liveness.factor</filename>
    </modified>
    <modified>
      <diff>@@ -39,14 +39,13 @@ M: #enter-recursive remove-dead-code*
     2bi ;
 
 :: (drop-call-recursive-outputs) ( inputs outputs -- #shuffle )
-    [let* | new-live-outputs [ inputs outputs filter-corresponding make-values ]
-            live-outputs [ outputs filter-live ] |
-        new-live-outputs
-        live-outputs
-        live-outputs
-        new-live-outputs
-        drop-values
-    ] ;
+    inputs outputs filter-corresponding make-values :&gt; new-live-outputs
+    outputs filter-live :&gt; live-outputs
+    new-live-outputs
+    live-outputs
+    live-outputs
+    new-live-outputs
+    drop-values ;
 
 : drop-call-recursive-outputs ( node -- #shuffle )
     dup [ label&gt;&gt; return&gt;&gt; in-d&gt;&gt; ] [ out-d&gt;&gt; ] bi
@@ -60,22 +59,20 @@ M: #call-recursive remove-dead-code*
     tri 3array ;
 
 :: drop-recursive-inputs ( node -- shuffle )
-    [let* | shuffle [ node [ in-d&gt;&gt; ] [ label&gt;&gt; enter-out&gt;&gt; ] bi drop-dead-inputs ]
-            new-outputs [ shuffle out-d&gt;&gt; ] |
-        node new-outputs
-        [ [ label&gt;&gt; enter-recursive&gt;&gt; ] dip &gt;&gt;in-d drop ] [ &gt;&gt;in-d drop ] 2bi
-        shuffle
-    ] ;
+    node [ in-d&gt;&gt; ] [ label&gt;&gt; enter-out&gt;&gt; ] bi drop-dead-inputs :&gt; shuffle
+    shuffle out-d&gt;&gt; :&gt; new-outputs
+    node new-outputs
+    [ [ label&gt;&gt; enter-recursive&gt;&gt; ] dip &gt;&gt;in-d drop ] [ &gt;&gt;in-d drop ] 2bi
+    shuffle ;
 
 :: drop-recursive-outputs ( node -- shuffle )
-    [let* | return [ node label&gt;&gt; return&gt;&gt; ]
-            new-inputs [ return in-d&gt;&gt; filter-live ]
-            new-outputs [ return [ in-d&gt;&gt; ] [ out-d&gt;&gt; ] bi filter-corresponding ] |
-        return
-        [ new-inputs &gt;&gt;in-d new-outputs &gt;&gt;out-d drop ]
-        [ drop-dead-outputs ]
-        bi
-    ] ;
+    node label&gt;&gt; return&gt;&gt; :&gt; return
+    return in-d&gt;&gt; filter-live :&gt; new-inputs
+    return [ in-d&gt;&gt; ] [ out-d&gt;&gt; ] bi filter-corresponding :&gt; new-outputs
+    return
+    [ new-inputs &gt;&gt;in-d new-outputs &gt;&gt;out-d drop ]
+    [ drop-dead-outputs ]
+    bi ;
 
 M: #recursive remove-dead-code* ( node -- nodes )
     [ drop-recursive-inputs ]</diff>
      <filename>basis/compiler/tree/dead-code/recursive/recursive.factor</filename>
    </modified>
    <modified>
      <diff>@@ -71,14 +71,13 @@ M: #alien-indirect compute-live-values* nip look-at-inputs ;
     filter-corresponding zip #data-shuffle ; inline
 
 :: drop-dead-values ( outputs -- #shuffle )
-    [let* | new-outputs [ outputs make-values ]
-            live-outputs [ outputs filter-live ] |
-        new-outputs
-        live-outputs
-        outputs
-        new-outputs
-        drop-values
-    ] ;
+    outputs make-values :&gt; new-outputs
+    outputs filter-live :&gt; live-outputs
+    new-outputs
+    live-outputs
+    outputs
+    new-outputs
+    drop-values ;
 
 : drop-dead-outputs ( node -- #shuffle )
     dup out-d&gt;&gt; drop-dead-values [ in-d&gt;&gt; &gt;&gt;out-d drop ] keep ;</diff>
      <filename>basis/compiler/tree/dead-code/simple/simple.factor</filename>
    </modified>
    <modified>
      <diff>@@ -159,12 +159,11 @@ IN: compiler.tree.propagation.known-words
 \ bitxor [ [ interval-bitxor ] [ integer-valued ] binary-op ] each-derived-op
 
 :: (comparison-constraints) ( in1 in2 op -- constraint )
-    [let | i1 [ in1 value-info interval&gt;&gt; ]
-           i2 [ in2 value-info interval&gt;&gt; ] |
-       in1 i1 i2 op assumption is-in-interval
-       in2 i2 i1 op swap-comparison assumption is-in-interval
-       /\
-    ] ;
+    in1 value-info interval&gt;&gt; :&gt; i1
+    in2 value-info interval&gt;&gt; :&gt; i2
+    in1 i1 i2 op assumption is-in-interval
+    in2 i2 i1 op swap-comparison assumption is-in-interval
+    /\ ;
 
 :: comparison-constraints ( in1 in2 out op -- constraint )
     in1 in2 op (comparison-constraints) out t--&gt;</diff>
      <filename>basis/compiler/tree/propagation/known-words/known-words.factor</filename>
    </modified>
    <modified>
      <diff>@@ -36,13 +36,11 @@ yield-hook [ [ ] ] initialize
 : penultimate ( seq -- elt ) [ length 2 - ] keep nth ;
 
 :: compress-path ( source assoc -- destination )
-    [let | destination [ source assoc at ] |
-        source destination = [ source ] [
-            [let | destination' [ destination assoc compress-path ] |
-                destination' destination = [
-                    destination' source assoc set-at
-                ] unless
-                destination'
-            ]
-        ] if
-    ] ;
+    source assoc at :&gt; destination
+    source destination = [ source ] [
+        destination assoc compress-path :&gt; destination'
+        destination' destination = [
+            destination' source assoc set-at
+        ] unless
+        destination'
+    ] if ;</diff>
      <filename>basis/compiler/utilities/utilities.factor</filename>
    </modified>
    <modified>
      <diff>@@ -5,27 +5,25 @@ FROM: sequences =&gt; 3append ;
 IN: concurrency.exchangers.tests
 
 :: exchanger-test ( -- string )
-    [let |
-        ex [ &lt;exchanger&gt; ]
-        c [ 2 &lt;count-down&gt; ]
-        v1! [ f ]
-        v2! [ f ]
-        pr [ &lt;promise&gt; ] |
+    &lt;exchanger&gt; :&gt; ex
+    2 &lt;count-down&gt; :&gt; c
+    f :&gt; v1!
+    f :&gt; v2!
+    &lt;promise&gt; :&gt; pr
 
-        [
-            c await
-            v1 &quot;, &quot; v2 3append pr fulfill
-        ] &quot;Awaiter&quot; spawn drop
+    [
+        c await
+        v1 &quot;, &quot; v2 3append pr fulfill
+    ] &quot;Awaiter&quot; spawn drop
 
-        [
-            &quot;Goodbye world&quot; ex exchange v1! c count-down
-        ] &quot;Exchanger 1&quot; spawn drop
+    [
+        &quot;Goodbye world&quot; ex exchange v1! c count-down
+    ] &quot;Exchanger 1&quot; spawn drop
 
-        [
-            &quot;Hello world&quot; ex exchange v2! c count-down
-        ] &quot;Exchanger 2&quot; spawn drop
+    [
+        &quot;Hello world&quot; ex exchange v2! c count-down
+    ] &quot;Exchanger 2&quot; spawn drop
 
-        pr ?promise
-    ] ;
+    pr ?promise ;
 
 [ &quot;Hello world, Goodbye world&quot; ] [ exchanger-test ] unit-test</diff>
      <filename>basis/concurrency/exchangers/exchangers-tests.factor</filename>
    </modified>
    <modified>
      <diff>@@ -3,46 +3,41 @@ kernel threads locals accessors calendar ;
 IN: concurrency.flags.tests
 
 :: flag-test-1 ( -- val )
-    [let | f [ &lt;flag&gt; ] |
-        [ f raise-flag ] &quot;Flag test&quot; spawn drop
-        f lower-flag
-        f value&gt;&gt;
-    ] ;
+    &lt;flag&gt; :&gt; f
+    [ f raise-flag ] &quot;Flag test&quot; spawn drop
+    f lower-flag
+    f value&gt;&gt; ;
 
 [ f ] [ flag-test-1 ] unit-test
 
 :: flag-test-2 ( -- ? )
-    [let | f [ &lt;flag&gt; ] |
-        [ 1 seconds sleep f raise-flag ] &quot;Flag test&quot; spawn drop
-        f lower-flag
-        f value&gt;&gt;
-    ] ;
+    &lt;flag&gt; :&gt; f
+    [ 1 seconds sleep f raise-flag ] &quot;Flag test&quot; spawn drop
+    f lower-flag
+    f value&gt;&gt; ;
 
 [ f ] [ flag-test-2 ] unit-test
 
 :: flag-test-3 ( -- val )
-    [let | f [ &lt;flag&gt; ] |
-        f raise-flag
-        f value&gt;&gt;
-    ] ;
+    &lt;flag&gt; :&gt; f
+    f raise-flag
+    f value&gt;&gt; ;
 
 [ t ] [ flag-test-3 ] unit-test
 
 :: flag-test-4 ( -- val )
-    [let | f [ &lt;flag&gt; ] |
-        [ f raise-flag ] &quot;Flag test&quot; spawn drop
-        f wait-for-flag
-        f value&gt;&gt;
-    ] ;
+    &lt;flag&gt; :&gt; f
+    [ f raise-flag ] &quot;Flag test&quot; spawn drop
+    f wait-for-flag
+    f value&gt;&gt; ;
 
 [ t ] [ flag-test-4 ] unit-test
 
 :: flag-test-5 ( -- val )
-    [let | f [ &lt;flag&gt; ] |
-        [ 1 seconds sleep f raise-flag ] &quot;Flag test&quot; spawn drop
-        f wait-for-flag
-        f value&gt;&gt;
-    ] ;
+    &lt;flag&gt; :&gt; f
+    [ 1 seconds sleep f raise-flag ] &quot;Flag test&quot; spawn drop
+    f wait-for-flag
+    f value&gt;&gt; ;
 
 [ t ] [ flag-test-5 ] unit-test
 </diff>
      <filename>basis/concurrency/flags/flags-tests.factor</filename>
    </modified>
    <modified>
      <diff>@@ -4,57 +4,55 @@ threads sequences calendar accessors ;
 IN: concurrency.locks.tests
 
 :: lock-test-0 ( -- v )
-    [let | v [ V{ } clone ]
-           c [ 2 &lt;count-down&gt; ] |
-
-           [
-               yield
-               1 v push
-               yield
-               2 v push
-               c count-down
-           ] &quot;Lock test 1&quot; spawn drop
-
-           [
-               yield
-               3 v push
-               yield
-               4 v push
-               c count-down
-           ] &quot;Lock test 2&quot; spawn drop
-
-           c await
-           v
-    ] ;
+    V{ } clone :&gt; v
+    2 &lt;count-down&gt; :&gt; c
+
+    [
+        yield
+        1 v push
+        yield
+        2 v push
+        c count-down
+    ] &quot;Lock test 1&quot; spawn drop
+
+    [
+        yield
+        3 v push
+        yield
+        4 v push
+        c count-down
+    ] &quot;Lock test 2&quot; spawn drop
+
+    c await
+    v ;
 
 :: lock-test-1 ( -- v )
-    [let | v [ V{ } clone ]
-           l [ &lt;lock&gt; ]
-           c [ 2 &lt;count-down&gt; ] |
-
-           [
-               l [
-                   yield
-                   1 v push
-                   yield
-                   2 v push
-               ] with-lock
-               c count-down
-           ] &quot;Lock test 1&quot; spawn drop
-
-           [
-               l [
-                   yield
-                   3 v push
-                   yield
-                   4 v push
-               ] with-lock
-               c count-down
-           ] &quot;Lock test 2&quot; spawn drop
-
-           c await
-           v
-    ] ;
+    V{ } clone :&gt; v
+    &lt;lock&gt; :&gt; l
+    2 &lt;count-down&gt; :&gt; c
+
+    [
+        l [
+            yield
+            1 v push
+            yield
+            2 v push
+        ] with-lock
+        c count-down
+    ] &quot;Lock test 1&quot; spawn drop
+
+    [
+        l [
+            yield
+            3 v push
+            yield
+            4 v push
+        ] with-lock
+        c count-down
+    ] &quot;Lock test 2&quot; spawn drop
+
+    c await
+    v ;
 
 [ V{ 1 3 2 4 } ] [ lock-test-0 ] unit-test
 [ V{ 1 2 3 4 } ] [ lock-test-1 ] unit-test
@@ -80,98 +78,96 @@ IN: concurrency.locks.tests
 [ ] [ &lt;rw-lock&gt; dup [ [ ] with-read-lock ] with-write-lock ] unit-test
 
 :: rw-lock-test-1 ( -- v )
-    [let | l [ &lt;rw-lock&gt; ]
-           c [ 1 &lt;count-down&gt; ]
-           c' [ 1 &lt;count-down&gt; ]
-           c'' [ 4 &lt;count-down&gt; ]
-           v [ V{ } clone ] |
-
-           [
-               l [
-                   1 v push
-                   c count-down
-                   yield
-                   3 v push
-               ] with-read-lock
-               c'' count-down
-           ] &quot;R/W lock test 1&quot; spawn drop
-
-           [
-               c await
-               l [
-                   4 v push
-                   1 seconds sleep
-                   5 v push
-               ] with-write-lock
-               c'' count-down
-           ] &quot;R/W lock test 2&quot; spawn drop
-
-           [
-               c await
-               l [
-                   2 v push
-                   c' count-down
-               ] with-read-lock
-               c'' count-down
-           ] &quot;R/W lock test 4&quot; spawn drop
-
-           [
-               c' await
-               l [
-                   6 v push
-               ] with-write-lock
-               c'' count-down
-           ] &quot;R/W lock test 5&quot; spawn drop
-
-           c'' await
-           v
-    ] ;
+    &lt;rw-lock&gt; :&gt; l
+    1 &lt;count-down&gt; :&gt; c
+    1 &lt;count-down&gt; :&gt; c'
+    4 &lt;count-down&gt; :&gt; c''
+    V{ } clone :&gt; v
+
+    [
+        l [
+            1 v push
+            c count-down
+            yield
+            3 v push
+        ] with-read-lock
+        c'' count-down
+    ] &quot;R/W lock test 1&quot; spawn drop
+
+    [
+        c await
+        l [
+            4 v push
+            1 seconds sleep
+            5 v push
+        ] with-write-lock
+        c'' count-down
+    ] &quot;R/W lock test 2&quot; spawn drop
+
+    [
+        c await
+        l [
+            2 v push
+            c' count-down
+        ] with-read-lock
+        c'' count-down
+    ] &quot;R/W lock test 4&quot; spawn drop
+
+    [
+        c' await
+        l [
+            6 v push
+        ] with-write-lock
+        c'' count-down
+    ] &quot;R/W lock test 5&quot; spawn drop
+
+    c'' await
+    v ;
 
 [ V{ 1 2 3 4 5 6 } ] [ rw-lock-test-1 ] unit-test
 
 :: rw-lock-test-2 ( -- v )
-    [let | l [ &lt;rw-lock&gt; ]
-           c [ 1 &lt;count-down&gt; ]
-           c' [ 2 &lt;count-down&gt; ]
-           v [ V{ } clone ] |
-
-           [
-               l [
-                   1 v push
-                   c count-down
-                   1 seconds sleep
-                   2 v push
-               ] with-write-lock
-               c' count-down
-           ] &quot;R/W lock test 1&quot; spawn drop
-
-           [
-               c await
-               l [
-                   3 v push
-               ] with-read-lock
-               c' count-down
-           ] &quot;R/W lock test 2&quot; spawn drop
-
-           c' await
-           v
-    ] ;
+    &lt;rw-lock&gt; :&gt; l
+    1 &lt;count-down&gt; :&gt; c
+    2 &lt;count-down&gt; :&gt; c'
+    V{ } clone :&gt; v
+
+    [
+        l [
+            1 v push
+            c count-down
+            1 seconds sleep
+            2 v push
+        ] with-write-lock
+        c' count-down
+    ] &quot;R/W lock test 1&quot; spawn drop
+
+    [
+        c await
+        l [
+            3 v push
+        ] with-read-lock
+        c' count-down
+    ] &quot;R/W lock test 2&quot; spawn drop
+
+    c' await
+    v ;
 
 [ V{ 1 2 3 } ] [ rw-lock-test-2 ] unit-test
 
 ! Test lock timeouts
 :: lock-timeout-test ( -- v )
-    [let | l [ &lt;lock&gt; ] |
-        [
-            l [ 1 seconds sleep ] with-lock
-        ] &quot;Lock holder&quot; spawn drop
+    &lt;lock&gt; :&gt; l
 
-        [
-            l 1/10 seconds [ ] with-lock-timeout
-        ] &quot;Lock timeout-er&quot; spawn-linked drop
+    [
+        l [ 1 seconds sleep ] with-lock
+    ] &quot;Lock holder&quot; spawn drop
+
+    [
+        l 1/10 seconds [ ] with-lock-timeout
+    ] &quot;Lock timeout-er&quot; spawn-linked drop
 
-        receive
-    ] ;
+    receive ;
 
 [ lock-timeout-test ] [
     thread&gt;&gt; name&gt;&gt; &quot;Lock timeout-er&quot; =</diff>
      <filename>basis/concurrency/locks/locks-tests.factor</filename>
    </modified>
    <modified>
      <diff>@@ -112,35 +112,34 @@ TUPLE: line &lt; disposable line metrics image loc dim ;
     [
         line new-disposable
 
-        [let* | open-font [ font cache-font ]
-                line [ string open-font font foreground&gt;&gt; &lt;CTLine&gt; |CFRelease ]
-
-                rect [ line line-rect ]
-                (loc) [ rect origin&gt;&gt; CGPoint&gt;loc ]
-                (dim) [ rect size&gt;&gt; CGSize&gt;dim ]
-                (ext) [ (loc) (dim) v+ ]
-                loc [ (loc) [ floor ] map ]
-                ext [ (loc) (dim) [ + ceiling ] 2map ]
-                dim [ ext loc [ - &gt;integer 1 max ] 2map ]
-                metrics [ open-font line compute-line-metrics ] |
-
-            line &gt;&gt;line
-
-            metrics &gt;&gt;metrics
-
-            dim [
-                {
-                    [ font dim fill-background ]
-                    [ loc dim line string fill-selection-background ]
-                    [ loc set-text-position ]
-                    [ [ line ] dip CTLineDraw ]
-                } cleave
-            ] make-bitmap-image &gt;&gt;image
-
-            metrics loc dim line-loc &gt;&gt;loc
-
-            metrics metrics&gt;dim &gt;&gt;dim
-        ]
+        font cache-font :&gt; open-font
+        string open-font font foreground&gt;&gt; &lt;CTLine&gt; |CFRelease :&gt; line
+
+        line line-rect :&gt; rect
+        rect origin&gt;&gt; CGPoint&gt;loc :&gt; (loc)
+        rect size&gt;&gt; CGSize&gt;dim :&gt; (dim)
+        (loc) (dim) v+ :&gt; (ext)
+        (loc) [ floor ] map :&gt; loc
+        (loc) (dim) [ + ceiling ] 2map :&gt; ext
+        ext loc [ - &gt;integer 1 max ] 2map :&gt; dim
+        open-font line compute-line-metrics :&gt; metrics
+
+        line &gt;&gt;line
+
+        metrics &gt;&gt;metrics
+
+        dim [
+            {
+                [ font dim fill-background ]
+                [ loc dim line string fill-selection-background ]
+                [ loc set-text-position ]
+                [ [ line ] dip CTLineDraw ]
+            } cleave
+        ] make-bitmap-image &gt;&gt;image
+
+        metrics loc dim line-loc &gt;&gt;loc
+
+        metrics metrics&gt;dim &gt;&gt;dim
     ] with-destructors ;
 
 M: line dispose* line&gt;&gt; CFRelease ;</diff>
      <filename>basis/core-text/core-text.factor</filename>
    </modified>
    <modified>
      <diff>@@ -504,11 +504,11 @@ M: ppc %compare [ (%compare) ] 2dip %boolean ;
 M: ppc %compare-imm [ (%compare-imm) ] 2dip %boolean ;
 
 M:: ppc %compare-float-ordered ( dst src1 src2 cc temp -- )
-    src1 src2 cc negate-cc \ (%compare-float-ordered) (%compare-float) :&gt; branch2 :&gt; branch1
+    src1 src2 cc negate-cc \ (%compare-float-ordered) (%compare-float) :&gt; ( branch1 branch2 )
     dst temp branch1 branch2 (%boolean) ;
 
 M:: ppc %compare-float-unordered ( dst src1 src2 cc temp -- )
-    src1 src2 cc negate-cc \ (%compare-float-unordered) (%compare-float) :&gt; branch2 :&gt; branch1
+    src1 src2 cc negate-cc \ (%compare-float-unordered) (%compare-float) :&gt; ( branch1 branch2 )
     dst temp branch1 branch2 (%boolean) ;
 
 :: %branch ( label cc -- )
@@ -534,11 +534,11 @@ M:: ppc %compare-imm-branch ( label src1 src2 cc -- )
     branch2 [ label branch2 execute( label -- ) ] when ; inline
 
 M:: ppc %compare-float-ordered-branch ( label src1 src2 cc -- )
-    src1 src2 cc \ (%compare-float-ordered) (%compare-float) :&gt; branch2 :&gt; branch1
+    src1 src2 cc \ (%compare-float-ordered) (%compare-float) :&gt; ( branch1 branch2 )
     label branch1 branch2 (%branch) ;
 
 M:: ppc %compare-float-unordered-branch ( label src1 src2 cc -- )
-    src1 src2 cc \ (%compare-float-unordered) (%compare-float) :&gt; branch2 :&gt; branch1
+    src1 src2 cc \ (%compare-float-unordered) (%compare-float) :&gt; ( branch1 branch2 )
     label branch1 branch2 (%branch) ;
 
 : load-from-frame ( dst n rep -- )</diff>
      <filename>basis/cpu/ppc/ppc.factor</filename>
    </modified>
    <modified>
      <diff>@@ -114,8 +114,8 @@ DEFER: (parse-paragraph)
 
 :: (take-until) ( state delimiter accum -- string/f state' )
     state empty? [ accum &quot;\n&quot; join f ] [
-        state unclip-slice :&gt; first :&gt; rest
-        first delimiter split1 :&gt; after :&gt; before
+        state unclip-slice :&gt; ( rest first )
+        first delimiter split1 :&gt; ( before after )
         before accum push
         after [
             accum &quot;\n&quot; join</diff>
      <filename>basis/farkup/farkup.factor</filename>
    </modified>
    <modified>
      <diff>@@ -68,10 +68,10 @@ ARTICLE: &quot;fry.philosophy&quot; &quot;Fried quotation philosophy&quot;
     &quot;'[ [ _ key? ] all? ] filter&quot;
     &quot;[ [ key? ] curry all? ] curry filter&quot;
 }
-&quot;There is a mapping from fried quotations to lexical closures as defined in the &quot; { $vocab-link &quot;locals&quot; } &quot; vocabulary. Namely, a fried quotation is equivalent to a &#8220;let&#8221; form where each local binding is only used once, and bindings are used in the same order in which they are defined. The following two lines are equivalent:&quot;
+&quot;There is a mapping from fried quotations to lexical closures as defined in the &quot; { $vocab-link &quot;locals&quot; } &quot; vocabulary. Namely, a fried quotation is equivalent to a &quot; { $snippet &quot;[| | ]&quot; } &quot; form where each local binding is only used once, and bindings are used in the same order in which they are defined. The following two lines are equivalent:&quot;
 { $code
     &quot;'[ 3 _ + 4 _ / ]&quot;
-    &quot;[let | a [ ] b [ ] | [ 3 a + 4 b / ] ]&quot;
+    &quot;[| a b | 3 a + 4 b / ]&quot;
 } ;
 
 ARTICLE: &quot;fry&quot; &quot;Fried quotations&quot;</diff>
      <filename>basis/fry/fry-docs.factor</filename>
    </modified>
    <modified>
      <diff>@@ -1,6 +1,6 @@
 ! Copyright (C) 2008, 2009 Slava Pestov.
 ! See http://factorcode.org/license.txt for BSD license.
-USING: accessors arrays classes.mixin classes.parser
+USING: accessors arrays assocs classes.mixin classes.parser
 classes.singleton classes.tuple classes.tuple.parser
 combinators effects.parser fry functors.backend generic
 generic.parser interpolate io.streams.string kernel lexer
@@ -144,10 +144,31 @@ DEFER: ;FUNCTOR delimiter
 : pop-functor-words ( -- )
     functor-words unuse-words ;
 
+: (parse-bindings) ( end -- )
+    dup parse-binding dup [
+        first2 [ make-local ] dip 2array ,
+        (parse-bindings)
+    ] [ 2drop ] if ;
+
+: with-bindings ( quot -- words assoc )
+    '[
+        in-lambda? on
+        _ H{ } make-assoc
+    ] { } make swap ; inline
+
+: parse-bindings ( end -- words assoc )
+    [
+        namespace use-words
+        (parse-bindings)
+        namespace unuse-words
+    ] with-bindings ;
+
 : parse-functor-body ( -- form )
     push-functor-words
-    &quot;WHERE&quot; parse-bindings*
-    [ \ ;FUNCTOR parse-until &gt;quotation ] ((parse-lambda)) &lt;let*&gt; 1quotation
+    &quot;WHERE&quot; parse-bindings
+    [ [ swap &lt;def&gt; suffix ] { } assoc&gt;map concat ]
+    [ [ \ ;FUNCTOR parse-until &gt;quotation ] ((parse-lambda)) ] bi*
+    [ ] append-as
     pop-functor-words ;
 
 : (FUNCTOR:) ( -- word def effect )</diff>
      <filename>basis/functors/functors.factor</filename>
    </modified>
    <modified>
      <diff>@@ -23,26 +23,24 @@ GENERIC: new-user ( user provider -- user/f )
 ! Password recovery support
 
 :: issue-ticket ( email username provider -- user/f )
-    [let | user [ username provider get-user ] |
-        user [
-            user email&gt;&gt; length 0 &gt; [
-                user email&gt;&gt; email = [
-                    user
-                    256 random-bits &gt;hex &gt;&gt;ticket
-                    dup provider update-user
-                ] [ f ] if
+    username provider get-user :&gt; user
+    user [
+        user email&gt;&gt; length 0 &gt; [
+            user email&gt;&gt; email = [
+                user
+                256 random-bits &gt;hex &gt;&gt;ticket
+                dup provider update-user
             ] [ f ] if
         ] [ f ] if
-    ] ;
+    ] [ f ] if ;
 
 :: claim-ticket ( ticket username provider -- user/f )
-    [let | user [ username provider get-user ] |
-        user [
-            user ticket&gt;&gt; ticket = [
-                user f &gt;&gt;ticket dup provider update-user
-            ] [ f ] if
+    username provider get-user :&gt; user
+    user [
+        user ticket&gt;&gt; ticket = [
+            user f &gt;&gt;ticket dup provider update-user
         ] [ f ] if
-    ] ;
+    ] [ f ] if ;
 
 ! For configuration
 </diff>
      <filename>basis/furnace/auth/providers/providers.factor</filename>
    </modified>
    <modified>
      <diff>@@ -16,7 +16,8 @@ IN: interpolate.tests
 ] unit-test
 
 [ &quot;Oops, I accidentally the whole economy...&quot; ] [
-    [let | noun [ &quot;economy&quot; ] |
+    [let
+        &quot;economy&quot; :&gt; noun
         [ I[ Oops, I accidentally the whole ${noun}...]I ] with-string-writer
     ]
 ] unit-test</diff>
      <filename>basis/interpolate/interpolate-tests.factor</filename>
    </modified>
    <modified>
      <diff>@@ -48,7 +48,8 @@ TUPLE: range ufirst ulast bfirst blast ;
     ] dip set-at ;
 
 : xml&gt;gb-data ( stream -- mapping ranges )
-    [let | mapping [ H{ } clone ] ranges [ V{ } clone ] |
+    [let
+        H{ } clone :&gt; mapping V{ } clone :&gt; ranges
         [
             dup contained? [ 
                 dup name&gt;&gt; main&gt;&gt; {
@@ -57,7 +58,7 @@ TUPLE: range ufirst ulast bfirst blast ;
                     [ 2drop ]
                 } case
             ] [ drop ] if
-        ] each-element mapping ranges 
+        ] each-element mapping ranges
     ] ;
 
 : unlinear ( num -- bytes )</diff>
      <filename>basis/io/encodings/gb18030/gb18030.factor</filename>
    </modified>
    <modified>
      <diff>@@ -125,14 +125,15 @@ concurrency.promises threads unix.process ;
 
 ! Killed processes were exiting with code 0 on FreeBSD
 [ f ] [
-    [let | p [ &lt;promise&gt; ]
-           s [ &lt;promise&gt; ] |
-       [
-           &quot;sleep 1000&quot; run-detached
-           [ p fulfill ] [ wait-for-process s fulfill ] bi
-       ] in-thread
-
-       p ?promise handle&gt;&gt; 9 kill drop
-       s ?promise 0 =
+    [let 
+        &lt;promise&gt; :&gt; p
+        &lt;promise&gt; :&gt; s
+        [
+            &quot;sleep 1000&quot; run-detached
+            [ p fulfill ] [ wait-for-process s fulfill ] bi
+        ] in-thread
+
+        p ?promise handle&gt;&gt; 9 kill drop
+        s ?promise 0 =
     ]
 ] unit-test</diff>
      <filename>basis/io/launcher/unix/unix-tests.factor</filename>
    </modified>
    <modified>
      <diff>@@ -12,14 +12,13 @@ IN: io.mmap.windows
     MapViewOfFile [ win32-error=0/f ] keep ;
 
 :: mmap-open ( path length access-mode create-mode protect access -- handle handle address )
-    [let | lo [ length 32 bits ]
-           hi [ length -32 shift 32 bits ] |
-        { &quot;SeCreateGlobalPrivilege&quot; &quot;SeLockMemoryPrivilege&quot; } [
-            path access-mode create-mode 0 open-file |dispose
-            dup handle&gt;&gt; f protect hi lo f create-file-mapping |dispose
-            dup handle&gt;&gt; access 0 0 0 map-view-of-file
-        ] with-privileges
-    ] ;
+    length 32 bits :&gt; lo
+    length -32 shift 32 bits :&gt; hi
+    { &quot;SeCreateGlobalPrivilege&quot; &quot;SeLockMemoryPrivilege&quot; } [
+        path access-mode create-mode 0 open-file |dispose
+        dup handle&gt;&gt; f protect hi lo f create-file-mapping |dispose
+        dup handle&gt;&gt; access 0 0 0 map-view-of-file
+    ] with-privileges ;
 
 TUPLE: win32-mapped-file file mapping ;
 </diff>
      <filename>basis/io/mmap/windows/windows.factor</filename>
    </modified>
    <modified>
      <diff>@@ -11,11 +11,10 @@ TUPLE: macosx-monitor &lt; monitor handle ;
     '[ first { +modify-file+ } _ queue-change ] each ;
 
 M:: macosx (monitor) ( path recursive? mailbox -- monitor )
-    [let | path [ path normalize-path ] |
-        path mailbox macosx-monitor new-monitor
-        dup [ enqueue-notifications ] curry
-        path 1array 0 0 &lt;event-stream&gt; &gt;&gt;handle
-    ] ;
+    path normalize-path :&gt; path
+    path mailbox macosx-monitor new-monitor
+    dup [ enqueue-notifications ] curry
+    path 1array 0 0 &lt;event-stream&gt; &gt;&gt;handle ;
 
 M: macosx-monitor dispose* handle&gt;&gt; dispose ;
 </diff>
      <filename>basis/io/monitors/macosx/macosx.factor</filename>
    </modified>
    <modified>
      <diff>@@ -35,10 +35,9 @@ TUPLE: openssl-context &lt; secure-context aliens sessions ;
     [| buf size rwflag password! |
         password [ B{ 0 } password! ] unless
 
-        [let | len [ password strlen ] |
-            buf password len 1 + size min memcpy
-            len
-        ]
+        password strlen :&gt; len
+        buf password len 1 + size min memcpy
+        len
     ] alien-callback ;
 
 : default-pasword ( ctx -- alien )</diff>
      <filename>basis/io/sockets/secure/openssl/openssl.factor</filename>
    </modified>
    <modified>
      <diff>@@ -120,7 +120,7 @@ CONSTANT: packet-size 65536
 [ packet-size malloc receive-buffer set-global ] &quot;io.sockets.unix&quot; add-init-hook
 
 :: do-receive ( port -- packet sockaddr )
-    port addr&gt;&gt; empty-sockaddr/size :&gt; len :&gt; sockaddr
+    port addr&gt;&gt; empty-sockaddr/size :&gt; ( sockaddr len )
     port handle&gt;&gt; handle-fd ! s
     receive-buffer get-global ! buf
     packet-size ! nbytes</diff>
      <filename>basis/io/sockets/unix/unix.factor</filename>
    </modified>
    <modified>
      <diff>@@ -25,11 +25,11 @@ IN: lcs
     [ [ + ] curry map ] with map ;
 
 :: run-lcs ( old new init step -- matrix )
-    [let | matrix [ old length 1 + new length 1 + init call ] |
-        old length [| i |
-            new length
-            [| j | i j matrix old new step loop-step ] each
-        ] each matrix ] ; inline
+    old length 1 + new length 1 + init call :&gt; matrix
+    old length [| i |
+        new length
+        [| j | i j matrix old new step loop-step ] each
+    ] each matrix ; inline
 PRIVATE&gt;
 
 : levenshtein ( old new -- n )</diff>
      <filename>basis/lcs/lcs.factor</filename>
    </modified>
    <modified>
      <diff>@@ -9,10 +9,10 @@ M: &gt;r/r&gt;-in-lambda-error summary
     drop
     &quot;Explicit retain stack manipulation is not permitted in lambda bodies&quot; ;
 
-ERROR: binding-form-in-literal-error ;
+ERROR: let-form-in-literal-error ;
 
-M: binding-form-in-literal-error summary
-    drop &quot;[let, [let* and [wlet not permitted inside literals&quot; ;
+M: let-form-in-literal-error summary
+    drop &quot;[let not permitted inside literals&quot; ;
 
 ERROR: local-writer-in-literal-error ;
 
@@ -27,7 +27,7 @@ M: local-word-in-literal-error summary
 ERROR: :&gt;-outside-lambda-error ;
 
 M: :&gt;-outside-lambda-error summary
-    drop &quot;:&gt; cannot be used outside of lambda expressions&quot; ;
+    drop &quot;:&gt; cannot be used outside of [let, [|, or :: forms&quot; ;
 
 ERROR: bad-local args obj ;
 </diff>
      <filename>basis/locals/errors/errors.factor</filename>
    </modified>
    <modified>
      <diff>@@ -6,7 +6,7 @@ IN: locals.fry
 
 ! Support for mixing locals with fry
 
-M: binding-form count-inputs body&gt;&gt; count-inputs ;
+M: let count-inputs body&gt;&gt; count-inputs ;
 
 M: lambda count-inputs body&gt;&gt; count-inputs ;
 
@@ -14,5 +14,5 @@ M: lambda deep-fry
     clone [ shallow-fry swap ] change-body
     [ [ vars&gt;&gt; length ] keep '[ _ _ mnswap @ ] , ] [ drop [ncurry] % ] 2bi ;
 
-M: binding-form deep-fry
+M: let deep-fry
     clone [ fry '[ @ call ] ] change-body , ;</diff>
      <filename>basis/locals/fry/fry.factor</filename>
    </modified>
    <modified>
      <diff>@@ -8,45 +8,30 @@ HELP: [|
 { $examples &quot;See &quot; { $link &quot;locals-examples&quot; } &quot;.&quot; } ;
 
 HELP: [let
-{ $syntax &quot;[let | var-1 [ value-1... ]\n        var-2 [ value-2... ]\n        ... |\n    body... ]&quot; }
-{ $description &quot;Evaluates each &quot; { $snippet &quot;value-n&quot; } &quot; form and binds its result to a new local variable named &quot; { $snippet &quot;var-n&quot; } &quot; lexically scoped to the &quot; { $snippet &quot;body&quot; } &quot;, then evaluates &quot; { $snippet &quot;body&quot; } &quot;. The &quot; { $snippet &quot;value-n&quot; } &quot; forms are evaluated in parallel, so a &quot; { $snippet &quot;value-n&quot; } &quot; form may not refer to previous &quot; { $snippet &quot;var-n&quot; } &quot; definitions inside the same &quot; { $link POSTPONE: [let } &quot; form, unlike &quot; { $link POSTPONE: [let* } &quot;.&quot; }
+{ $syntax &quot;[let code :&gt; var code :&gt; var code... ]&quot; }
+{ $description &quot;Establishes a new lexical scope for local variable bindings. Variables bound with &quot; { $link POSTPONE: :&gt; } &quot; within the body of the &quot; { $snippet &quot;[let&quot; } &quot; will be lexically scoped to the body of the &quot; { $snippet &quot;[let&quot; } &quot; form.&quot; }
 { $examples &quot;See &quot; { $link &quot;locals-examples&quot; } &quot;.&quot; } ;
 
-HELP: [let*
-{ $syntax &quot;[let* | var-1 [ value-1... ]\n        var-2 [ value-2... ]\n        ... |\n    body... ]&quot; }
-{ $description &quot;Evaluates each &quot; { $snippet &quot;value-n&quot; } &quot; form and binds its result to a new local variable named &quot; { $snippet &quot;var-n&quot; } &quot; lexically scoped to the &quot; { $snippet &quot;body&quot; } &quot;, then evaluates &quot; { $snippet &quot;body&quot; } &quot;. The &quot; { $snippet &quot;value-n&quot; } &quot; forms are evaluated sequentially, so a &quot; { $snippet &quot;value-n&quot; } &quot; form may refer to previous &quot; { $snippet &quot;var-n&quot; } &quot; definitions inside the same &quot; { $link POSTPONE: [let* } &quot; form.&quot; }
-{ $examples &quot;See &quot; { $link &quot;locals-examples&quot; } &quot;.&quot; } ;
-
-{ POSTPONE: [let POSTPONE: [let* } related-words
-
-HELP: [wlet
-{ $syntax &quot;[wlet | binding1 [ body1... ]\n        binding2 [ body2... ]\n        ... |\n     body... ]&quot; }
-{ $description &quot;Introduces a set of lexically-scoped non-recursive local functions. The bodies may not refer to other bindings within the same &quot; { $link POSTPONE: [wlet } &quot; form.&quot; }
-{ $examples
-    { $example
-        &quot;USING: locals math prettyprint sequences ;&quot;
-        &quot;IN: scratchpad&quot;
-        &quot;:: quuxify ( n seq -- newseq )&quot;
-        &quot;    [wlet | add-n [| m | m n + ] |&quot;
-        &quot;        seq [ add-n ] map ] ;&quot;
-        &quot;2 { 1 2 3 } quuxify .&quot;
-        &quot;{ 3 4 5 }&quot;
-    }
-} ;
-
 HELP: :&gt;
-{ $syntax &quot;:&gt; var&quot; &quot;:&gt; var!&quot; }
-{ $description &quot;Binds the value on the top of the datastack to a new local variable named &quot; { $snippet &quot;var&quot; } &quot;, lexically scoped to the enclosing quotation or definition.&quot;
+{ $syntax &quot;:&gt; var&quot; &quot;:&gt; var!&quot; &quot;:&gt; ( var-1 var-2 ... )&quot; }
+{ $description &quot;Binds one or more new local variables. In the &quot; { $snippet &quot;:&gt; var&quot; } &quot; form, the value on the top of the datastack to a new local variable named &quot; { $snippet &quot;var&quot; } &quot;, lexically scoped to the enclosing quotation, &quot; { $link POSTPONE: [let } &quot; form, or &quot; { $link POSTPONE: :: } &quot; definition.&quot;
+$nl
+&quot;The &quot; { $snippet &quot;:&gt; ( var-1 ... )&quot; } &quot; form binds multiple local variables from the top of the datastack in left to right order. These two snippets would have the same effect:&quot;
+{ $code &quot;:&gt; c :&gt; b :&gt; a&quot; }
+{ $code &quot;:&gt; ( a b c )&quot; }
 $nl
-&quot;If the &quot; { $snippet &quot;var&quot; } &quot; name is followed by an exclamation point (&quot; { $snippet &quot;!&quot; } &quot;), the new variable will be mutable. See &quot; { $link &quot;locals-mutable&quot; } &quot; for more information on mutable local bindings.&quot; }
+&quot;If any &quot; { $snippet &quot;var&quot; } &quot; name is followed by an exclamation point (&quot; { $snippet &quot;!&quot; } &quot;), that new variable will be mutable. See &quot; { $link &quot;locals-mutable&quot; } &quot; for more information on mutable local bindings.&quot; }
 { $notes
-    &quot;This syntax can only be used inside a &quot; { $link POSTPONE: :: } &quot; word, &quot; { $link POSTPONE: [let } &quot;, &quot; { $link POSTPONE: [let* } &quot;,  or &quot; { $link POSTPONE: [wlet } &quot; form, or inside a quotation literal inside one of those forms.&quot;
-}
+    &quot;This syntax can only be used inside a lexical scope established by a &quot; { $link POSTPONE: :: } &quot; definition, &quot; { $link POSTPONE: [let } &quot; form, or &quot; { $link POSTPONE: [| } &quot; quotation. Definition forms such as &quot; { $link POSTPONE: : } &quot; do not establish a lexical scope by themselves, nor is there a lexical scope available at the top level of source files or in the listener. To use local variable bindings in these situations, use &quot; { $link POSTPONE: [let } &quot; to provide a scope for them.&quot; }
 { $examples &quot;See &quot; { $link &quot;locals-examples&quot; } &quot;.&quot; } ;
 
+{ POSTPONE: [let POSTPONE: :&gt; } related-words
+
 HELP: ::
-{ $syntax &quot;:: word ( bindings... -- outputs... ) body... ;&quot; }
-{ $description &quot;Defines a word with named inputs; it reads datastack values into local variable bindings from left to right, then executes the body with those bindings in lexical scope.&quot; }
+{ $syntax &quot;:: word ( vars... -- outputs... ) body... ;&quot; }
+{ $description &quot;Defines a word with named inputs; it reads datastack values into local variable bindings from left to right, then executes the body with those bindings in lexical scope.&quot;
+$nl
+&quot;If any of the &quot; { $snippet &quot;vars&quot; } &quot;' names is followed by an exclamation point (&quot; { $snippet &quot;!&quot; } &quot;), that variable will be mutable. See &quot; { $link &quot;locals-mutable&quot; } &quot; for more information on mutable local bindings.&quot; }
 { $notes &quot;The names of the &quot; { $snippet &quot;outputs&quot; } &quot; do not affect the word's behavior. However, the compiler verifies that the stack effect accurately represents the number of outputs as with &quot; { $link POSTPONE: : } &quot; definitions.&quot; }
 { $examples &quot;See &quot; { $link &quot;locals-examples&quot; } &quot;.&quot; } ;
 
@@ -54,21 +39,27 @@ HELP: ::
 
 HELP: MACRO::
 { $syntax &quot;MACRO:: word ( bindings... -- outputs... ) body... ;&quot; }
-{ $description &quot;Defines a macro with named inputs; it reads datastack values into local variable bindings from left to right, then executes the body with those bindings in lexical scope.&quot; }
+{ $description &quot;Defines a macro with named inputs; it reads datastack values into local variable bindings from left to right, then executes the body with those bindings in lexical scope.&quot;
+$nl
+&quot;If any of the &quot; { $snippet &quot;vars&quot; } &quot;' names is followed by an exclamation point (&quot; { $snippet &quot;!&quot; } &quot;), that variable will be mutable. See &quot; { $link &quot;locals-mutable&quot; } &quot; for more information on mutable local bindings.&quot; }
 { $examples &quot;See &quot; { $link &quot;locals-examples&quot; } &quot;.&quot; } ;
 
 { POSTPONE: MACRO: POSTPONE: MACRO:: } related-words
 
 HELP: MEMO::
 { $syntax &quot;MEMO:: word ( bindings... -- outputs... ) body... ;&quot; }
-{ $description &quot;Defines a macro with named inputs; it reads datastack values into local variable bindings from left to right, then executes the body with those bindings in lexical scope.&quot; }
+{ $description &quot;Defines a memoized word with named inputs; it reads datastack values into local variable bindings from left to right, then executes the body with those bindings in lexical scope.&quot;
+$nl
+&quot;If any of the &quot; { $snippet &quot;vars&quot; } &quot;' names is followed by an exclamation point (&quot; { $snippet &quot;!&quot; } &quot;), that variable will be mutable. See &quot; { $link &quot;locals-mutable&quot; } &quot; for more information on mutable local bindings.&quot; }
 { $examples &quot;See &quot; { $link &quot;locals-examples&quot; } &quot;.&quot; } ;
 
 { POSTPONE: MEMO: POSTPONE: MEMO:: } related-words
                                           
 HELP: M::
 { $syntax &quot;M:: class generic ( bindings... -- outputs... ) body... ;&quot; }
-{ $description &quot;Defines a macro with named inputs; it reads datastack values into local variable bindings from left to right, then executes the body with those bindings in lexical scope.&quot; }
+{ $description &quot;Defines a new method on &quot; { $snippet &quot;generic&quot; } &quot; for &quot; { $snippet &quot;class&quot; } &quot; with named inputs; it reads datastack values into local variable bindings from left to right, then executes the body with those bindings in lexical scope.&quot;
+$nl
+&quot;If any of the &quot; { $snippet &quot;vars&quot; } &quot;' names is followed by an exclamation point (&quot; { $snippet &quot;!&quot; } &quot;), that variable will be mutable. See &quot; { $link &quot;locals-mutable&quot; } &quot; for more information on mutable local bindings.&quot; }
 { $notes &quot;The names of the &quot; { $snippet &quot;outputs&quot; } &quot; do not affect the word's behavior. However, the compiler verifies that the stack effect accurately represents the number of outputs as with &quot; { $link POSTPONE: M: } &quot; definitions.&quot; }
 { $examples &quot;See &quot; { $link &quot;locals-examples&quot; } &quot;.&quot; } ;
 
@@ -86,14 +77,13 @@ IN: scratchpad
 &quot;&quot;&quot;2.0
 -3.0&quot;&quot;&quot;
 }
-{ $snippet &quot;quadratic-roots&quot; } &quot; can also be expressed with &quot; { $link POSTPONE: [let } &quot;:&quot;
+&quot;If you wanted to perform the quadratic formula interactively from the listener, you could use &quot; { $link POSTPONE: [let } &quot; to provide a scope for the local variables:&quot;
 { $example &quot;&quot;&quot;USING: locals math math.functions kernel ;
 IN: scratchpad
-:: quadratic-roots ( a b c -- x y )
-    [let | disc [ b sq 4 a c * * - sqrt ] |
-        b neg disc [ + ] [ - ] 2bi [ 2 a * / ] bi@
-    ] ;
-1.0 1.0 -6.0 quadratic-roots [ . ] bi@&quot;&quot;&quot;
+[let 1.0 :&gt; a 1.0 :&gt; b -6.0 :&gt; c
+    b sq 4 a c * * - sqrt :&gt; disc
+    b neg disc [ + ] [ - ] 2bi [ 2 a * / ] bi@
+] [ . ] bi@&quot;&quot;&quot;
 &quot;&quot;&quot;2.0
 -3.0&quot;&quot;&quot;
 }
@@ -216,11 +206,11 @@ $nl
 &quot;One exception to the above rule is that array instances containing free local variables (that is, immutable local variables not referenced in a closure) do retain identity. This allows macros such as &quot; { $link cond } &quot; to recognize that the array is constant and expand at compile time.&quot; ;
 
 ARTICLE: &quot;locals-mutable&quot; &quot;Mutable locals&quot;
-&quot;In the list of bindings supplied to &quot; { $link POSTPONE: :: } &quot;, &quot; { $link POSTPONE: [let } &quot;, &quot; { $link POSTPONE: [let* } &quot; or &quot; { $link POSTPONE: [| } &quot;, a mutable binding may be introduced by suffixing its named with &quot; { $snippet &quot;!&quot; } &quot;. Mutable bindings are read by giving their name as usual; the suffix is not part of the binding's name. To write to a mutable binding, use the binding's name with the &quot; { $snippet &quot;!&quot; } &quot; suffix.&quot;
+&quot;Whenever a local variable is bound using &quot; { $link POSTPONE: :&gt; } &quot;, &quot; { $link POSTPONE: :: } &quot;, or &quot; { $link POSTPONE: [| } &quot;, the variable may be made mutable by suffixing its name with an exclamation point (&quot; { $snippet &quot;!&quot; } &quot;) when it is bound. The variable's value can be read by giving its name without the exclamation point as usual. To write to the variable, use its name with the &quot; { $snippet &quot;!&quot; } &quot; suffix.&quot;
 $nl
 &quot;Mutable bindings are implemented in a manner similar to the ML language; each mutable binding is actually an immutable binding of a mutable cell (in Factor's case, a 1-element array); reading the binding automatically dereferences the array, and writing to the binding stores into the array.&quot;
 $nl
-&quot;Writing to mutable locals in outer scopes is fully supported and has the expected semantics. See &quot; { $link &quot;locals-examples&quot; } &quot; for examples of mutable local variables in action.&quot; ;
+&quot;Writing to mutable locals in outer scopes is fully supported and has full closure semantics. See &quot; { $link &quot;locals-examples&quot; } &quot; for examples of mutable local variables in action.&quot; ;
 
 ARTICLE: &quot;locals-fry&quot; &quot;Locals and fry&quot;
 &quot;Locals integrate with &quot; { $link &quot;fry&quot; } &quot; so that mixing locals with fried quotations gives intuitive results.&quot;
@@ -296,12 +286,10 @@ ARTICLE: &quot;locals&quot; &quot;Lexical variables and closures&quot;
     POSTPONE: MEMO::
     POSTPONE: MACRO::
 }
-&quot;Lexical binding forms:&quot;
+&quot;Lexical scoping and binding forms:&quot;
 { $subsections
-    POSTPONE: :&gt;
     POSTPONE: [let
-    POSTPONE: [let*
-    POSTPONE: [wlet
+    POSTPONE: :&gt;
 }
 &quot;Quotation literals where the inputs are named local variables:&quot;
 { $subsections POSTPONE: [| }</diff>
      <filename>basis/locals/locals-docs.factor</filename>
    </modified>
    <modified>
      <diff>@@ -26,58 +26,35 @@ IN: locals.tests
 [ { 5 6 7 } ] [ { 1 2 3 } 4 map-test-2 ] unit-test
 
 :: let-test ( c -- d )
-    [let | a [ 1 ] b [ 2 ] | a b + c + ] ;
+    [let 1 :&gt; a 2 :&gt; b a b + c + ] ;
 
 [ 7 ] [ 4 let-test ] unit-test
 
 :: let-test-2 ( a -- a )
-    a [let | a [ ] | [let | b [ a ] | a ] ] ;
+    a [let :&gt; a [let a :&gt; b a ] ] ;
 
 [ 3 ] [ 3 let-test-2 ] unit-test
 
 :: let-test-3 ( a -- a )
-    a [let | a [ ] | [let | b [ [ a ] ] | [let | a [ 3 ] | b ] ] ] ;
+    a [let :&gt; a [let [ a ] :&gt; b [let 3 :&gt; a b ] ] ] ;
 
 :: let-test-4 ( a -- b )
-    a [let | a [ 1 ] b [ ] | a b 2array ] ;
+    a [let 1 :&gt; a :&gt; b a b 2array ] ;
 
 [ { 1 2 } ] [ 2 let-test-4 ] unit-test
 
 :: let-test-5 ( a b -- b )
-    a b [let | a [ ] b [ ] | a b 2array ] ;
+    a b [let :&gt; a :&gt; b a b 2array ] ;
 
 [ { 2 1 } ] [ 1 2 let-test-5 ] unit-test
 
 :: let-test-6 ( a -- b )
-    a [let | a [ ] b [ 1 ] | a b 2array ] ;
+    a [let :&gt; a 1 :&gt; b a b 2array ] ;
 
 [ { 2 1 } ] [ 2 let-test-6 ] unit-test
 
 [ -1 ] [ -1 let-test-3 call ] unit-test
 
-[ 5 ] [
-    [let | a [ 3 ] | [wlet | func [ a + ] | 2 func ] ]
-] unit-test
-
-:: wlet-test-2 ( a b -- seq )
-    [wlet | add-b [ b + ] |
-        a [ add-b ] map ] ;
-
-
-[ { 4 5 6 } ] [ { 2 3 4 } 2 wlet-test-2 ] unit-test
-    
-:: wlet-test-3 ( a -- b )
-    [wlet | add-a [ a + ] | [ add-a ] ]
-    [let | a [ 3 ] | a swap call ] ;
-
-[ 5 ] [ 2 wlet-test-3 ] unit-test
-
-:: wlet-test-4 ( a -- b )
-    [wlet | sub-a [| b | b a - ] |
-        3 sub-a ] ;
-
-[ -7 ] [ 10 wlet-test-4 ] unit-test
-
 :: write-test-1 ( n! -- q )
     [| i | n i + dup n! ] ;
 
@@ -94,8 +71,7 @@ IN: locals.tests
 [ 5 ] [ 2 &quot;q&quot; get call ] unit-test
 
 :: write-test-2 ( -- q )
-    [let | n! [ 0 ] |
-        [| i | n i + dup n! ] ] ;
+    [let 0 :&gt; n! [| i | n i + dup n! ] ] ;
 
 write-test-2 &quot;q&quot; set
 
@@ -116,17 +92,11 @@ write-test-2 &quot;q&quot; set
 
 [ ] [ 1 2 write-test-3 call ] unit-test
 
-:: write-test-4 ( x! -- q ) [ [let | y! [ 0 ] | f x! ] ] ;
+:: write-test-4 ( x! -- q ) [ [let 0 :&gt; y! f x! ] ] ;
 
 [ ] [ 5 write-test-4 drop ] unit-test
 
-! Not really a write test; just enforcing consistency
-:: write-test-5 ( x -- y )
-    [wlet | fun! [ x + ] | 5 fun! ] ;
-
-[ 9 ] [ 4 write-test-5 ] unit-test
-
-:: let-let-test ( n -- n ) [let | n [ n 3 + ] | n ] ;
+:: let-let-test ( n -- n ) [let n 3 + :&gt; n n ] ;
 
 [ 13 ] [ 10 let-let-test ] unit-test
 
@@ -164,18 +134,12 @@ M:: string lambda-generic ( a b -- c ) a b lambda-generic-2 ;
 
 [ ] [ \ lambda-generic see ] unit-test
 
-:: unparse-test-1 ( a -- ) [let | a! [ 3 ] | ] ;
+:: unparse-test-1 ( a -- ) [let 3 :&gt; a! 4 :&gt; b ] ;
 
-[ &quot;[let | a! [ 3 ] | ]&quot; ] [
+[ &quot;[let 3 :&gt; a! 4 :&gt; b ]&quot; ] [
     \ unparse-test-1 &quot;lambda&quot; word-prop body&gt;&gt; first unparse
 ] unit-test
 
-:: unparse-test-2 ( -- ) [wlet | a! [ ] | ] ;
-
-[ &quot;[wlet | a! [ ] | ]&quot; ] [
-    \ unparse-test-2 &quot;lambda&quot; word-prop body&gt;&gt; first unparse
-] unit-test
-
 :: unparse-test-3 ( -- b ) [| a! | ] ;
 
 [ &quot;[| a! | ]&quot; ] [
@@ -198,38 +162,6 @@ DEFER: xyzzy
 
 [ 5 ] [ 10 xyzzy ] unit-test
 
-:: let*-test-1 ( a -- b )
-    [let* | b [ a 1 + ]
-            c [ b 1 + ] |
-        a b c 3array ] ;
-
-[ { 1 2 3 } ] [ 1 let*-test-1 ] unit-test
-
-:: let*-test-2 ( a -- b )
-    [let* | b [ a 1 + ]
-            c! [ b 1 + ] |
-        a b c 3array ] ;
-
-[ { 1 2 3 } ] [ 1 let*-test-2 ] unit-test
-
-:: let*-test-3 ( a -- b )
-    [let* | b [ a 1 + ]
-            c! [ b 1 + ] |
-        c 1 + c!  a b c 3array ] ;
-
-[ { 1 2 4 } ] [ 1 let*-test-3 ] unit-test
-
-:: let*-test-4 ( a b -- c d )
-    [let | a [ b ]
-           b [ a ] |
-        [let* | a'  [ a  ]
-                a'' [ a' ]
-                b'  [ b  ]
-                b'' [ b' ] |
-            a'' b'' ] ] ;
-
-[ &quot;xxx&quot; &quot;yyy&quot; ] [ &quot;yyy&quot; &quot;xxx&quot; let*-test-4 ] unit-test
-
 GENERIC: next-method-test ( a -- b )
 
 M: integer next-method-test 3 + ;
@@ -244,11 +176,11 @@ M:: fixnum next-method-test ( a -- b ) a call-next-method 1 + ;
 
 { 3 0 } [| a b c | ] must-infer-as
 
-[ ] [ 1 [let | a [ ] | ] ] unit-test
+[ ] [ 1 [let :&gt; a ] ] unit-test
 
-[ 3 ] [ 1 [let | a [ ] | 3 ] ] unit-test
+[ 3 ] [ 1 [let :&gt; a 3 ] ] unit-test
 
-[ ] [ 1 2 [let | a [ ] b [ ] | ] ] unit-test
+[ ] [ 1 2 [let :&gt; a :&gt; b ] ] unit-test
 
 :: a-word-with-locals ( a b -- ) ;
 
@@ -306,10 +238,10 @@ M:: sequence method-with-locals ( a -- y ) a reverse ;
 [ t ] [ 12 &amp;&amp;-test ] unit-test
 
 :: let-and-cond-test-1 ( -- a )
-    [let | a [ 10 ] |
-        [let | a [ 20 ] |
+    [let 10 :&gt; a
+        [let 20 :&gt; a
             {
-                { [ t ] [ [let | c [ 30 ] | a ] ] }
+                { [ t ] [ [let 30 :&gt; c a ] ] }
             } cond
         ]
     ] ;
@@ -319,8 +251,8 @@ M:: sequence method-with-locals ( a -- y ) a reverse ;
 [ 20 ] [ let-and-cond-test-1 ] unit-test
 
 :: let-and-cond-test-2 ( -- pair )
-    [let | A [ 10 ] |
-        [let | B [ 20 ] |
+    [let 10 :&gt; A
+        [let 20 :&gt; B
             { { [ t ] [ { A B } ] } } cond
         ]
     ] ;
@@ -333,7 +265,7 @@ M:: sequence method-with-locals ( a -- y ) a reverse ;
 [ { 10 20    } ] [ 10 20    [| a b   | { a b   } ] call ] unit-test
 [ { 10 20 30 } ] [ 10 20 30 [| a b c | { a b c } ] call ] unit-test
 
-[ { 10 20 30 } ] [ [let | a [ 10 ] b [ 20 ] c [ 30 ] | { a b c } ] ] unit-test
+[ { 10 20 30 } ] [ [let 10 :&gt; a 20 :&gt; b 30 :&gt; c { a b c } ] ] unit-test
 
 [ V{ 10 20 30 } ] [ 10 20 30 [| a b c | V{ a b c } ] call ] unit-test
 
@@ -453,7 +385,7 @@ M:: integer lambda-method-forget-test ( a -- b ) a ;
 [ 10 ] [ 10 [| A | { [ A ] } ] call first call ] unit-test
 
 [
-    &quot;USING: locals fry math ; 1 '[ [let | A [ 10 ] | A _ + ] ]&quot;
+    &quot;USING: locals fry math ; 1 '[ [let 10 :&gt; A A _ + ] ]&quot;
     eval( -- ) call
 ] [ error&gt;&gt; &gt;r/r&gt;-in-fry-error? ] must-fail-with
     
@@ -465,10 +397,7 @@ M:: integer lambda-method-forget-test ( a -- b ) a ;
 [ t ] [ 3 funny-macro-test ] unit-test
 [ f ] [ 2 funny-macro-test ] unit-test
 
-! Some odd parser corner cases
 [ &quot;USE: locals [let&quot; eval( -- ) ] [ error&gt;&gt; unexpected-eof? ] must-fail-with
-[ &quot;USE: locals [let |&quot; eval( -- ) ] [ error&gt;&gt; unexpected-eof? ] must-fail-with
-[ &quot;USE: locals [let | a&quot; eval( -- ) ] [ error&gt;&gt; unexpected-eof? ] must-fail-with
 [ &quot;USE: locals [|&quot; eval( -- ) ] [ error&gt;&gt; unexpected-eof? ] must-fail-with
 
 [ 25 ] [ 5 [| a | { [ a sq ] } cond ] call ] unit-test
@@ -484,15 +413,9 @@ M:: integer lambda-method-forget-test ( a -- b ) a ;
 
 [ 3 ] [ 3 [| a | \ a ] call ] unit-test
 
-[ &quot;USE: locals [| | { [let | a [ 0 ] | a ] } ]&quot; eval( -- ) ] must-fail
+[ &quot;USE: locals [| | { [let 0 :&gt; a a ] } ]&quot; eval( -- ) ] must-fail
 
-[ &quot;USE: locals [| | { [wlet | a [ 0 ] | a ] } ]&quot; eval( -- ) ] must-fail
-
-[ &quot;USE: locals [| | { [let* | a [ 0 ] | a ] } ]&quot; eval( -- ) ] must-fail
-
-[ &quot;USE: locals [| | [let | a! [ 0 ] | { a! } ] ]&quot; eval( -- ) ] must-fail
-
-[ &quot;USE: locals [| | [wlet | a [ 0 ] | { a } ] ]&quot; eval( -- ) ] must-fail
+[ &quot;USE: locals [| | [let 0 :&gt; a! { a! } ] ]&quot; eval( -- ) ] must-fail
 
 [ &quot;USE: locals [| | { :&gt; a } ]&quot; eval( -- ) ] must-fail
 
@@ -504,27 +427,14 @@ M:: integer lambda-method-forget-test ( a -- b ) a ;
 
 [ 3 ] [ 2 [| | :&gt; a! a 1 + a! a ] call ] unit-test
 
-:: wlet-&amp;&amp;-test ( a -- ? )
-    [wlet | is-integer? [ a integer? ]
-            is-even? [ a even? ]
-            &gt;10? [ a 10 &gt; ] |
-        { [ is-integer? ] [ is-even? ] [ &gt;10? ] } &amp;&amp;
-    ] ;
-
-\ wlet-&amp;&amp;-test def&gt;&gt; must-infer
-[ f ] [ 1.5 wlet-&amp;&amp;-test ] unit-test
-[ f ] [ 3 wlet-&amp;&amp;-test ] unit-test
-[ f ] [ 8 wlet-&amp;&amp;-test ] unit-test
-[ t ] [ 12 wlet-&amp;&amp;-test ] unit-test
-
 : fry-locals-test-1 ( -- n )
-    [let | | 6 '[ [let | A [ 4 ] | A _ + ] ] call ] ;
+    [let 6 '[ [let 4 :&gt; A A _ + ] ] call ] ;
 
 \ fry-locals-test-1 def&gt;&gt; must-infer
 [ 10 ] [ fry-locals-test-1 ] unit-test
 
 :: fry-locals-test-2 ( -- n )
-    [let | | 6 '[ [let | A [ 4 ] | A _ + ] ] call ] ;
+    [let 6 '[ [let 4 :&gt; A A _ + ] ] call ] ;
 
 \ fry-locals-test-2 def&gt;&gt; must-infer
 [ 10 ] [ fry-locals-test-2 ] unit-test
@@ -542,18 +452,18 @@ M:: integer lambda-method-forget-test ( a -- b ) a ;
 ] unit-test
 
 [ 10 ] [
-    [| | 0 '[ [let | A [ 10 ] | A _ + ] ] call ] call
+    [| | 0 '[ [let 10 :&gt; A A _ + ] ] call ] call
 ] unit-test
 
 ! littledan found this problem
-[ &quot;bar&quot; ] [ [let | a [ [let | foo [ &quot;bar&quot; ] | foo ] ] | a ] ] unit-test
-[ 10 ] [ [let | a [ 10 ] | [let | b [ a ] | b ] ] ] unit-test
+[ &quot;bar&quot; ] [ [let [let &quot;bar&quot; :&gt; foo foo ] :&gt; a a ] ] unit-test
+[ 10 ] [ [let 10 :&gt; a [let a :&gt; b b ] ] ] unit-test
 
-[ { \ + } ] [ [let | x [ \ + ] | { \ x } ] ] unit-test
+[ { \ + } ] [ [let \ + :&gt; x { \ x } ] ] unit-test
 
-[ { \ + 3 } ] [ [let | a [ 3 ] | { \ + a } ] ] unit-test
+[ { \ + 3 } ] [ [let 3 :&gt; a { \ + a } ] ] unit-test
 
-[ 3 ] [ [let | a [ \ + ] | 1 2 [ \ a execute ] ] call ] unit-test
+[ 3 ] [ [let \ + :&gt; a 1 2 [ \ a execute ] ] call ] unit-test
 
 ! erg found this problem
 :: erg's-:&gt;-bug ( n ? -- n ) ? [ n :&gt; n n ] [ n :&gt; b b ] if ;
@@ -578,3 +488,6 @@ M: integer ed's-bug neg ;
    { [ a ed's-bug ] } &amp;&amp; ;
 
 [ t ] [ \ ed's-test-case optimized? ] unit-test
+
+! multiple bind
+[ 3 1 2 ] [ [let 1 2 3 :&gt; ( a b c ) c a b ] ] unit-test</diff>
      <filename>basis/locals/locals-tests.factor</filename>
    </modified>
    <modified>
      <diff>@@ -7,16 +7,12 @@ IN: locals
 
 SYNTAX: :&gt;
     scan locals get [ :&gt;-outside-lambda-error ] unless*
-    [ make-local ] bind &lt;def&gt; suffix! ;
+    parse-def suffix! ;
 
 SYNTAX: [| parse-lambda append! ;
 
 SYNTAX: [let parse-let append! ;
 
-SYNTAX: [let* parse-let* append! ;
-
-SYNTAX: [wlet parse-wlet append! ;
-
 SYNTAX: :: (::) define-declared ;
 
 SYNTAX: M:: (M::) define ;</diff>
      <filename>basis/locals/locals.factor</filename>
    </modified>
    <modified>
      <diff>@@ -7,13 +7,11 @@ M: lambda expand-macros clone [ expand-macros ] change-body ;
 
 M: lambda expand-macros* expand-macros literal ;
 
-M: binding-form expand-macros
-    clone
-        [ [ expand-macros ] assoc-map ] change-bindings
-        [ expand-macros ] change-body ;
+M: let expand-macros
+    clone [ expand-macros ] change-body ;
 
-M: binding-form expand-macros* expand-macros literal ;
+M: let expand-macros* expand-macros literal ;
 
 M: lambda condomize? drop t ;
 
-M: lambda condomize '[ @ ] ;
\ No newline at end of file
+M: lambda condomize '[ @ ] ;</diff>
      <filename>basis/locals/macros/macros.factor</filename>
    </modified>
    <modified>
      <diff>@@ -46,6 +46,12 @@ SYMBOL: locals
     (parse-lambda) &lt;lambda&gt;
     ?rewrite-closures ;
 
+: parse-multi-def ( locals -- multi-def )
+    &quot;)&quot; parse-tokens swap [ [ make-local ] map ] bind &lt;multi-def&gt; ;
+
+: parse-def ( name/paren locals -- def )
+    over &quot;(&quot; = [ nip parse-multi-def ] [ [ make-local ] bind &lt;def&gt; ] if ;
+
 M: lambda-parser parse-quotation ( -- quotation )
     H{ } clone (parse-lambda) ;
 
@@ -56,48 +62,8 @@ M: lambda-parser parse-quotation ( -- quotation )
         [ nip scan-object 2array ]
     } cond ;
 
-: (parse-bindings) ( end -- )
-    dup parse-binding dup [
-        first2 [ make-local ] dip 2array ,
-        (parse-bindings)
-    ] [ 2drop ] if ;
-
-: with-bindings ( quot -- words assoc )
-    '[
-        in-lambda? on
-        _ H{ } make-assoc
-    ] { } make swap ; inline
-
-: parse-bindings ( end -- bindings vars )
-    [ (parse-bindings) ] with-bindings ;
-
 : parse-let ( -- form )
-    &quot;|&quot; expect &quot;|&quot; parse-bindings
-    (parse-lambda) &lt;let&gt; ?rewrite-closures ;
-
-: parse-bindings* ( end -- words assoc )
-    [
-        namespace use-words
-        (parse-bindings)
-        namespace unuse-words
-    ] with-bindings ;
-
-: parse-let* ( -- form )
-    &quot;|&quot; expect &quot;|&quot; parse-bindings*
-    (parse-lambda) &lt;let*&gt; ?rewrite-closures ;
-
-: (parse-wbindings) ( end -- )
-    dup parse-binding dup [
-        first2 [ make-local-word ] keep 2array ,
-        (parse-wbindings)
-    ] [ 2drop ] if ;
-
-: parse-wbindings ( end -- bindings vars )
-    [ (parse-wbindings) ] with-bindings ;
-
-: parse-wlet ( -- form )
-    &quot;|&quot; expect &quot;|&quot; parse-wbindings
-    (parse-lambda) &lt;wlet&gt; ?rewrite-closures ;
+    H{ } clone (parse-lambda) &lt;let&gt; ?rewrite-closures ;
 
 : parse-locals ( -- effect vars assoc )
     complete-effect
@@ -121,4 +87,4 @@ M: lambda-parser parse-quotation ( -- quotation )
     [
         [ parse-definition ] 
         parse-locals-definition drop
-    ] with-method-definition ;
\ No newline at end of file
+    ] with-method-definition ;</diff>
      <filename>basis/locals/parser/parser.factor</filename>
    </modified>
    <modified>
      <diff>@@ -27,22 +27,17 @@ M: lambda pprint*
 
 : pprint-let ( let word -- )
     pprint-word
-    [ body&gt;&gt; ] [ bindings&gt;&gt; ] bi
-    \ | pprint-word
-    t &lt;inset
-    &lt;block
-    [ &lt;block [ pprint-var ] dip pprint* block&gt; ] assoc-each
-    block&gt;
-    \ | pprint-word
-    &lt;block pprint-elements block&gt;
-    block&gt;
+    &lt;block body&gt;&gt; pprint-elements block&gt;
     \ ] pprint-word ;
 
 M: let pprint* \ [let pprint-let ;
 
-M: wlet pprint* \ [wlet pprint-let ;
-
-M: let* pprint* \ [let* pprint-let ;
-
 M: def pprint*
-    &lt;block \ :&gt; pprint-word local&gt;&gt; pprint-word block&gt; ;
+    dup local&gt;&gt; word?
+    [ &lt;block \ :&gt; pprint-word local&gt;&gt; pprint-var block&gt; ]
+    [ pprint-tuple ] if ;
+
+M: multi-def pprint*
+    dup locals&gt;&gt; [ word? ] all?
+    [ &lt;block \ :&gt; pprint-word &quot;(&quot; text locals&gt;&gt; [ pprint-var ] each &quot;)&quot; text block&gt; ]
+    [ pprint-tuple ] if ;</diff>
      <filename>basis/locals/prettyprint/prettyprint.factor</filename>
    </modified>
    <modified>
      <diff>@@ -6,7 +6,7 @@ locals.errors locals.types make quotations sequences vectors
 words ;
 IN: locals.rewrite.sugar
 
-! Step 1: rewrite [| [let [let* [wlet into :&gt; forms, turn
+! Step 1: rewrite [| into :&gt; forms, turn
 ! literals with locals in them into code which constructs
 ! the literal after pushing locals on the stack
 
@@ -73,7 +73,7 @@ M: quotation rewrite-element rewrite-sugar* ;
 
 M: lambda rewrite-element rewrite-sugar* ;
 
-M: binding-form rewrite-element binding-form-in-literal-error ;
+M: let rewrite-element let-form-in-literal-error ;
 
 M: local rewrite-element , ;
 
@@ -104,6 +104,8 @@ M: tuple rewrite-sugar* rewrite-element ;
 
 M: def rewrite-sugar* , ;
 
+M: multi-def rewrite-sugar* locals&gt;&gt; &lt;reversed&gt; [ &lt;def&gt; , ] each ;
+
 M: hashtable rewrite-sugar* rewrite-element ;
 
 M: wrapper rewrite-sugar*
@@ -115,17 +117,5 @@ M: word rewrite-sugar*
 
 M: object rewrite-sugar* , ;
 
-: let-rewrite ( body bindings -- )
-    [ quotation-rewrite % &lt;def&gt; , ] assoc-each
-    quotation-rewrite % ;
-
 M: let rewrite-sugar*
-    [ body&gt;&gt; ] [ bindings&gt;&gt; ] bi let-rewrite ;
-
-M: let* rewrite-sugar*
-    [ body&gt;&gt; ] [ bindings&gt;&gt; ] bi let-rewrite ;
-
-M: wlet rewrite-sugar*
-    [ body&gt;&gt; ] [ bindings&gt;&gt; ] bi
-    [ '[ _ ] ] assoc-map
-    let-rewrite ;
+    body&gt;&gt; quotation-rewrite % ;</diff>
      <filename>basis/locals/rewrite/sugar/sugar.factor</filename>
    </modified>
    <modified>
      <diff>@@ -8,20 +8,10 @@ TUPLE: lambda vars body ;
 
 C: &lt;lambda&gt; lambda
 
-TUPLE: binding-form bindings body ;
-
-TUPLE: let &lt; binding-form ;
+TUPLE: let body ;
 
 C: &lt;let&gt; let
 
-TUPLE: let* &lt; binding-form ;
-
-C: &lt;let*&gt; let*
-
-TUPLE: wlet &lt; binding-form ;
-
-C: &lt;wlet&gt; wlet
-
 TUPLE: quote local ;
 
 C: &lt;quote&gt; quote
@@ -32,6 +22,10 @@ TUPLE: def local ;
 
 C: &lt;def&gt; def
 
+TUPLE: multi-def locals ;
+
+C: &lt;multi-def&gt; multi-def
+
 PREDICATE: local &lt; word &quot;local?&quot; word-prop ;
 
 : &lt;local&gt; ( name -- word )</diff>
      <filename>basis/locals/types/types.factor</filename>
    </modified>
    <modified>
      <diff>@@ -16,7 +16,7 @@ IN: math.matrices
 :: rotation-matrix3 ( axis theta -- matrix )
     theta cos :&gt; c
     theta sin :&gt; s
-    axis first3 :&gt; z :&gt; y :&gt; x
+    axis first3 :&gt; ( x y z )
     x sq 1.0 x sq - c * +     x y * 1.0 c - * z s * -   x z * 1.0 c - * y s * + 3array
     x y * 1.0 c - * z s * +   y sq 1.0 y sq - c * +     y z * 1.0 c - * x s * - 3array
     x z * 1.0 c - * y s * -   y z * 1.0 c - * x s * +   z sq 1.0 z sq - c * +   3array
@@ -25,14 +25,14 @@ IN: math.matrices
 :: rotation-matrix4 ( axis theta -- matrix )
     theta cos :&gt; c
     theta sin :&gt; s
-    axis first3 :&gt; z :&gt; y :&gt; x
+    axis first3 :&gt; ( x y z )
     x sq 1.0 x sq - c * +     x y * 1.0 c - * z s * -   x z * 1.0 c - * y s * +   0 4array
     x y * 1.0 c - * z s * +   y sq 1.0 y sq - c * +     y z * 1.0 c - * x s * -   0 4array
     x z * 1.0 c - * y s * -   y z * 1.0 c - * x s * +   z sq 1.0 z sq - c * +     0 4array
     { 0.0 0.0 0.0 1.0 } 4array ;
 
 :: translation-matrix4 ( offset -- matrix )
-    offset first3 :&gt; z :&gt; y :&gt; x
+    offset first3 :&gt; ( x y z )
     {
         { 1.0 0.0 0.0 x   }
         { 0.0 1.0 0.0 y   }
@@ -44,7 +44,7 @@ IN: math.matrices
     dup number? [ dup dup ] [ first3 ] if ;
 
 :: scale-matrix3 ( factors -- matrix )
-    factors &gt;scale-factors :&gt; z :&gt; y :&gt; x
+    factors &gt;scale-factors :&gt; ( x y z )
     {
         { x   0.0 0.0 }
         { 0.0 y   0.0 }
@@ -52,7 +52,7 @@ IN: math.matrices
     } ;
 
 :: scale-matrix4 ( factors -- matrix )
-    factors &gt;scale-factors :&gt; z :&gt; y :&gt; x
+    factors &gt;scale-factors :&gt; ( x y z )
     {
         { x   0.0 0.0 0.0 }
         { 0.0 y   0.0 0.0 }
@@ -64,7 +64,7 @@ IN: math.matrices
     [ recip ] map scale-matrix4 ;
 
 :: frustum-matrix4 ( xy-dim near far -- matrix )
-    xy-dim first2 :&gt; y :&gt; x
+    xy-dim first2 :&gt; ( x y )
     near x /f :&gt; xf
     near y /f :&gt; yf
     near far + near far - /f :&gt; zf</diff>
      <filename>basis/math/matrices/matrices.factor</filename>
    </modified>
    <modified>
      <diff>@@ -8,7 +8,7 @@ IN: math.primes.miller-rabin
 
 :: (miller-rabin) ( n trials -- ? )
     n 1 - :&gt; n-1
-    n-1 factor-2s :&gt; s :&gt; r
+    n-1 factor-2s :&gt; ( r s )
     0 :&gt; a!
     trials [
         drop</diff>
      <filename>basis/math/primes/miller-rabin/miller-rabin.factor</filename>
    </modified>
    <modified>
      <diff>@@ -81,8 +81,8 @@ ERROR: bad-vconvert-input value expected-type ;
 PRIVATE&gt;
 
 MACRO:: vconvert ( from-type to-type -- )
-    from-type new [ element-type ] [ byte-length ] bi :&gt; from-length :&gt; from-element
-    to-type   new [ element-type ] [ byte-length ] bi :&gt; to-length   :&gt; to-element
+    from-type new [ element-type ] [ byte-length ] bi :&gt; ( from-element from-length )
+    to-type   new [ element-type ] [ byte-length ] bi :&gt; ( to-element   to-length   )
     from-element heap-size :&gt; from-size
     to-element   heap-size :&gt; to-size   
 </diff>
      <filename>basis/math/vectors/conversion/conversion.factor</filename>
    </modified>
    <modified>
      <diff>@@ -391,8 +391,8 @@ TUPLE: inconsistent-vector-test bool branch ;
     2dup = [ drop ] [ inconsistent-vector-test boa ] if ;
 
 :: test-vector-tests ( vector decl -- none? any? all? )
-    vector decl test-vector-tests-bool :&gt; bool-all :&gt; bool-any :&gt; bool-none
-    vector decl test-vector-tests-branch :&gt; branch-all :&gt; branch-any :&gt; branch-none
+    vector decl test-vector-tests-bool :&gt; ( bool-none bool-any bool-all )
+    vector decl test-vector-tests-branch :&gt; ( branch-none branch-any branch-all )
     
     bool-none branch-none ?inconsistent
     bool-any  branch-any  ?inconsistent</diff>
      <filename>basis/math/vectors/simd/simd-tests.factor</filename>
    </modified>
    <modified>
      <diff>@@ -27,11 +27,12 @@ TUPLE: an-observer { i integer } ;
 M: an-observer model-changed nip [ 1 + ] change-i drop ;
 
 [ 1 0 ] [
-    [let* | m1 [ 1 &lt;model&gt; ]
-            m2 [ 2 &lt;model&gt; ]
-            c [ { m1 m2 } &lt;product&gt; ]
-            o1 [ an-observer new ]
-            o2 [ an-observer new ] |
+    [let
+        1 &lt;model&gt; :&gt; m1
+        2 &lt;model&gt; :&gt; m2
+        { m1 m2 } &lt;product&gt; :&gt; c
+        an-observer new :&gt; o1
+        an-observer new :&gt; o2
         
         o1 m1 add-connection
         o2 m2 add-connection</diff>
      <filename>basis/models/product/product-tests.factor</filename>
    </modified>
    <modified>
      <diff>@@ -95,8 +95,8 @@ MACRO: all-enabled-client-state ( seq quot -- )
     #! We use GL_LINE_STRIP with a duplicated first vertex
     #! instead of GL_LINE_LOOP to work around a bug in Apple's
     #! X3100 driver.
-    loc first2 :&gt; y :&gt; x
-    dim first2 :&gt; h :&gt; w
+    loc first2 :&gt; ( x y )
+    dim first2 :&gt; ( w h )
     [
         x 0.5 +     y 0.5 +
         x w + 0.3 - y 0.5 +
@@ -115,8 +115,8 @@ MACRO: all-enabled-client-state ( seq quot -- )
     rect-vertices (gl-rect) ;
 
 :: (fill-rect-vertices) ( loc dim -- vertices )
-    loc first2 :&gt; y :&gt; x
-    dim first2 :&gt; h :&gt; w
+    loc first2 :&gt; ( x y )
+    dim first2 :&gt; ( w h )
     [
         x      y
         x w +  y</diff>
      <filename>basis/opengl/opengl.factor</filename>
    </modified>
    <modified>
      <diff>@@ -278,7 +278,7 @@ TUPLE: single-texture &lt; disposable image dim loc texture-coords texture display-
     ] unless ;
 
 :: tex-image ( image bitmap -- )
-    image image-format :&gt; type :&gt; format :&gt; internal-format
+    image image-format :&gt; ( internal-format format type )
     GL_TEXTURE_2D 0 internal-format
     image dim&gt;&gt; adjust-texture-dim first2 0
     format type bitmap glTexImage2D ;</diff>
      <filename>basis/opengl/textures/textures.factor</filename>
    </modified>
    <modified>
      <diff>@@ -445,16 +445,16 @@ M: ebnf-sequence build-locals ( code ast -- code )
       drop 
     ] [ 
       [
-        &quot;FROM: locals =&gt; [let* ; FROM: sequences =&gt; nth ; [let* | &quot; %
-          dup length swap [
-            dup ebnf-var? [
+        &quot;FROM: locals =&gt; [let :&gt; ; FROM: sequences =&gt; nth ; [let &quot; %
+          dup length [
+            over ebnf-var? [
+              &quot; &quot; % # &quot; over nth :&gt; &quot; %
               name&gt;&gt; % 
-              &quot; [ &quot; % # &quot; over nth ] &quot; %
             ] [
               2drop
             ] if
           ] 2each
-          &quot; | &quot; %
+          &quot; &quot; %
           %  
           &quot; nip ]&quot; %     
       ] &quot;&quot; make 
@@ -463,9 +463,9 @@ M: ebnf-sequence build-locals ( code ast -- code )
 
 M: ebnf-var build-locals ( code ast -- )
   [
-    &quot;FROM: locals =&gt; [let* ; FROM: kernel =&gt; dup nip ; [let* | &quot; %
-    name&gt;&gt; % &quot; [ dup ] &quot; %
-    &quot; | &quot; %
+    &quot;FROM: locals =&gt; [let :&gt; ; FROM: kernel =&gt; dup nip ; [let &quot; %
+    &quot; dup :&gt; &quot; % name&gt;&gt; %
+    &quot; &quot; %
     %  
     &quot; nip ]&quot; %     
   ] &quot;&quot; make ;</diff>
      <filename>basis/peg/ebnf/ebnf.factor</filename>
    </modified>
    <modified>
      <diff>@@ -172,9 +172,7 @@ TUPLE: peg-head rule-id involved-set eval-set ;
   l lrstack get (setup-lr) ;
 
 :: lr-answer ( r p m -- ast )
-  [let* |
-          h [ m ans&gt;&gt; head&gt;&gt; ]
-        |
+    m ans&gt;&gt; head&gt;&gt; :&gt; h
     h rule-id&gt;&gt; r rule-id eq? [
       m ans&gt;&gt; seed&gt;&gt; m (&gt;&gt;ans)
       m ans&gt;&gt; failed? [
@@ -184,14 +182,11 @@ TUPLE: peg-head rule-id involved-set eval-set ;
       ] if
     ] [
       m ans&gt;&gt; seed&gt;&gt;
-    ] if
-  ] ; inline
+    ] if ; inline
 
 :: recall ( r p -- memo-entry )
-  [let* |
-          m [ p r rule-id memo ]
-          h [ p heads at ]
-        |
+    p r rule-id memo :&gt; m
+    p heads at :&gt; h
     h [
       m r rule-id h involved-set&gt;&gt; h rule-id&gt;&gt; suffix member? not and [
         fail p memo-entry boa
@@ -207,15 +202,12 @@ TUPLE: peg-head rule-id involved-set eval-set ;
       ] if
     ] [
       m
-    ] if
-  ] ; inline
+    ] if ; inline
 
 :: apply-non-memo-rule ( r p -- ast )
-  [let* |
-          lr  [ fail r rule-id f lrstack get left-recursion boa ]
-          m   [ lr lrstack set lr p memo-entry boa dup p r rule-id set-memo ]
-          ans [ r eval-rule ]
-        |
+    fail r rule-id f lrstack get left-recursion boa :&gt; lr
+    lr lrstack set lr p memo-entry boa dup p r rule-id set-memo :&gt; m
+    r eval-rule :&gt; ans
     lrstack get next&gt;&gt; lrstack set
     pos get m (&gt;&gt;pos)
     lr head&gt;&gt; [
@@ -226,8 +218,7 @@ TUPLE: peg-head rule-id involved-set eval-set ;
     ] [
       ans m (&gt;&gt;ans)
       ans
-    ] if
-  ] ; inline
+    ] if ; inline
 
 : apply-memo-rule ( r m -- ast )
   [ ans&gt;&gt; ] [ pos&gt;&gt; ] bi pos set
@@ -622,20 +613,19 @@ PRIVATE&gt;
 ERROR: parse-failed input word ;
 
 SYNTAX: PEG:
-  (:)
-  [let | effect [ ] def [ ] word [ ] |
-    [
-      [
-        [let | compiled-def [ def call compile ] |
+    [let
+        (:) :&gt; ( word def effect )
+        [
           [
-            dup compiled-def compiled-parse
-            [ ast&gt;&gt; ] [ word parse-failed ] ?if
-          ]
-          word swap effect define-declared
-        ]
-      ] with-compilation-unit
-    ] append!
-  ] ;
+            def call compile :&gt; compiled-def
+            [
+              dup compiled-def compiled-parse
+              [ ast&gt;&gt; ] [ word parse-failed ] ?if
+            ]
+            word swap effect define-declared
+          ] with-compilation-unit
+        ] append!
+    ] ;
 
 USING: vocabs vocabs.loader ;
 </diff>
      <filename>basis/peg/peg.factor</filename>
    </modified>
    <modified>
      <diff>@@ -10,77 +10,70 @@ IN: persistent.hashtables.nodes.bitmap
 : index ( bit bitmap -- n ) [ 1 - ] dip bitand bit-count ; inline
 
 M:: bitmap-node (entry-at) ( key hashcode bitmap-node -- entry )
-    [let* | shift [ bitmap-node shift&gt;&gt; ]
-            bit [ hashcode shift bitpos ]
-            bitmap [ bitmap-node bitmap&gt;&gt; ]
-            nodes [ bitmap-node nodes&gt;&gt; ] |
-       bitmap bit bitand 0 eq? [ f ] [
-           key hashcode
-           bit bitmap index nodes nth-unsafe
-           (entry-at)
-        ] if
-    ] ;
+    bitmap-node shift&gt;&gt; :&gt; shift
+    hashcode shift bitpos :&gt; bit
+    bitmap-node bitmap&gt;&gt; :&gt; bitmap
+    bitmap-node nodes&gt;&gt; :&gt; nodes
+    bitmap bit bitand 0 eq? [ f ] [
+        key hashcode
+        bit bitmap index nodes nth-unsafe
+        (entry-at)
+    ] if ;
 
 M:: bitmap-node (new-at) ( shift value key hashcode bitmap-node -- node' added-leaf )
-    [let* | shift [ bitmap-node shift&gt;&gt; ]
-            bit [ hashcode shift bitpos ]
-            bitmap [ bitmap-node bitmap&gt;&gt; ]
-            idx [ bit bitmap index ]
-            nodes [ bitmap-node nodes&gt;&gt; ] |
-        bitmap bit bitand 0 eq? [
-            [let | new-leaf [ value key hashcode &lt;leaf-node&gt; ] |
-                bitmap bit bitor
-                new-leaf idx nodes insert-nth
-                shift
-                &lt;bitmap-node&gt;
-                new-leaf
-            ]
+    bitmap-node shift&gt;&gt; :&gt; shift
+    hashcode shift bitpos :&gt; bit
+    bitmap-node bitmap&gt;&gt; :&gt; bitmap
+    bit bitmap index :&gt; idx
+    bitmap-node nodes&gt;&gt; :&gt; nodes
+
+    bitmap bit bitand 0 eq? [
+        value key hashcode &lt;leaf-node&gt; :&gt; new-leaf
+        bitmap bit bitor
+        new-leaf idx nodes insert-nth
+        shift
+        &lt;bitmap-node&gt;
+        new-leaf
+    ] [
+        idx nodes nth :&gt; n
+        shift radix-bits + value key hashcode n (new-at) :&gt; ( n' new-leaf )
+        n n' eq? [
+            bitmap-node
         ] [
-            [let | n [ idx nodes nth ] |
-                shift radix-bits + value key hashcode n (new-at)
-                [let | new-leaf [ ] n' [ ] |
-                    n n' eq? [
-                        bitmap-node
-                    ] [
-                        bitmap
-                        n' idx nodes new-nth
-                        shift
-                        &lt;bitmap-node&gt;
-                    ] if
-                    new-leaf
-                ]
-            ]
+            bitmap
+            n' idx nodes new-nth
+            shift
+            &lt;bitmap-node&gt;
         ] if
-    ] ;
+        new-leaf
+    ] if ;
 
 M:: bitmap-node (pluck-at) ( key hashcode bitmap-node -- node' )
-    [let | bit [ hashcode bitmap-node shift&gt;&gt; bitpos ]
-           bitmap [ bitmap-node bitmap&gt;&gt; ]
-           nodes [ bitmap-node nodes&gt;&gt; ]
-           shift [ bitmap-node shift&gt;&gt; ] |
-           bit bitmap bitand 0 eq? [ bitmap-node ] [
-            [let* | idx [ bit bitmap index ]
-                    n [ idx nodes nth-unsafe ]
-                    n' [ key hashcode n (pluck-at) ] |
-                n n' eq? [
-                    bitmap-node
-                ] [
-                    n' [
-                        bitmap
-                        n' idx nodes new-nth
-                        shift
-                        &lt;bitmap-node&gt;
-                    ] [
-                        bitmap bit eq? [ f ] [
-                            bitmap bit bitnot bitand
-                            idx nodes remove-nth
-                            shift
-                            &lt;bitmap-node&gt;
-                        ] if
-                    ] if
+    hashcode bitmap-node shift&gt;&gt; bitpos :&gt; bit
+    bitmap-node bitmap&gt;&gt; :&gt; bitmap
+    bitmap-node nodes&gt;&gt; :&gt; nodes
+    bitmap-node shift&gt;&gt; :&gt; shift
+    bit bitmap bitand 0 eq? [ bitmap-node ] [
+        bit bitmap index :&gt; idx
+        idx nodes nth-unsafe :&gt; n
+        key hashcode n (pluck-at) :&gt; n'
+        n n' eq? [
+            bitmap-node
+        ] [
+            n' [
+                bitmap
+                n' idx nodes new-nth
+                shift
+                &lt;bitmap-node&gt;
+            ] [
+                bitmap bit eq? [ f ] [
+                    bitmap bit bitnot bitand
+                    idx nodes remove-nth
+                    shift
+                    &lt;bitmap-node&gt;
                 ] if
-            ]
+            ] if
         ] if
-    ] ;
+    ] if ;
 
 M: bitmap-node &gt;alist% ( node -- ) nodes&gt;&gt; &gt;alist-each% ;</diff>
      <filename>basis/persistent/hashtables/nodes/bitmap/bitmap.factor</filename>
    </modified>
    <modified>
      <diff>@@ -15,43 +15,39 @@ M:: collision-node (entry-at) ( key hashcode collision-node -- leaf-node )
 
 M:: collision-node (pluck-at) ( key hashcode collision-node -- leaf-node )
     hashcode collision-node hashcode&gt;&gt; eq? [
-        [let | idx [ key hashcode collision-node find-index drop ] |
-            idx [
-                idx collision-node leaves&gt;&gt; smash [
-                    collision-node hashcode&gt;&gt;
-                    &lt;collision-node&gt;
-                ] when
-            ] [ collision-node ] if
-        ]
+        key hashcode collision-node find-index drop :&gt; idx
+        idx [
+            idx collision-node leaves&gt;&gt; smash [
+                collision-node hashcode&gt;&gt;
+                &lt;collision-node&gt;
+            ] when
+        ] [ collision-node ] if
     ] [ collision-node ] if ;
 
 M:: collision-node (new-at) ( shift value key hashcode collision-node -- node' added-leaf )
     hashcode collision-node hashcode&gt;&gt; eq? [
-        key hashcode collision-node find-index
-        [let | leaf-node [ ] idx [ ] |
-            idx [
-                value leaf-node value&gt;&gt; = [
-                    collision-node f
-                ] [
-                    hashcode
-                    value key hashcode &lt;leaf-node&gt;
-                    idx
-                    collision-node leaves&gt;&gt;
-                    new-nth
-                    &lt;collision-node&gt;
-                    f
-                ] if
+        key hashcode collision-node find-index :&gt; ( idx leaf-node )
+        idx [
+            value leaf-node value&gt;&gt; = [
+                collision-node f
             ] [
-                [let | new-leaf-node [ value key hashcode &lt;leaf-node&gt; ] |
-                    hashcode
-                    collision-node leaves&gt;&gt;
-                    new-leaf-node
-                    suffix
-                    &lt;collision-node&gt;
-                    new-leaf-node
-                ]
+                hashcode
+                value key hashcode &lt;leaf-node&gt;
+                idx
+                collision-node leaves&gt;&gt;
+                new-nth
+                &lt;collision-node&gt;
+                f
             ] if
-        ]
+        ] [
+            value key hashcode &lt;leaf-node&gt; :&gt; new-leaf-node
+            hashcode
+            collision-node leaves&gt;&gt;
+            new-leaf-node
+            suffix
+            &lt;collision-node&gt;
+            new-leaf-node
+        ] if
     ] [
         shift collision-node value key hashcode make-bitmap-node
     ] if ;</diff>
      <filename>basis/persistent/hashtables/nodes/collision/collision.factor</filename>
    </modified>
    <modified>
      <diff>@@ -8,39 +8,37 @@ persistent.hashtables.nodes ;
 IN: persistent.hashtables.nodes.full
 
 M:: full-node (new-at) ( shift value key hashcode full-node -- node' added-leaf )
-    [let* | nodes [ full-node nodes&gt;&gt; ] 
-            idx [ hashcode full-node shift&gt;&gt; mask ]
-            n [ idx nodes nth-unsafe ] |
-        shift radix-bits + value key hashcode n (new-at)
-        [let | new-leaf [ ] n' [ ] |
-            n n' eq? [
-                full-node
-            ] [
-                n' idx nodes new-nth shift &lt;full-node&gt;
-            ] if
-            new-leaf
-        ]
-    ] ;
+    full-node nodes&gt;&gt; :&gt; nodes
+    hashcode full-node shift&gt;&gt; mask :&gt; idx
+    idx nodes nth-unsafe :&gt; n
+
+    shift radix-bits + value key hashcode n (new-at) :&gt; ( n' new-leaf )
+    n n' eq? [
+        full-node
+    ] [
+        n' idx nodes new-nth shift &lt;full-node&gt;
+    ] if
+    new-leaf ;
 
 M:: full-node (pluck-at) ( key hashcode full-node -- node' )
-    [let* | idx [ hashcode full-node shift&gt;&gt; mask ]
-            n [ idx full-node nodes&gt;&gt; nth ]
-            n' [ key hashcode n (pluck-at) ] |
-        n n' eq? [
-            full-node
+    hashcode full-node shift&gt;&gt; mask :&gt; idx
+    idx full-node nodes&gt;&gt; nth :&gt; n
+    key hashcode n (pluck-at) :&gt; n'
+
+    n n' eq? [
+        full-node
+    ] [
+        n' [
+            n' idx full-node nodes&gt;&gt; new-nth
+            full-node shift&gt;&gt;
+            &lt;full-node&gt;
         ] [
-            n' [
-                n' idx full-node nodes&gt;&gt; new-nth
-                full-node shift&gt;&gt;
-                &lt;full-node&gt;
-            ] [
-                hashcode full-node shift&gt;&gt; bitpos bitnot full-bitmap-mask bitand
-                idx full-node nodes&gt;&gt; remove-nth
-                full-node shift&gt;&gt;
-                &lt;bitmap-node&gt;
-            ] if
+            hashcode full-node shift&gt;&gt; bitpos bitnot full-bitmap-mask bitand
+            idx full-node nodes&gt;&gt; remove-nth
+            full-node shift&gt;&gt;
+            &lt;bitmap-node&gt;
         ] if
-    ] ;
+    ] if ;
 
 M:: full-node (entry-at) ( key hashcode full-node -- node' )
     key hashcode</diff>
      <filename>basis/persistent/hashtables/nodes/full/full.factor</filename>
    </modified>
    <modified>
      <diff>@@ -19,10 +19,9 @@ M:: leaf-node (new-at) ( shift value key hashcode leaf-node -- node' added-leaf
             value leaf-node value&gt;&gt; =
             [ leaf-node f ] [ value key hashcode &lt;leaf-node&gt; f ] if
         ] [
-            [let | new-leaf [ value key hashcode &lt;leaf-node&gt; ] |
-                hashcode leaf-node new-leaf 2array &lt;collision-node&gt;
-                new-leaf
-            ]
+            value key hashcode &lt;leaf-node&gt; :&gt; new-leaf
+            hashcode leaf-node new-leaf 2array &lt;collision-node&gt;
+            new-leaf
         ] if
     ] [ shift leaf-node value key hashcode make-bitmap-node ] if ;
 </diff>
      <filename>basis/persistent/hashtables/nodes/leaf/leaf.factor</filename>
    </modified>
    <modified>
      <diff>@@ -46,7 +46,7 @@ GENERIC: nfa-node ( node -- start-state end-state )
     epsilon nfa-table get add-transition ;
 
 M:: star nfa-node ( node -- start end )
-    node term&gt;&gt; nfa-node :&gt; s1 :&gt; s0
+    node term&gt;&gt; nfa-node :&gt; ( s0 s1 )
     next-state :&gt; s2
     next-state :&gt; s3
     s1 s0 epsilon-transition</diff>
      <filename>basis/regexp/nfa/nfa.factor</filename>
    </modified>
    <modified>
      <diff>@@ -192,17 +192,17 @@ M: bad-executable summary
 
 \ load-local [ infer-load-local ] &quot;special&quot; set-word-prop
 
-: infer-get-local ( -- )
-    [let* | n [ pop-literal nip 1 swap - ]
-            in-r [ n consume-r ]
-            out-d [ in-r first copy-value 1array ]
-            out-r [ in-r copy-values ] |
-         out-d output-d
-         out-r output-r
-         f out-d in-r out-r
-         out-r in-r zip out-d first in-r first 2array suffix
-         #shuffle,
-    ] ;
+:: infer-get-local ( -- )
+    pop-literal nip 1 swap - :&gt; n
+    n consume-r :&gt; in-r
+    in-r first copy-value 1array :&gt; out-d
+    in-r copy-values :&gt; out-r
+
+    out-d output-d
+    out-r output-r
+    f out-d in-r out-r
+    out-r in-r zip out-d first in-r first 2array suffix
+    #shuffle, ;
 
 \ get-local [ infer-get-local ] &quot;special&quot; set-word-prop
 </diff>
      <filename>basis/stack-checker/known-words/known-words.factor</filename>
    </modified>
    <modified>
      <diff>@@ -32,13 +32,12 @@ yield
 [ [ 3 throw ] &quot;A&quot; suspend ] [ 3 = ] must-fail-with
 
 :: spawn-namespace-test ( -- ? )
-    [let | p [ &lt;promise&gt; ] g [ gensym ] |
-        [
-            g &quot;x&quot; set
-            [ &quot;x&quot; get p fulfill ] &quot;B&quot; spawn drop
-        ] with-scope
-        p ?promise g eq?
-    ] ;
+    &lt;promise&gt; :&gt; p gensym :&gt; g
+    [
+        g &quot;x&quot; set
+        [ &quot;x&quot; get p fulfill ] &quot;B&quot; spawn drop
+    ] with-scope
+    p ?promise g eq? ;
 
 [ t ] [ spawn-namespace-test ] unit-test
 </diff>
      <filename>basis/threads/threads-tests.factor</filename>
    </modified>
    <modified>
      <diff>@@ -6,26 +6,25 @@ namespaces namespaces.private assocs accessors ;
 IN: tools.walker.debug
 
 :: test-walker ( quot -- data )
-    [let | p [ &lt;promise&gt; ] |
-        [
-            H{ } clone &gt;n
+    &lt;promise&gt; :&gt; p
+    [
+        H{ } clone &gt;n
 
-            [
-                p promise-fulfilled?
-                [ drop ] [ p fulfill ] if
-                2drop
-            ] show-walker-hook set
+        [
+            p promise-fulfilled?
+            [ drop ] [ p fulfill ] if
+            2drop
+        ] show-walker-hook set
 
-            break
+        break
 
-            quot call
-        ] &quot;Walker test&quot; spawn drop
+        quot call
+    ] &quot;Walker test&quot; spawn drop
 
-        step-into-all
-        p ?promise
-        send-synchronous drop
+    step-into-all
+    p ?promise
+    send-synchronous drop
 
-        p ?promise
-        variables&gt;&gt; walker-continuation swap at
-        value&gt;&gt; data&gt;&gt;
-    ] ;
+    p ?promise
+    variables&gt;&gt; walker-continuation swap at
+    value&gt;&gt; data&gt;&gt; ;</diff>
      <filename>basis/tools/walker/debug/debug.factor</filename>
    </modified>
    <modified>
      <diff>@@ -76,10 +76,9 @@ ducet insert-helpers
     drop [ 0 ] unless* tail-slice ;
 
 :: ?combine ( char slice i -- ? )
-    [let | str [ i slice nth char suffix ] |
-        str ducet key? dup
-        [ str i slice set-nth ] when
-    ] ;
+    i slice nth char suffix :&gt; str
+    str ducet key? dup
+    [ str i slice set-nth ] when ;
 
 : add ( char -- )
     dup blocked? [ 1string , ] [</diff>
      <filename>basis/unicode/collation/collation.factor</filename>
    </modified>
    <modified>
      <diff>@@ -48,18 +48,17 @@ ERROR: unix-error errno message ;
 ERROR: unix-system-call-error args errno message word ;
 
 MACRO:: unix-system-call ( quot -- )
-    [let | n [ quot infer in&gt;&gt; ]
-           word [ quot first ] |
-        [
-            n ndup quot call dup 0 &lt; [
-                drop
-                n narray
-                errno dup strerror
-                word unix-system-call-error
-            ] [
-                n nnip
-            ] if
-        ]
+    quot infer in&gt;&gt; :&gt; n
+    quot first :&gt; word
+    [
+        n ndup quot call dup 0 &lt; [
+            drop
+            n narray
+            errno dup strerror
+            word unix-system-call-error
+        ] [
+            n nnip
+        ] if
     ] ;
 
 HOOK: open-file os ( path flags mode -- fd )</diff>
      <filename>basis/unix/unix.factor</filename>
    </modified>
    <modified>
      <diff>@@ -56,13 +56,12 @@ M: array array-base-type first ;
     DIOBJECTDATAFORMAT &lt;struct-boa&gt; ;
 
 :: make-DIOBJECTDATAFORMAT-array ( struct array -- alien )
-    [let | alien [ array length malloc-DIOBJECTDATAFORMAT-array ] |
-        array [| args i |
-            struct args &lt;DIOBJECTDATAFORMAT&gt;
-            i alien set-nth
-        ] each-index
-        alien
-    ] ;
+    array length malloc-DIOBJECTDATAFORMAT-array :&gt; alien
+    array [| args i |
+        struct args &lt;DIOBJECTDATAFORMAT&gt;
+        i alien set-nth
+    ] each-index
+    alien ;
 
 : &lt;DIDATAFORMAT&gt; ( dwFlags dwDataSize struct rgodf-array -- alien )
     [ DIDATAFORMAT heap-size DIOBJECTDATAFORMAT heap-size ] 4 ndip</diff>
      <filename>basis/windows/dinput/constants/constants.factor</filename>
    </modified>
    <modified>
      <diff>@@ -74,12 +74,12 @@ $nl
 &quot;Here is an example of the locals version:&quot;
 { $example
 &quot;&quot;&quot;USING: locals urls xml.syntax xml.writer ;
-[let |
-    number [ 3 ]
-    false [ f ]
-    url [ URL&quot; http://factorcode.org/&quot; ]
-    string [ &quot;hello&quot; ]
-    word [ \\ drop ] |
+[let
+    3 :&gt; number
+    f :&gt; false
+    URL&quot; http://factorcode.org/&quot; :&gt; url
+    &quot;hello&quot; :&gt; string
+    \\ drop :&gt; word
     &lt;XML
         &lt;x
             number=&lt;-number-&gt;</diff>
      <filename>basis/xml/syntax/syntax-docs.factor</filename>
    </modified>
    <modified>
      <diff>@@ -54,8 +54,7 @@ XML-NS: foo http://blah.com
   y
   &lt;foo/&gt;
 &lt;/x&gt;&quot;&quot;&quot; ] [
-    [let* | a [ &quot;one&quot; ] c [ &quot;two&quot; ] x [ &quot;y&quot; ]
-           d [ [XML &lt;-x-&gt; &lt;foo/&gt; XML] ] |
+    [let &quot;one&quot; :&gt; a &quot;two&quot; :&gt; c &quot;y&quot; :&gt; x [XML &lt;-x-&gt; &lt;foo/&gt; XML] :&gt; d
         &lt;XML
             &lt;x&gt; &lt;-a-&gt; &lt;b val=&lt;-c-&gt;/&gt; &lt;-d-&gt; &lt;/x&gt;
         XML&gt; pprint-xml&gt;string</diff>
      <filename>basis/xml/syntax/syntax-tests.factor</filename>
    </modified>
    <modified>
      <diff>@@ -7,25 +7,24 @@ IN: benchmark.beust2
 
 :: (count-numbers) ( remaining first value used max listener: ( -- ) -- ? )
     10 first - iota [| i |
-        [let* | digit [ i first + ]
-                mask [ digit 2^ ]
-                value' [ i value + ] |
-            used mask bitand zero? [
-                value max &gt; [ t ] [
-                    remaining 1 &lt;= [
-                        listener call f
-                    ] [
-                        remaining 1 -
-                        0
-                        value' 10 *
-                        used mask bitor
-                        max
-                        listener
-                        (count-numbers)
-                    ] if
+        i first + :&gt; digit
+        digit 2^ :&gt; mask
+        i value + :&gt; value'
+        used mask bitand zero? [
+            value max &gt; [ t ] [
+                remaining 1 &lt;= [
+                    listener call f
+                ] [
+                    remaining 1 -
+                    0
+                    value' 10 *
+                    used mask bitor
+                    max
+                    listener
+                    (count-numbers)
                 ] if
-            ] [ f ] if
-        ]
+            ] if
+        ] [ f ] if
     ] any? ; inline recursive
 
 :: count-numbers ( max listener -- )
@@ -33,9 +32,8 @@ IN: benchmark.beust2
     inline
 
 :: beust ( -- )
-    [let | i! [ 0 ] |
-        5000000000 [ i 1 + i! ] count-numbers
-        i number&gt;string &quot; unique numbers.&quot; append print
-    ] ;
+    0 :&gt; i!
+    5000000000 [ i 1 + i! ] count-numbers
+    i number&gt;string &quot; unique numbers.&quot; append print ;
 
 MAIN: beust</diff>
      <filename>extra/benchmark/beust2/beust2.factor</filename>
    </modified>
    <modified>
      <diff>@@ -71,37 +71,35 @@ CONSTANT: homo-sapiens
     [ make-random-fasta ] 2curry split-lines ; inline
 
 :: make-repeat-fasta ( k len alu -- k' )
-    [let | kn [ alu length ] |
-        len [ k + kn mod alu nth-unsafe ] &quot;&quot; map-as print
-        k len +
-    ] ; inline
+    alu length :&gt; kn
+    len [ k + kn mod alu nth-unsafe ] &quot;&quot; map-as print
+    k len + ; inline
 
 : write-repeat-fasta ( n alu desc id -- )
     write-description
-    [let | k! [ 0 ] alu [ ] |
+    [let
+        :&gt; alu
+        0 :&gt; k!
         [| len | k len alu make-repeat-fasta k! ] split-lines
     ] ; inline
 
 : fasta ( n out -- )
     homo-sapiens make-cumulative
     IUB make-cumulative
-    [let | homo-sapiens-floats [ ]
-           homo-sapiens-chars [ ]
-           IUB-floats [ ]
-           IUB-chars [ ]
-           out [ ]
-           n [ ]
-           seed [ initial-seed ] |
+    [let
+        :&gt; ( n out IUB-chars IUB-floats homo-sapiens-chars homo-sapiens-floats )
+        initial-seed :&gt; seed
 
         out ascii [
             n 2 * ALU &quot;Homo sapiens alu&quot; &quot;ONE&quot; write-repeat-fasta
 
             initial-seed
-            n 3 * homo-sapiens-chars homo-sapiens-floats &quot;IUB ambiguity codes&quot; &quot;TWO&quot; write-random-fasta
-            n 5 * IUB-chars IUB-floats &quot;Homo sapiens frequency&quot; &quot;THREE&quot; write-random-fasta
+            n 3 * homo-sapiens-chars homo-sapiens-floats
+            &quot;IUB ambiguity codes&quot; &quot;TWO&quot; write-random-fasta
+            n 5 * IUB-chars IUB-floats
+            &quot;Homo sapiens frequency&quot; &quot;THREE&quot; write-random-fasta
             drop
         ] with-file-writer
-
     ] ;
 
 : run-fasta ( -- ) 2500000 reverse-complement-in fasta ;</diff>
      <filename>extra/benchmark/fasta/fasta.factor</filename>
    </modified>
    <modified>
      <diff>@@ -17,20 +17,19 @@ STRUCT: yuv_buffer
     { v void* } ;
 
 :: fake-data ( -- rgb yuv )
-    [let* | w [ 1600 ]
-            h [ 1200 ]
-            buffer [ yuv_buffer &lt;struct&gt; ]
-            rgb [ w h * 3 * &lt;byte-array&gt; ] |
-        rgb buffer
-            w &gt;&gt;y_width
-            h &gt;&gt;y_height
-            h &gt;&gt;uv_height
-            w &gt;&gt;y_stride
-            w &gt;&gt;uv_stride
-            w h * [ dup * ] B{ } map-as malloc-byte-array &amp;free &gt;&gt;y
-            w h * 2/ [ dup dup * * ] B{ } map-as malloc-byte-array &amp;free &gt;&gt;u
-            w h * 2/ [ dup * dup * ] B{ } map-as malloc-byte-array &amp;free &gt;&gt;v
-    ] ;
+    1600 :&gt; w
+    1200 :&gt; h
+    yuv_buffer &lt;struct&gt; :&gt; buffer
+    w h * 3 * &lt;byte-array&gt; :&gt; rgb
+    rgb buffer
+        w &gt;&gt;y_width
+        h &gt;&gt;y_height
+        h &gt;&gt;uv_height
+        w &gt;&gt;y_stride
+        w &gt;&gt;uv_stride
+        w h * [ dup * ] B{ } map-as malloc-byte-array &amp;free &gt;&gt;y
+        w h * 2/ [ dup dup * * ] B{ } map-as malloc-byte-array &amp;free &gt;&gt;u
+        w h * 2/ [ dup * dup * ] B{ } map-as malloc-byte-array &amp;free &gt;&gt;v ;
 
 : clamp ( n -- n )
     255 min 0 max ; inline</diff>
      <filename>extra/benchmark/yuv-to-rgb/yuv-to-rgb.factor</filename>
    </modified>
    <modified>
      <diff>@@ -61,37 +61,33 @@ CONSTANT: AES_BLOCK_SIZE 16
     bitor bitor bitor 32 bits ;
 
 :: set-t ( T i -- )
-    [let* |
-        a1 [ i sbox nth ]
-        a2 [ a1 xtime ]
-        a3 [ a1 a2 bitxor ] |
-            a2 a1 a1 a3 ui32 i T set-nth
-            a3 a2 a1 a1 ui32 i HEX: 100 + T set-nth
-            a1 a3 a2 a1 ui32 i HEX: 200 + T set-nth
-            a1 a1 a3 a2 ui32 i HEX: 300 + T set-nth
-        ] ;
+    i sbox nth :&gt; a1
+    a1 xtime :&gt; a2
+    a1 a2 bitxor :&gt; a3
 
+    a2 a1 a1 a3 ui32 i T set-nth
+    a3 a2 a1 a1 ui32 i HEX: 100 + T set-nth
+    a1 a3 a2 a1 ui32 i HEX: 200 + T set-nth
+    a1 a1 a3 a2 ui32 i HEX: 300 + T set-nth ;
 
 MEMO:: t-table ( -- array )
     1024 0 &lt;array&gt;
     dup 256 [ set-t ] with each ;
 
 :: set-d ( D i -- )
-    [let* |
-        a1 [ i inv-sbox nth ]
-        a2 [ a1 xtime ]
-        a4 [ a2 xtime ]
-        a8 [ a4 xtime ]
-        a9 [ a8 a1 bitxor ]
-        ab [ a9 a2 bitxor ]
-        ad [ a9 a4 bitxor ]
-        ae [ a8 a4 a2 bitxor bitxor ]
-        |
-            ae a9 ad ab ui32 i D set-nth
-            ab ae a9 ad ui32 i HEX: 100 + D set-nth
-            ad ab ae a9 ui32 i HEX: 200 + D set-nth
-            a9 ad ab ae ui32 i HEX: 300 + D set-nth
-        ] ;
+    i inv-sbox nth :&gt; a1
+    a1 xtime :&gt; a2
+    a2 xtime :&gt; a4
+    a4 xtime :&gt; a8
+    a8 a1 bitxor :&gt; a9
+    a9 a2 bitxor :&gt; ab
+    a9 a4 bitxor :&gt; ad
+    a8 a4 a2 bitxor bitxor :&gt; ae
+
+    ae a9 ad ab ui32 i D set-nth
+    ab ae a9 ad ui32 i HEX: 100 + D set-nth
+    ad ab ae a9 ui32 i HEX: 200 + D set-nth
+    a9 ad ab ae ui32 i HEX: 300 + D set-nth ;
     
 MEMO:: d-table ( -- array )
     1024 0 &lt;array&gt;</diff>
      <filename>extra/crypto/aes/aes.factor</filename>
    </modified>
    <modified>
      <diff>@@ -17,28 +17,29 @@ IN: crypto.passwd-md5
 PRIVATE&gt;
 
 :: passwd-md5 ( magic salt password -- bytes )
-    [let* | final! [ password magic salt 3append
-                salt password tuck 3append md5 checksum-bytes
-                password length
-                [ 16 / ceiling swap &lt;repetition&gt; concat ] keep
-                head-slice append
-                password [ length make-bits ] [ first ] bi
-                '[ CHAR: \0 _ ? ] &quot;&quot; map-as append
-                md5 checksum-bytes ] |
-        1000 [
-            &quot;&quot; swap
-            {
-                [ 0 bit? password final ? append ]
-                [ 3 mod 0 &gt; [ salt append ] when ]
-                [ 7 mod 0 &gt; [ password append ] when ]
-                [ 0 bit? final password ? append ]
-            } cleave md5 checksum-bytes final!
-        ] each
+    password magic salt 3append
+    salt password tuck 3append md5 checksum-bytes
+    password length
+    [ 16 / ceiling swap &lt;repetition&gt; concat ] keep
+    head-slice append
+    password [ length make-bits ] [ first ] bi
+    '[ CHAR: \0 _ ? ] &quot;&quot; map-as append
+    md5 checksum-bytes :&gt; final!
 
-        magic salt &quot;$&quot; 3append
-        { 12 0 6 13 1 7 14 2 8 15 3 9 5 4 10 } final nths 3 group
-        [ first3 [ 16 shift ] [ 8 shift ] bi* + + 4 to64 ] map concat
-        11 final nth 2 to64 3append ] ;
+    1000 iota [
+        &quot;&quot; swap
+        {
+            [ 0 bit? password final ? append ]
+            [ 3 mod 0 &gt; [ salt append ] when ]
+            [ 7 mod 0 &gt; [ password append ] when ]
+            [ 0 bit? final password ? append ]
+        } cleave md5 checksum-bytes final!
+    ] each
+
+    magic salt &quot;$&quot; 3append
+    { 12 0 6 13 1 7 14 2 8 15 3 9 5 4 10 } final nths 3 group
+    [ first3 [ 16 shift ] [ 8 shift ] bi* + + 4 to64 ] map concat
+    11 final nth 2 to64 3append ;
         
 : parse-shadow-password ( string -- magic salt password )
     &quot;$&quot; split harvest first3 [ &quot;$&quot; tuck 3append ] 2dip ;</diff>
      <filename>extra/crypto/passwd-md5/passwd-md5.factor</filename>
    </modified>
    <modified>
      <diff>@@ -75,8 +75,8 @@ M: decimal before?
 
 :: D/ ( D1 D2 a -- D3 )
     D1 D2 guard-decimals 2drop
-    D1 &gt;decimal&lt; :&gt; e1 :&gt; m1
-    D2 &gt;decimal&lt; :&gt; e2 :&gt; m2
+    D1 &gt;decimal&lt; :&gt; ( m1 e1 )
+    D2 &gt;decimal&lt; :&gt; ( m2 e2 )
     m1 a 10^ *
     m2 /i
     </diff>
      <filename>extra/decimals/decimals.factor</filename>
    </modified>
    <modified>
      <diff>@@ -189,7 +189,7 @@ CONSTANT: galois-slides
     }
     { $slide &quot;Locals and lexical scope&quot;
         { &quot;Define lambda words with &quot; { $link POSTPONE: :: } }
-        { &quot;Establish bindings with &quot; { $link POSTPONE: [let } &quot; and &quot; { $link POSTPONE: [let* } }
+        { &quot;Establish bindings with &quot; { $link POSTPONE: [let } &quot; and &quot; { $snippet &quot;[let*&quot; } }
         &quot;Mutable bindings with correct semantics&quot;
         { &quot;Named inputs for quotations with &quot; { $link POSTPONE: [| } }
         &quot;Full closures&quot;</diff>
      <filename>extra/galois-talk/galois-talk.factor</filename>
    </modified>
    <modified>
      <diff>@@ -272,7 +272,7 @@ CONSTANT: google-slides
     }
     { $slide &quot;Locals and lexical scope&quot;
         { &quot;Define lambda words with &quot; { $link POSTPONE: :: } }
-        { &quot;Establish bindings with &quot; { $link POSTPONE: [let } &quot; and &quot; { $link POSTPONE: [let* } }
+        { &quot;Establish bindings with &quot; { $link POSTPONE: [let } &quot; and &quot; { $snippet &quot;[let*&quot; } }
         &quot;Mutable bindings with correct semantics&quot;
         { &quot;Named inputs for quotations with &quot; { $link POSTPONE: [| } }
         &quot;Full closures&quot;</diff>
      <filename>extra/google-tech-talk/google-tech-talk.factor</filename>
    </modified>
    <modified>
      <diff>@@ -332,13 +332,13 @@ DEFER: [bind-uniform-tuple]
     ] [
         { [ ] }
         name &quot;.&quot; append 1array
-    ] if* :&gt; name-prefixes :&gt; quot-prefixes
+    ] if* :&gt; ( quot-prefixes name-prefixes )
     type all-uniform-tuple-slots :&gt; uniforms
 
     texture-unit quot-prefixes name-prefixes [| quot-prefix name-prefix |
         uniforms name-prefix [bind-uniform-tuple]
         quot-prefix prepend
-    ] 2map :&gt; value-cleave :&gt; texture-unit'
+    ] 2map :&gt; ( texture-unit' value-cleave )
 
     texture-unit' 
     value&gt;&gt;-quot { value-cleave 2cleave } append ;
@@ -356,7 +356,7 @@ DEFER: [bind-uniform-tuple]
     } cond ;
 
 :: [bind-uniform-tuple] ( texture-unit uniforms prefix -- texture-unit' quot )
-    texture-unit uniforms [ prefix [bind-uniform] ] map :&gt; uniforms-cleave :&gt; texture-unit'
+    texture-unit uniforms [ prefix [bind-uniform] ] map :&gt; ( texture-unit' uniforms-cleave )
 
     texture-unit'
     { uniforms-cleave 2cleave } &gt;quotation ;</diff>
      <filename>extra/gpu/render/render.factor</filename>
    </modified>
    <modified>
      <diff>@@ -26,11 +26,11 @@ CONSTANT: fill-value 255
     ] B{ } map-as ;
 
 :: permute ( bytes src-order dst-order -- new-bytes )
-    [let | src [ src-order name&gt;&gt; ]
-           dst [ dst-order name&gt;&gt; ] |
-        bytes src length group
-        [ pad4 src dst permutation shuffle dst length head ]
-        map concat ] ;
+    src-order name&gt;&gt; :&gt; src
+    dst-order name&gt;&gt; :&gt; dst
+    bytes src length group
+    [ pad4 src dst permutation shuffle dst length head ]
+    map concat ;
 
 : (reorder-components) ( image src-order dest-order -- image )
     [ permute ] 2curry change-bitmap ;</diff>
      <filename>extra/images/normalization/normalization.factor</filename>
    </modified>
    <modified>
      <diff>@@ -25,25 +25,10 @@ HELP: [infix
     }
 } ;
 
-HELP: [infix|
-{ $syntax &quot;[infix| binding1 [ value1... ]\n        binding2 [ value2... ]\n        ... |\n    infix-expression infix]&quot; }
-{ $description &quot;Introduces a set of lexical bindings and evaluates the body as a snippet of infix code. The values are evaluated in parallel, and may not refer to other bindings within the same &quot; { $link POSTPONE: [infix| } &quot; form, as it is based on &quot; { $link POSTPONE: [let } &quot;.&quot; }
-{ $examples
-    { $example
-        &quot;USING: infix prettyprint ;&quot;
-        &quot;IN: scratchpad&quot;
-        &quot;[infix| pi [ 3.14 ] r [ 12 ] | r*r*pi infix] .&quot;
-        &quot;452.16&quot;
-    }
-} ;
-
-{ POSTPONE: [infix POSTPONE: [infix| } related-words
-
 ARTICLE: &quot;infix&quot; &quot;Infix notation&quot;
 &quot;The &quot; { $vocab-link &quot;infix&quot; } &quot; vocabulary implements support for infix notation in Factor source code.&quot;
 { $subsections
     POSTPONE: [infix
-    POSTPONE: [infix|
 }
 $nl
 &quot;The usual infix math operators are supported:&quot;
@@ -76,8 +61,8 @@ $nl
 $nl
 &quot;You can access &quot; { $vocab-link &quot;sequences&quot; } &quot; inside infix expressions with the familiar &quot; { $snippet &quot;arr[index]&quot; } &quot; notation.&quot;
 { $example
-    &quot;USING: arrays infix ;&quot;
-    &quot;[infix| myarr [ { 1 2 3 4 } ] | myarr[4/2]*3 infix] .&quot;
+    &quot;USING: arrays locals infix ;&quot;
+    &quot;[let { 1 2 3 4 } :&gt; myarr [infix myarr[4/2]*3 infix] ] .&quot;
     &quot;9&quot;
 }
 &quot;Please note: in Factor &quot; { $emphasis &quot;fixnums are sequences too.&quot; } &quot; If you are not careful with sequence accesses you may introduce subtle bugs:&quot;</diff>
      <filename>extra/infix/infix-docs.factor</filename>
    </modified>
    <modified>
      <diff>@@ -13,17 +13,6 @@ IN: infix.tests
      -5*
      0 infix] ] unit-test
 
-[ 452.16 ] [ [infix| r [ 12 ] pi [ 3.14 ] |
-    r*r*pi infix] ] unit-test
-[ 0 ] [ [infix| a [ 3 ] | 0 infix] ] unit-test
-[ 4/5 ] [ [infix| x [ 3 ] f [ 12 ] | f/(f+x) infix] ] unit-test
-[ 144 ] [ [infix| a [ 0 ] b [ 12 ] | b*b-a infix] ] unit-test
-
-[ 0 ] [ [infix| a [ { 0 1 2 3 } ] | a[0] infix] ] unit-test
-[ 0 ] [ [infix| a [ { 0 1 2 3 } ] | 3*a[0]*2*a[1] infix] ] unit-test
-[ 6 ] [ [infix| a [ { 0 1 2 3 } ] | a[0]+a[10%3]+a[3-1]+a[18/6] infix] ] unit-test
-[ -1 ] [ [infix| a [ { 0 1 2 3 } ] | -a[+1] infix] ] unit-test
-
 [ 0.0 ] [ [infix sin(0) infix] ] unit-test
 [ 10 ] [ [infix lcm(2,5) infix] ] unit-test
 [ 1.0 ] [ [infix +cos(-0*+3) infix] ] unit-test
@@ -42,4 +31,4 @@ IN: infix.tests
 [ t ] [ 5 \ stupid_function check-word ] unit-test
 [ 10 ] [ [infix stupid_function (0, 1, 2, 3, 4) infix] ] unit-test
 
-[ -1 ] [ [let | a [ 1 ] | [infix -a infix] ] ] unit-test
+[ -1 ] [ [let 1 :&gt; a [infix -a infix] ] ] unit-test</diff>
      <filename>extra/infix/infix-tests.factor</filename>
    </modified>
    <modified>
      <diff>@@ -83,14 +83,3 @@ PRIVATE&gt;
 
 SYNTAX: [infix
     &quot;infix]&quot; [infix-parse suffix! \ call suffix! ;
-
-&lt;PRIVATE
-
-: parse-infix-locals ( assoc end -- quot )
-    '[ _ [infix-parse prepare-operand ] ((parse-lambda)) ;
-
-PRIVATE&gt;
-
-SYNTAX: [infix|
-    &quot;|&quot; parse-bindings &quot;infix]&quot; parse-infix-locals &lt;let&gt;
-    ?rewrite-closures append! ;</diff>
      <filename>extra/infix/infix.factor</filename>
    </modified>
    <modified>
      <diff>@@ -101,11 +101,12 @@ CONSTANT: max-speed 30.0
     ] if ;
 
 :: move-player-on-heading ( d-left player distance heading -- d-left' player )
-    [let* | d-to-move [ d-left distance min ]
-            move-v [ d-to-move heading n*v ] |
-        move-v player location+
-        heading player update-nearest-segment2
-        d-left d-to-move - player ] ;
+    d-left distance min :&gt; d-to-move
+    d-to-move heading n*v :&gt; move-v
+
+    move-v player location+
+    heading player update-nearest-segment2
+    d-left d-to-move - player ;
 
 : distance-to-move-freely ( player -- distance )
     [ almost-to-collision ]</diff>
      <filename>extra/jamshred/player/player.factor</filename>
    </modified>
    <modified>
      <diff>@@ -107,13 +107,13 @@ CONSTANT: default-segment-radius 1
     } case ;
 
 :: distance-to-next-segment ( current next location heading -- distance )
-    [let | cf [ current forward&gt;&gt; ] |
-        cf next location&gt;&gt; v. cf location v. - cf heading v. / ] ;
+    current forward&gt;&gt; :&gt; cf
+    cf next location&gt;&gt; v. cf location v. - cf heading v. / ;
 
 :: distance-to-next-segment-area ( current next location heading -- distance )
-    [let | cf [ current forward&gt;&gt; ]
-           h [ next current half-way-between-oints ] |
-        cf h v. cf location v. - cf heading v. / ] ;
+    current forward&gt;&gt; :&gt; cf
+    next current half-way-between-oints :&gt; h
+    cf h v. cf location v. - cf heading v. / ;
 
 : vector-to-centre ( seg loc -- v )
     over location&gt;&gt; swap v- swap forward&gt;&gt; proj-perp ;
@@ -138,10 +138,10 @@ CONSTANT: distant 1000
     v norm 0 = [
         distant
     ] [
-        [let* | a [ v dup v. ]
-                b [ v w v. 2 * ]
-                c [ w dup v. r sq - ] |
-            c b a quadratic max-real ]
+        v dup v. :&gt; a
+        v w v. 2 * :&gt; b
+        w dup v. r sq - :&gt; c
+        c b a quadratic max-real
     ] if ;
 
 : sideways-heading ( oint segment -- v )</diff>
      <filename>extra/jamshred/tunnel/tunnel.factor</filename>
    </modified>
    <modified>
      <diff>@@ -33,13 +33,12 @@ M: unix really-delete-tree delete-tree ;
     '[ drop @ f ] attempt-all drop ; inline
 
 :: upload-safely ( local username host remote -- )
-    [let* | temp [ remote &quot;.incomplete&quot; append ]
-            scp-remote [ { username &quot;@&quot; host &quot;:&quot; temp } concat ]
-            scp [ scp-command get ]
-            ssh [ ssh-command get ] |
-        5 [ { scp local scp-remote } short-running-process ] retry
-        5 [ { ssh host &quot;-l&quot; username &quot;mv&quot; temp remote } short-running-process ] retry
-    ] ;
+    remote &quot;.incomplete&quot; append :&gt; temp
+    { username &quot;@&quot; host &quot;:&quot; temp } concat :&gt; scp-remote
+    scp-command get :&gt; scp
+    ssh-command get :&gt; ssh
+    5 [ { scp local scp-remote } short-running-process ] retry
+    5 [ { ssh host &quot;-l&quot; username &quot;mv&quot; temp remote } short-running-process ] retry ;
 
 : eval-file ( file -- obj )
     dup utf8 file-lines parse-fresh</diff>
      <filename>extra/mason/common/common.factor</filename>
    </modified>
    <modified>
      <diff>@@ -35,8 +35,8 @@ M: matrix4 new-sequence 2drop matrix4 (struct) ; inline
 
 :: 2map-columns ( a b quot -- c )
     [
-        a columns :&gt; a4 :&gt; a3 :&gt; a2 :&gt; a1
-        b columns :&gt; b4 :&gt; b3 :&gt; b2 :&gt; b1
+        a columns :&gt; ( a1 a2 a3 a4 )
+        b columns :&gt; ( b1 b2 b3 b4 )
 
         a1 b1 quot call
         a2 b2 quot call
@@ -61,8 +61,8 @@ TYPED: n/m4 ( a: float b: matrix4 -- c: matrix4 ) [ n/v ] with map-columns ;
 
 TYPED:: m4. ( a: matrix4 b: matrix4 -- c: matrix4 )
     [
-        a columns :&gt; a4 :&gt; a3 :&gt; a2 :&gt; a1
-        b columns :&gt; b4 :&gt; b3 :&gt; b2 :&gt; b1
+        a columns :&gt; ( a1 a2 a3 a4 )
+        b columns :&gt; ( b1 b2 b3 b4 )
 
         b1 first  a1 n*v :&gt; c1a
         b2 first  a1 n*v :&gt; c2a
@@ -86,7 +86,7 @@ TYPED:: m4. ( a: matrix4 b: matrix4 -- c: matrix4 )
     ] make-matrix4 ;
 
 TYPED:: m4.v ( m: matrix4 v: float-4 -- v': float-4 )
-    m columns :&gt; m4 :&gt; m3 :&gt; m2 :&gt; m1
+    m columns :&gt; ( m1 m2 m3 m4 )
     
     v first  m1 n*v
     v second m2 n*v v+</diff>
      <filename>extra/math/matrices/simd/simd.factor</filename>
    </modified>
    <modified>
      <diff>@@ -123,15 +123,16 @@ CONSTRUCTOR: mdb-connection ( instance -- mdb-connection ) ;
 PRIVATE&gt;
 
 :: verify-nodes ( mdb -- )
-    [ [let* | acc [ V{ } clone ]
-              node1 [ mdb dup master-node [ check-node ] keep ]
-              node2 [ mdb node1 remote&gt;&gt;
-                      [ [ check-node ] keep ]
-                      [ drop f ] if*  ]
-              | node1 [ acc push ] when*
-                node2 [ acc push ] when*
-                mdb acc nodelist&gt;table &gt;&gt;nodes drop 
-              ]
+    [
+        V{ } clone :&gt; acc
+        mdb dup master-node [ check-node ] keep :&gt; node1
+        mdb node1 remote&gt;&gt;
+        [ [ check-node ] keep ]
+        [ drop f ] if*  :&gt; node2
+
+        node1 [ acc push ] when*
+        node2 [ acc push ] when*
+        mdb acc nodelist&gt;table &gt;&gt;nodes drop 
     ] with-destructors ; 
               
 : mdb-open ( mdb -- mdb-connection )
@@ -143,4 +144,4 @@ PRIVATE&gt;
      [ dispose f ] change-handle drop ;
 
 M: mdb-connection dispose
-     mdb-close ;
\ No newline at end of file
+     mdb-close ;</diff>
      <filename>extra/mongodb/connection/connection.factor</filename>
    </modified>
    <modified>
      <diff>@@ -151,14 +151,16 @@ M: mdb-collection create-collection
     [ &quot;$cmd&quot; = ] [ &quot;system&quot; head? ] bi or ;
 
 : check-collection ( collection -- fq-collection )
-    [let* | instance [ mdb-instance ]
-            instance-name [ instance name&gt;&gt; ] |        
+    [let
+        mdb-instance :&gt; instance
+        instance name&gt;&gt; :&gt; instance-name
         dup mdb-collection? [ name&gt;&gt; ] when
         &quot;.&quot; split1 over instance-name =
         [ nip ] [ drop ] if
         [ ] [ reserved-namespace? ] bi
         [ instance (ensure-collection) ] unless
-        [ instance-name ] dip &quot;.&quot; glue ] ; 
+        [ instance-name ] dip &quot;.&quot; glue
+    ] ;
 
 : fix-query-collection ( mdb-query -- mdb-query )
     [ check-collection ] change-collection ; inline</diff>
      <filename>extra/mongodb/driver/driver.factor</filename>
    </modified>
    <modified>
      <diff>@@ -105,15 +105,14 @@ USE: tools.walker
     ! [ dump-to-file ] keep
     write flush ; inline
 
-: build-query-object ( query -- selector )
-    [let | selector [ H{ } clone ] |
-        { [ orderby&gt;&gt; [ &quot;orderby&quot; selector set-at ] when* ]
-          [ explain&gt;&gt; [ &quot;$explain&quot; selector set-at ] when* ]
-          [ hint&gt;&gt; [ &quot;$hint&quot; selector set-at ] when* ] 
-          [ query&gt;&gt; &quot;query&quot; selector set-at ]
-        } cleave
-        selector
-    ] ;     
+:: build-query-object ( query -- selector )
+    H{ } clone :&gt; selector
+    query { [ orderby&gt;&gt; [ &quot;orderby&quot; selector set-at ] when* ]
+      [ explain&gt;&gt; [ &quot;$explain&quot; selector set-at ] when* ]
+      [ hint&gt;&gt; [ &quot;$hint&quot; selector set-at ] when* ] 
+      [ query&gt;&gt; &quot;query&quot; selector set-at ]
+    } cleave
+    selector ;
 
 PRIVATE&gt;
 </diff>
      <filename>extra/mongodb/operations/operations.factor</filename>
    </modified>
    <modified>
      <diff>@@ -60,7 +60,7 @@ TUPLE: nurbs-curve
 
 :: (eval-bases) ( curve t interval values order -- values' )
     order 2 - curve (knot-constants)&gt;&gt; nth :&gt; all-knot-constants
-    interval order interval + all-knot-constants clip-range :&gt; to :&gt; from
+    interval order interval + all-knot-constants clip-range :&gt; ( from to )
     from to all-knot-constants subseq :&gt; knot-constants
     values { 0.0 } { 0.0 } surround 2 &lt;clumps&gt; :&gt; bases
 </diff>
      <filename>extra/nurbs/nurbs.factor</filename>
    </modified>
    <modified>
      <diff>@@ -33,13 +33,12 @@ IN: project-euler.073
 &lt;PRIVATE
 
 :: (euler073) ( counter limit lo hi -- counter' )
-    [let | m [ lo hi mediant ] |
-        m denominator limit &lt;= [
-            counter 1 +
-            limit lo m (euler073)
-            limit m hi (euler073)
-        ] [ counter ] if
-    ] ;
+    lo hi mediant :&gt; m
+    m denominator limit &lt;= [
+        counter 1 +
+        limit lo m (euler073)
+        limit m hi (euler073)
+    ] [ counter ] if ;
 
 PRIVATE&gt;
 </diff>
      <filename>extra/project-euler/073/073.factor</filename>
    </modified>
    <modified>
      <diff>@@ -54,17 +54,16 @@ IN: project-euler.150
     0 1000 [1,b] [ [ next ] replicate partial-sums ] map nip ;
 
 :: (euler150) ( m -- n )
-    [let | table [ sums-triangle ] |
-        m [| x |
-            x 1 + [| y |
-                m x - [0,b) [| z |
-                    x z + table nth-unsafe
-                    [ y z + 1 + swap nth-unsafe ]
-                    [ y        swap nth-unsafe ] bi -
-                ] map partial-sum-infimum
-            ] map-infimum
+    sums-triangle :&gt; table
+    m [| x |
+        x 1 + [| y |
+            m x - [0,b) [| z |
+                x z + table nth-unsafe
+                [ y z + 1 + swap nth-unsafe ]
+                [ y        swap nth-unsafe ] bi -
+            ] map partial-sum-infimum
         ] map-infimum
-    ] ;
+    ] map-infimum ;
 
 HINTS: (euler150) fixnum ;
 </diff>
      <filename>extra/project-euler/150/150.factor</filename>
    </modified>
    <modified>
      <diff>@@ -81,8 +81,6 @@ M: wrapper noise wrapped&gt;&gt; noise ;
 
 M: let noise body&gt;&gt; noise ;
 
-M: wlet noise body&gt;&gt; noise ;
-
 M: lambda noise body&gt;&gt; noise ;
 
 M: object noise drop { 0 0 } ;</diff>
      <filename>extra/reports/noise/noise.factor</filename>
    </modified>
    <modified>
      <diff>@@ -49,7 +49,7 @@ M: product-sequence nth
     product@ nths ;
 
 :: product-each ( sequences quot -- )
-    sequences start-product-iter :&gt; lengths :&gt; ns
+    sequences start-product-iter :&gt; ( ns lengths )
     lengths [ 0 = ] any? [
         [ ns lengths end-product-iter? ]
         [ ns sequences nths quot call ns lengths product-iter ] until</diff>
      <filename>extra/sequences/product/product.factor</filename>
    </modified>
    <modified>
      <diff>@@ -69,12 +69,12 @@ fetched-in parsed-html links processed-in fetched-at ;
 
 :: fill-spidered-result ( spider spider-result -- )
     f spider-result url&gt;&gt; spider spidered&gt;&gt; set-at
-    [ spider-result url&gt;&gt; http-get ] benchmark :&gt; fetched-in :&gt; html :&gt; headers
+    [ spider-result url&gt;&gt; http-get ] benchmark :&gt; ( headers html fetched-in )
     [
         html parse-html
         spider currently-spidering&gt;&gt;
         over find-all-links normalize-hrefs
-    ] benchmark :&gt; processed-in :&gt; links :&gt; parsed-html
+    ] benchmark :&gt; ( parsed-html links processed-in )
     spider-result
         headers &gt;&gt;headers
         fetched-in &gt;&gt;fetched-in</diff>
      <filename>extra/spider/spider.factor</filename>
    </modified>
    <modified>
      <diff>@@ -12,12 +12,13 @@ IN: ui.gadgets.alerts
 : alert* ( str -- ) [ ] swap alert ;
 
 :: ask-user ( string -- model' )
-   [ [let | lbl  [ string &lt;label&gt;  T{ font { name &quot;sans-serif&quot; } { size 14 } } &gt;&gt;font dup , ]
-            fldm [ &lt;model-field*&gt; -&gt;% 1 ]
-            btn  [ &quot;okay&quot; &lt;model-border-btn&gt; ] |
-         btn -&gt; [ fldm swap updates ]
-                [ [ drop lbl close-window ] $&gt; , ] bi
-   ] ] &lt;vbox&gt; { 161 86 } &gt;&gt;pref-dim &quot;&quot; open-window ;
+    [
+        string &lt;label&gt;  T{ font { name &quot;sans-serif&quot; } { size 14 } } &gt;&gt;font dup , :&gt; lbl
+        &lt;model-field*&gt; -&gt;% 1 :&gt; fldm
+        &quot;okay&quot; &lt;model-border-btn&gt; :&gt; btn
+        btn -&gt; [ fldm swap updates ]
+               [ [ drop lbl close-window ] $&gt; , ] bi
+    ] &lt;vbox&gt; { 161 86 } &gt;&gt;pref-dim &quot;&quot; open-window ;
 
 MACRO: ask-buttons ( buttons -- quot ) dup length [
       [ swap
@@ -25,4 +26,4 @@ MACRO: ask-buttons ( buttons -- quot ) dup length [
          [ [ &lt;model-border-btn&gt; [ close-window ] &gt;&gt;hook -&gt; ] map ] &lt;hbox&gt; , ] &lt;vbox&gt;
          &quot;&quot; open-window
       ] dip firstn
-   ] 2curry ;
\ No newline at end of file
+   ] 2curry ;</diff>
      <filename>extra/ui/gadgets/alerts/alerts.factor</filename>
    </modified>
    <modified>
      <diff>@@ -209,7 +209,7 @@ CONSTANT: vpri-slides
     }
     { $slide &quot;Locals and lexical scope&quot;
         { &quot;Define lambda words with &quot; { $link POSTPONE: :: } }
-        { &quot;Establish bindings with &quot; { $link POSTPONE: [let } &quot; and &quot; { $link POSTPONE: [let* } }
+        { &quot;Establish bindings with &quot; { $link POSTPONE: [let } &quot; and &quot; { $snippet &quot;[let*&quot; } }
         &quot;Mutable bindings with correct semantics&quot;
         { &quot;Named inputs for quotations with &quot; { $link POSTPONE: [| } }
         &quot;Full closures&quot;</diff>
      <filename>extra/vpri-talk/vpri-talk.factor</filename>
    </modified>
    <modified>
      <diff>@@ -3,10 +3,7 @@
 &lt;plist version=&quot;1.0&quot;&gt;
 &lt;dict&gt;
 	&lt;key&gt;content&lt;/key&gt;
-	&lt;string&gt;
-   [let | $1 [ $2 ] $3|
-      $0
-   ]&lt;/string&gt;
+	&lt;string&gt;[let $0 ]&lt;/string&gt;
 	&lt;key&gt;name&lt;/key&gt;
 	&lt;string&gt;let&lt;/string&gt;
 	&lt;key&gt;scope&lt;/key&gt;</diff>
      <filename>misc/Factor.tmbundle/Snippets/let.tmSnippet</filename>
    </modified>
    <modified>
      <diff>@@ -272,7 +272,7 @@
     (&quot;\\(\n\\| \\);\\_&gt;&quot; (1 &quot;&gt;b&quot;))
     ;; Let and lambda:
     (&quot;\\_&lt;\\(!(\\) .* \\()\\)&quot; (1 &quot;&lt;&quot;) (2 &quot;&gt;&quot;))
-    (&quot;\\(\\[\\)\\(let\\|wlet\\|let\\*\\)\\( \\|$\\)&quot; (1 &quot;(]&quot;))
+    (&quot;\\(\\[\\)\\(let\\|let\\*\\)\\( \\|$\\)&quot; (1 &quot;(]&quot;))
     (&quot;\\(\\[\\)\\(|\\) +[^|]* \\(|\\)&quot; (1 &quot;(]&quot;) (2 &quot;(|&quot;) (3 &quot;)|&quot;))
     (&quot; \\(|\\) &quot; (1 &quot;(|&quot;))
     (&quot; \\(|\\)$&quot; (1 &quot;)&quot;))</diff>
      <filename>misc/fuel/fuel-syntax.el</filename>
    </modified>
  </modified>
  <removed type="array">
    <removed>
      <filename>extra/dns/cache/nx/nx.factor</filename>
    </removed>
    <removed>
      <filename>extra/dns/cache/rr/rr.factor</filename>
    </removed>
    <removed>
      <filename>extra/dns/dns.factor</filename>
    </removed>
    <removed>
      <filename>extra/dns/forwarding/forwarding.factor</filename>
    </removed>
    <removed>
      <filename>extra/dns/misc/misc.factor</filename>
    </removed>
    <removed>
      <filename>extra/dns/resolver/resolver.factor</filename>
    </removed>
    <removed>
      <filename>extra/dns/server/server.factor</filename>
    </removed>
    <removed>
      <filename>extra/dns/stub/stub.factor</filename>
    </removed>
    <removed>
      <filename>extra/dns/util/util.factor</filename>
    </removed>
  </removed>
  <parents type="array">
    <parent>
      <id>9ff38fb56c12806a18f5bc4e494b12e07b443dc0</id>
    </parent>
    <parent>
      <id>867267e6020904f9f056737f3a167bc5d02a463a</id>
    </parent>
  </parents>
  <author>
    <name>Doug Coleman</name>
    <email>doug.coleman@gmail.com</email>
  </author>
  <url>http://github.com/mrjbq7/factor/commit/ff14283c2db9e97928fbe18ff49e3c18ba167c4a</url>
  <id>ff14283c2db9e97928fbe18ff49e3c18ba167c4a</id>
  <committed-date>2009-10-28T15:26:23-07:00</committed-date>
  <authored-date>2009-10-28T15:26:23-07:00</authored-date>
  <message>Merge branch 'master' of git://factorcode.org/git/factor</message>
  <tree>8680aab2691462d4d68654c3d077748b9f1d678b</tree>
  <committer>
    <name>Doug Coleman</name>
    <email>doug.coleman@gmail.com</email>
  </committer>
</commit>
