[Date Prev][Date Next][Thread Prev][Thread Next]
[Date Index]
[Thread Index]
- Subject: Re: Injecting names & method chaining (was Re: [ANN] Penlight Libraries, First release)
- From: steve donovan <steve.j.donovan@...>
- Date: Sat, 2 May 2009 15:59:26 +0200
On Sat, May 2, 2009 at 7:37 AM, Mark Hamburg <mark@grubmah.com> wrote:
> On a potentially related note, I had previously been thinking about ways to
> do chaining/pipelining for iterator construction. As I recall, that had lead
> to constructs like:
>
> pipe( pairs, map( function( k, v ) return tostring( k ), tostring( v
> ) end ), filter( function( k, v ) return #k == 3 end ) ) )( t )
>
> Those had never felt as clean as one might like, however, though they did
> encourage saving the pipe for reuse. Perhaps there's something to be
> explored in your chain solution.
As an example of convergent thinking, I've been looking at this very
issue. This was inspired by a recent comment of David, and attempts to
make pl.seq more useful and intuitive:
http://lua-users.org/wiki/SequenceAdapters
The basic insight is that we are culturally conditioned to prefer
chains of operations to move from left to right, which is perhaps one
of the hidden strengths of OOP notation.
For an example, this gets all the unique lines in the file and prints them out:
S(io.lines(fname)):unique():printall '\n'
And this puts all the unique identifiers in a Lua code string into a
table result:
ls = S(lexer.lua(str)):filter(Eq(_1,'iden')):map(_2):unique():copy()
Any methods which are not recognized are looked up using the first
value of the sequence:
S{'[one]','[two]','[three]'}:sub(2,-2):upper():printall() ---> ONE TWO THREE
steve d.