【问题标题】:Why does LET not play nice with EVAL in my quine?为什么 LET 在我的 quine 中不能很好地与 EVAL 配合使用?
【发布时间】:2019-07-04 15:26:08
【问题描述】:

我正在尝试编写一个 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)))

对于第二个示例,打印的代码和编写的代码之间的唯一区别是空格和大写,我可以轻松修复。但是,我仍然不明白为什么我的第一次尝试不起作用。正如我所看到的,唯一的区别是变量的范围,但这似乎并不重要,因为我正在评估包含它的范围内的程序。

【问题讨论】:

  • Quines 很容易使用 reader 变量,但这可能被认为是作弊。也许尝试使用匿名函数?

标签: lisp common-lisp eval quine


【解决方案1】:
(let ((program '`(let ((program ',program )
                   (print (eval program)))))
  (print (eval program))))

Common Lisp 标准提到了eval

在当前动态环境和空词法环境中评估form

由于program 是一个词法变量,它对eval 不可见。

【讨论】:

  • 请注意,您可以通过在两个绑定表单中添加合适的(declare (special program)) 声明作为第一件事来解决这个问题。
猜你喜欢
  • 2014-07-04
  • 2019-04-26
  • 1970-01-01
  • 1970-01-01
  • 2011-02-27
  • 2013-04-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多