我现在学习 emacs lisp,我想知道为什么将代码视为数据可能有用。这种方法有什么好处。我看到了一种解释,因为这是传统冯诺依曼架构的替代方案,传统的冯诺依曼架构在数据和代码之间存在明确的分离。我想了解这个决定的含义,明白这个想法。
在此先感谢,尼克。
我现在学习 emacs lisp,我想知道为什么将代码视为数据可能有用。这种方法有什么好处。我看到了一种解释,因为这是传统冯诺依曼架构的替代方案,传统的冯诺依曼架构在数据和代码之间存在明确的分离。我想了解这个决定的含义,明白这个想法。
在此先感谢,尼克。
您可以编写为您编写代码的代码。这可以通过两种方式完成:
eval
函数,该函数将在运行时评估新代码(但是,eval
您不应该滥用它——实际上,当您真正需要它时,应该很少使用它)。理论上,您可以在不具有同音性属性的语言中做到这一点,但这会困难得多。例如,在 Scheme 你可以这样做(define form '(x 10))
(set! form (append 'define form)
(eval form (interaction-environment)
之后的值x
将是 10。例如,这可以在遗传编程中使用
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
是一个宏,它不一定会评估所有参数。
您可以在 Wikipedia和这本很酷的书中阅读更多关于宏的信息[在网络上的其他几个地方旁边,例如这里、 这里和这里]。您可以在 Wikipedia和这本好书中阅读有关 eval的信息。
您还可以阅读 Paul Graham 的On Lisp(该书完全免费),它以较快的速度教授基本的 Common Lisp,然后使用宏学习各种编程技术,稍后您可以尝试Let Over Lambda(仅部分章节免费的)。
关于eval
阅读这个问题及其答案可能会很有趣。