Joel Ray Holveck <joelh@piquan.org> wrote:
+---------------
| While bored one night, I thought about how a lot of people only
| know one thing about Lisp: that it uses lots of parens. If they've
| taken a class in college that uses Lisp, they may also remember that
| it's got "some weird funky lambda thing".
|
| So I decided to implement a quine (I was reading GEB at the time)
| using only parens and lambda, no other tokens:
|
| ((lambda (lambda) ((lambda lambda lambda) lambda lambda))
| (lambda (lambda) ((lambda lambda lambda) lambda lambda)))
|
| (I seem to recall a discussion here about "Buffalo buffalo buffalo
| buffalo buffalo." It may have been related to this quine.)
|
| Now, this is (I believe) correct for *some* definition of Lisp, but it
| has some requirements on the Lisp...
+---------------
Here's a REPL quine that Kent Pitman posted several years ago
[in <news:sfwhewgvi2i.fsf@world.std.com>] that works in ANSI CL:
(LET ((LET
'`(LET ((LET ',LET))
,LET)))
`(LET ((LET ',LET))
,LET))
By using the standard expansion of LET into LAMBDA:
(let ((var value)) ==> ((lambda (var) body)
body) value)
and possibly some local variable renaming (of quoted constant
symbol LETs into symbol LAMBDAs), you should be able to transform
the all LETs & quotes & backquotes version in a LAMBDAs & quotes &
backquotes version, but I'm not sure you can get rid of the
quotes & backquotes.
Here's my first cut at a conversion of the above LET-based quine
into LAMBDAs & quotes & backquotes. I may have made mistakes in
the conversion, but at least the result *is* a REPL quine in CL
[well, at least in both CMUCL & CLISP]:
((LAMBDA (LAMBDA) `((LAMBDA (LAMBDA) ,LAMBDA) ',LAMBDA))
'`((LAMBDA (LAMBDA) ,LAMBDA) ',LAMBDA))
-Rob
-----
Rob Warnock <rpw3@rpw3.org>
627 26th Avenue <URL:http://rpw3.org/>
San Mateo, CA 94403 (650)572-2607