我试图写一个 Common Lisp quine。我认为最简单的选项之一如下:
(let ((program '`(let ((program ',program )
(print (eval program)))))
(print (eval program))))
这不起作用,SBCL 和 CLISP 都抱怨 PROGRAM 未绑定。但是,我确实发现使用 DEFPARAMETER 与 LET 不同,确实有效:
(progn
(defparameter program
'`(progn
(defparameter program
',program)
(print (eval program))))
(print (eval program)))
对于第二个示例,打印的代码和编写的代码之间的唯一区别是空格和大写,我可以轻松修复。但是,我仍然不明白为什么我的第一次尝试不起作用。正如我所看到的,唯一的区别是变量的范围,但这似乎并不重要,因为我正在评估包含它的范围内的程序。