[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
Re: Functions returning functions in Emacs Lisp
From: |
srinik001 |
Subject: |
Re: Functions returning functions in Emacs Lisp |
Date: |
Tue, 15 Apr 2008 22:22:54 -0700 (PDT) |
User-agent: |
G2/1.0 |
On Apr 15, 9:33 pm, Barry Margolin <bar...@alum.mit.edu> wrote:
> In article
> <c98a949b-5ada-490a-805f-298e84783...@l28g2000prd.googlegroups.com>,
>
>
>
> srinik...@hotmail.com wrote:
> > Hi,
>
> > I am trying to learnEmacsLisp. I know a bit of (Common) Lisp and was
> > trying the following onEmacs. This is to define a function called
> > derivative, which returns as its result a function which is the
> > derivative of the argument function fn, when the numerical calculation
> > is done over delta. So I did the following.
>
> > (defun derivative (fn delta)
> > #'(lambda(x) (/ (- (funcall fn (+ x delta)) (funcall fn x)) delta)))
>
> > --> this seemed to work (i.e. no error on C-x C-e)
>
> > (setq c (derivative #'sin 0.001))
>
> > --> this seemed to work (again, no error on evaluation)
>
> > (funcall c (/ 3.1415 2))
>
> > --> this threw up an error. The error is the following:
>
> > Debugger entered--Lisp error: (void-variable fn)
> > (funcall fn (+ x delta))
> > (- (funcall fn (+ x delta)) (funcall fn x))
> > (/ (- (funcall fn ...) (funcall fn x)) delta)
> > (lambda (x) (/ (- ... ...) delta))(1.57075)
> > funcall((lambda (x) (/ (- ... ...) delta)) 1.57075)
> > eval((funcall c (/ 3.1415 2)))
> > eval-last-sexp-1(nil)
> > eval-last-sexp(nil)
> > call-interactively(eval-last-sexp)
>
> > I tried lambda expressions on mapcar, and it seemed to work onEmacs
> > the way it does in Common Lisp. Could someone please tell me if I am
> > doing something wrong vis-a-visEmacs, or ifEmacsdoes not support
> > this? Thanks.
>
> EmacsLisp uses dynamic scoping, not lexical scoping, so it doesn't
> create lexical closures.
>
> You can get the effect using lexical-let:
>
> (defun derivative (fn delta)
> (lexical-let ((fn fn) (delta delta))
> #'(lambda (x) (/ (- (funcall fn (+ x delta))
> (funcall fn x))
> delta))))
>
> --
> Barry Margolin, bar...@alum.mit.edu
> Arlington, MA
> *** PLEASE post questions in newsgroups, not directly to me ***
> *** PLEASE don't copy me on replies, I'll read them in the group ***
Thanks for the reply. I noticed that lexical-let requires a common
lisp extension. I will google for it and figure out how to install
it.
Regards,
SK