为什么在lisp中将代码视为数据很有用

时间:2014-08-26 08:12:47

标签: emacs macros lisp eval homoiconicity

我现在学习emacs lisp,我想知道为什么将代码视为数据可能有用。这种方法有什么好处。我看到了一个解释,因为这可以替代传统的 Von Neumann架构,其中数据和代码之间存在明显的分离。 我想了解这个决定的意义,得到这个想法。

先谢谢,尼克。

1 个答案:

答案 0 :(得分:4)

您可以编写代码来为您编写代码。这可以通过两种方式完成:

  • 首先,您的程序可以创建新代码作为列表并将其传递给eval函数,该函数将在运行时评估新代码(但eval是您不应滥用的内容 - 实际上,它应该很少使用,当你真的需要它时)。理论上你可以用不具有同音性的语言来做这件事,但这会更难。 例如,在Scheme中你可以这样做
(define form '(x 10))
(set! form (append 'define form)
(eval form (interaction-environment)

之后x的值将为10。例如,这可以在Genetic Programming

中使用
  • 您也可以定义宏。宏是一个小函数,它读取看起来像函数调用的东西,但在程序开始评估表单之前被翻译(扩展)为其他东西(也就是之前)它运行)。例如,在许多Lisps中or是一个宏。这段代码,
(or a b c)

被翻译成

(let ((tmp1 a))
  (if tmp1
      tmp1
      (let ((tmp2 b))
        (if tmp2
            tmp2
            (let ((tmp3 c))
              (if tmp3
                  tmp3
                  #f))))))

您可以将or实现为函数,但是函数必须在返回之前评估其所有参数。由于or是一个宏,因此不一定会评估所有参数。

您可以阅读有关宏in Wikipediathis cool book的更多信息[除了网络上的其他几个地方,例如here, 例如herehere。您可以阅读有关评估in Wikipediathis great book的内容。

你也可以阅读Paul Graham的On Lisp(这本书是完全免费的),它以一种快节奏的方式教授基本的Common Lisp,然后用宏来进入各种编程技术,之后你可以尝试Let Over Lambda(只有一些章节是免费的)。

关于eval,可能会有兴趣阅读this question及其答案。