Subject: Re: Returning Functions
From: Erik Naggum <clerik@naggum.no>
Date: 1997/10/10
Newsgroups: comp.lang.lisp
Message-ID: <3085485174678128@naggum.no>


* Joerg Hoehle
| Emphasize this is only valid in ANSI CL which defines lambda as a
| macro, but not in CLtL1 or CLtL2 Lisps.  That might explain the
| difference between Allegro and CLISP (a compile-only
| vs. interpreter+compiler present inplementation might do as well).

Allegro comes in to flavors: Windows and Unix (also available for NT).
Allegro for Windows is an ancient Lisp, mostly CLtL1 with CLOS and a
Windows-specific interface builder, and is compile-only as you say.
Allegro for Unix is a modern Lisp, almost completely ANSI-conformant, and
has both an interpreter and a compiler.  they differ greatly in what they
implement, in particular: one should not impute Windows limitations to
Unix.  to wit, I'm greatly impressed with the Unix version, and equally
unimpressed with the Windows version.

| The correct way of course was
|      (defvar *df* `(,#'(lambda () (do1)) ,#'(lambda (a) (do2 a))))
| without any coercion (you don't need to compile at run-time here).

hm.  I'd suggest optimizing for less syntactic hair:

    (defvar *df* (list (lambda () (do1)) (lambda (a) (do2 a))))

of course, with (optimize (hair 3)), we could always write

    (defvar *df '(#.#'(lambda () (do1)) #.#'(lambda (a) (do2 a))))

and force people to understand how this all works, but ... maybe not.

#\Erik
-- 
if you think this year is "97", _you_ are not "year 2000 compliant".

see http://www.naggum.no/emacs/ for Emacs-20-related material.