* Re: 'let' for functions ?
[not found] <1036073066.48586.0@iris.uk.clara.net>
@ 2002-10-31 14:18 ` Hannu Koivisto
2003-04-26 19:19 ` Ed L Cashin
0 siblings, 1 reply; 4+ messages in thread
From: Hannu Koivisto @ 2002-10-31 14:18 UTC (permalink / raw)
chris@example.org writes:
> I just wondered if it is possible to get the lexical scoping effect for
> functions that 'let' and related functions provide for variables.
Note that Emacs Lisp is dynamically scoped, thus let does not
provide lexical scoping but dynamic scoping.
> i.e I want to be able to do something like this :
>
> (let ((funca funcb))
> (require 'foolib))
You can use flet (or labels if you need recursion) from the cl
package:
(require 'cl)
(flet ((funca (&rest args)
(apply 'funcb args)))
(require 'foolib))
--
Hannu
^ permalink raw reply [flat|nested] 4+ messages in thread
* Re: 'let' for functions ?
2002-10-31 14:18 ` 'let' for functions ? Hannu Koivisto
@ 2003-04-26 19:19 ` Ed L Cashin
2003-04-26 20:01 ` Oliver Scholz
0 siblings, 1 reply; 4+ messages in thread
From: Ed L Cashin @ 2003-04-26 19:19 UTC (permalink / raw)
Hannu Koivisto <azure@iki.fi> writes:
> chris@example.org writes:
>
>> I just wondered if it is possible to get the lexical scoping effect for
>> functions that 'let' and related functions provide for variables.
>
> Note that Emacs Lisp is dynamically scoped, thus let does not
> provide lexical scoping but dynamic scoping.
>
>> i.e I want to be able to do something like this :
>>
>> (let ((funca funcb))
>> (require 'foolib))
>
> You can use flet (or labels if you need recursion) from the cl
> package:
>
> (require 'cl)
>
> (flet ((funca (&rest args)
> (apply 'funcb args)))
> (require 'foolib))
As an exercise I tried in vain to create a simple implementation of
labels that wouldn't require loading cl. I couldn't do it, though,
and had to get on with what I was supposed to be doing. ;)
I'd be very interested, though, to see such a simple implementation of
labels if there's an elisp guru who would enjoy trying to find it.
The hard part for me was recursion support.
--
--Ed L Cashin PGP public key: http://noserose.net/e/pgp/
^ permalink raw reply [flat|nested] 4+ messages in thread
* Re: 'let' for functions ?
2003-04-26 19:19 ` Ed L Cashin
@ 2003-04-26 20:01 ` Oliver Scholz
2003-04-26 20:20 ` Ed L Cashin
0 siblings, 1 reply; 4+ messages in thread
From: Oliver Scholz @ 2003-04-26 20:01 UTC (permalink / raw)
Ed L Cashin <ecashin@uga.edu> writes:
[...]
> As an exercise I tried in vain to create a simple implementation of
> labels that wouldn't require loading cl. I couldn't do it, though,
> and had to get on with what I was supposed to be doing. ;)
You need not fear the cl package. If you put
`(eval-when-compile (require 'cl)' into your code, the compiled
package won't require cl.
However, since this is, as you say, a nice exercise, I give it a
shot. (Although I am supposed to be doing something different, too
...)
> I'd be very interested, though, to see such a simple implementation of
> labels if there's an elisp guru who would enjoy trying to find it.
> The hard part for me was recursion support.
I am not a Lisp-Guru, but here is my version anyways. I'd like to hear
whether there is any problem with this approach:
(defmacro my-simple-labels (spec &rest body)
;; We `fset' the symbols temporarily and restore the original state
;; after the body form was executed.
(let ((symbol (make-symbol "symbol"))
(definition (make-symbol "definition"))
(sfunc (make-symbol "sfunc")))
`(progn
(let (,symbol)
(dolist (,definition ',spec)
(setq ,symbol (car ,definition))
;; Store function definition, if necessary.
(when (fboundp ,symbol)
(put ,symbol 'my-simple-labels (symbol-function ,symbol)))
;; New function definition.
(fset ,symbol (cons 'lambda (cdr ,definition)))))
(unwind-protect (progn ,@body)
;; Clean-up
(let (,sfunc)
(dolist (,symbol ',(mapcar 'car spec))
(setq ,sfunc (get ,symbol 'my-simple-labels))
(if ,sfunc
(fset ,symbol ,sfunc)
(fmakunbound ,symbol))))))))
Oliver
--
7 Floréal an 211 de la Révolution
Liberté, Egalité, Fraternité!
^ permalink raw reply [flat|nested] 4+ messages in thread
* Re: 'let' for functions ?
2003-04-26 20:01 ` Oliver Scholz
@ 2003-04-26 20:20 ` Ed L Cashin
0 siblings, 0 replies; 4+ messages in thread
From: Ed L Cashin @ 2003-04-26 20:20 UTC (permalink / raw)
Oliver Scholz <alkibiades@gmx.de> writes:
> Ed L Cashin <ecashin@uga.edu> writes:
> [...]
>> As an exercise I tried in vain to create a simple implementation of
>> labels that wouldn't require loading cl. I couldn't do it, though,
>> and had to get on with what I was supposed to be doing. ;)
...
> I am not a Lisp-Guru, but here is my version anyways. I'd like to hear
> whether there is any problem with this approach:
>
> (defmacro my-simple-labels (spec &rest body)
> ;; We `fset' the symbols temporarily and restore the original state
> ;; after the body form was executed.
> (let ((symbol (make-symbol "symbol"))
> (definition (make-symbol "definition"))
> (sfunc (make-symbol "sfunc")))
> `(progn
> (let (,symbol)
> (dolist (,definition ',spec)
> (setq ,symbol (car ,definition))
> ;; Store function definition, if necessary.
> (when (fboundp ,symbol)
> (put ,symbol 'my-simple-labels (symbol-function ,symbol)))
> ;; New function definition.
> (fset ,symbol (cons 'lambda (cdr ,definition)))))
> (unwind-protect (progn ,@body)
> ;; Clean-up
> (let (,sfunc)
> (dolist (,symbol ',(mapcar 'car spec))
> (setq ,sfunc (get ,symbol 'my-simple-labels))
> (if ,sfunc
> (fset ,symbol ,sfunc)
> (fmakunbound ,symbol))))))))
Hey, wow. (And you claim not to be a lisp guru! ;)
It seems to work well for these two tests: recursion and mutual
recursion.
(my-simple-labels
((f (s n)
(if (> n 0)
(progn
(insert (format "s: %s\n" s))
(f s (1- n))))))
(f "hi" 4))
Inserts "s: hi\n" four times.
(my-simple-labels
((f (s n)
(if (> n 0)
(progn
(insert (format "f: %s\n" s))
(g s (1- n)))))
(g (s n)
(if (> n 0)
(progn
(insert (format "g: %s\n" s))
(f s (1- n))))))
(f "hi" 4))
Inserts "f: hi\n" and "g: hi\n" alternately, twice each.
--
--Ed L Cashin PGP public key: http://noserose.net/e/pgp/
^ permalink raw reply [flat|nested] 4+ messages in thread
end of thread, other threads:[~2003-04-26 20:20 UTC | newest]
Thread overview: 4+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
[not found] <1036073066.48586.0@iris.uk.clara.net>
2002-10-31 14:18 ` 'let' for functions ? Hannu Koivisto
2003-04-26 19:19 ` Ed L Cashin
2003-04-26 20:01 ` Oliver Scholz
2003-04-26 20:20 ` Ed L Cashin
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).