help-gnu-emacs
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: Function binders in Elisp?


From: Pascal Bourguignon
Subject: Re: Function binders in Elisp?
Date: 19 Apr 2005 00:45:57 +0200
User-agent: Gnus/5.09 (Gnus v5.9.0) Emacs/21.3

PT <mailshield.gg@mailnull.com> writes:

> On Mon, 18 Apr 2005 18:26:12 +0200, rgb <rbielaws@i1.net> wrote:
> >
> > So you are looking to do this?
> >
> > (defmacro bind-second (first &rest others)
> >   `(lambda (x) (,first x ,@others)))
> >
> >    (remove-if (bind-second > 2)
> >               '(1 2 3 4))
> >
> > I'd think that would make the code a bit more confusing to read.
> > But maybe it's just me.
> 
> In very simple cases it might be simpler than writing those lambda
> functions. STL introduced functional programming paradigms in C++,
> that's  why I thought there is a standard way in Lisp to do it and the
> STL  developers simply implemented the same function binders in C++.

Well, what is clear and recognized by all lisp programmer is:

(remove-if (lambda (x) (< 2 x)) '(1 2 3 4))  --> (1 2)


Also there's this notion of currying. 
http://www.cs.oberlin.edu/classes/dragn/labs/combinators/combinators11.html

In Common Lisp you'd write:

(defun curry (f) (lambda (x) (lambda (y) (funcall f x y))))

(funcall (funcall (curry '+) 2) 3) --> 5
(remove-if (funcall (curry '<) 2) '(1 2 3 4))  --> (1 2)

It's nicer in scheme.  It doesn't work in emacs lisp.

Despite the awkwardness of the notation in Common Lisp, it migh be
better recognized than bind-second...


> I know I can write my own macros to do that, but a standardized way
> would  be better, because it would be recognized by other Lisp
> programmers too.  From your answer it's clear there are no such
> standard macros in (e)lisp,  so it's not really worth the trouble,
> because it would only make my  programs harder to read for others.

-- 
__Pascal Bourguignon__                     http://www.informatimago.com/
Grace personified,
I leap into the window.
I meant to do that.


reply via email to

[Prev in Thread] Current Thread [Next in Thread]