
On 09/04/10 06:09, Larry Evans wrote:
On 09/03/10 10:33, David Sankel wrote:
On Fri, Sep 3, 2010 at 8:04 AM, Stewart, Robert <Robert.Stewart@sig.com>wrote:
Larry Evans wrote:
On 09/03/10 06:33, Stefan Strasser wrote:
In:
lam<I>
I is arity, not nesting, of the lambda expression:
http://bitbucket.org/camior/de-bruijn-bind/src#cl-45
IOW:
\(x1,x2,x3).x1+x2+x3 => lam<3>(arg<0,1>+arg<0,2>+arg<0,3>)
lam<3>(_0_1 + _0_2 + _0_3) (using zero-based indices)
So much more readable, don't you think? ;-)
Yes. I've added the following syntactic enhancements to the code (and updated README) at http://bitbucket.org/camior/de-bruijn-bind
- abs -> lam - var -> arg - some _x_y shorthands for arg<x,y>()
Since most of the time the user will be referring to the arg<0,I>, why not switch args to arg to allow defaulting the 2nd arg for the common case? IOW, something like:
template < unsigned ArgIndex , unsigned NestingLevel=0
struct arg ;
instead of:
template < unsigned NestingLevel , unsigned ArgIndex
struct arg ;
This would allow:
typedef arg<1> _1; typedef arg<2> _2; ...
Also, if: template < unsigned Arity=1
struct lam ; then: \(x1,x2,x3).x1+x2+x3 =curry=> \x1\x2\x3.x1+x2+x3 =deBruijn=> lam(lam(lam(arg<1,2>+arg<1,1>+arg<1,0>))) which illustrates that only a single argument arg template is needed. I also illustrates that the nesting level is the reverse of the argument order. I wonder why DeBruijn preferred that way? OTOH, how would you express a nullary function? IOW, is the following possible with current code? lam<0>(9)