On Mon, Mar 12, 2012 at 6:00 AM, nicolas.o...@gmail.com
<nicolas.o...@gmail.com> wrote:
> I quite like the style of something along the lines of:
>
> : swap-element ( i1 array1 i2 array2 -- )
>  [  [ nth  ] 2keep  ] 2bi@ ???? [ set-nth ] 2 smart-apply ;
>
> because it shows the dataflow better than with lexical variables.

Instead of collecting piles of related values on the data stack and
using n-ary variants of dataflow words, dataflow often becomes clearer
when you construct an object to contain related values. In your
swap-element case, each index-array pair could each be collected into
an `array-ref` object. After defining some operations on `array-ref`s,
the swap functionality becomes much easier to express (aside from the
somewhat awkward `bi-curry bi*` necessary to express transposed 2x2
dataflow):

```
TUPLE: array-ref index array ;
C: <array-ref> array-ref
: >array-ref< ( array-ref -- index array )
    [ index>> ] [ array>> ] bi ;
: get-ref ( array-ref -- elt )
    >array-ref< nth ;
: set-ref ( value array-ref -- elt )
    >array-ref< set-nth ;

: swap-refs ( x-ref y-ref -- )
    [ [ get-ref ] bi@ swap ] 2keep
    [ set-ref ] bi-curry bi* ;
```

------------------------------------------------------------------------------
Try before you buy = See our experts in action!
The most comprehensive online learning library for Microsoft developers
is just $99.99! Visual Studio, SharePoint, SQL - plus HTML5, CSS3, MVC3,
Metro Style Apps, more. Free future releases when you subscribe now!
http://p.sf.net/sfu/learndevnow-dev2
_______________________________________________
Factor-talk mailing list
Factor-talk@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/factor-talk

Reply via email to