我读过The Nature of Lisp。我唯一真正从中学到的就是“代码就是数据”。但在没有定义这些术语的含义以及为什么它们通常被认为是独立的情况下,我得不到任何见解。我对“代码就是数据”的最初反应是,那又如何?
发布于 2009-07-09 17:59:19
编写Lisp代码。真正“掌握”Lisp (或任何语言)的唯一方法就是卷起袖子,在其中实现一些东西。就像其他任何东西一样,你可以阅读任何你想要的东西,但如果你想真正地掌握正在发生的事情,你必须跳出理论,开始实践。
发布于 2009-07-09 23:06:40
老式的观点是:'it‘是带有符号表达式的交互计算。
Lisp支持所有类型的表达式的easy表示:
英语句子
(the man saw the moon)数学
(2 * x ** 3 + 4 * x ** 2 - 3 * x + 3)规则
(<- (likes Kim ?x) (likes ?x Lee) (likes ?x Kim))还有Lisp本身
(mapcar (function sqr) (quote (1 2 3 4 5)))还有更多。
Lisp现在允许用这样表达式编写计算的程序
(translate (quote (the man saw the moon)) (quote german))
(solve (quote (2 * x ** 3 + 4 * x ** 2 - 3 * x + 3)) (quote (x . 3)))
(show-all (quote (<- (likes Kim ?x) (likes ?x Lee) (likes ?x Kim))))
(eval (quote (mapcar (function sqr) (quote (1 2 3 4 5)))))交互性意味着编程是与Lisp的对话。您输入一个表达式,Lisp将计算副作用(例如输出)和值。
因此,您的编程会话就像是在与Lisp系统“对话”。你会一直使用它,直到你得到正确的答案。
这些表达式是什么?它们是某种语言中的句子。它们是对涡轮机的部分描述。它们是描述AMD处理器的浮点引擎的定理。它们是物理学中的计算机代数表达式。它们是对电路的描述。它们是游戏中的规则。它们是对游戏中参与者行为的描述。它们是医疗诊断系统中的规则。
Lisp允许您将事实、规则、公式写成符号表达式。它允许您编写使用这些表达式的程序。您可以计算公式的值。但是您可以同样容易地编写从公式计算新公式的程序(符号数学: integrate、derive等)。这就是Lisp设计的目标。
作为一个副作用,Lisp程序也被表示为这样的表达式。然后还有一个Lisp程序,用于评估或编译其他Lisp程序。所以Lisp的思想,符号表达式的计算,已经被应用到Lisp本身, Lisp程序是符号表达式,计算是Lisp表达式。
Alan Kay (以Smalltalk成名)在Lisp the Maxwell's equations of programming中调用了Lisp计算的原始定义。
发布于 2009-07-09 18:09:37
“掌握”任何一种语言的方法就是尝试用它编写一些代码。
关于“数据就是代码”这件事,在大多数语言中,被执行的代码和被处理的数据之间有明显的分离。
例如,下面这个简单的类似C的函数:
void foo(int i){
int j;
if (i % 42 == 0){
bar(i-2);
}
for (j = 0; j < i; ++j){
baz();
}
}实际的控制流在编写代码时静态地确定一次。函数bar不会改变,函数开头的if语句也不会消失。这段代码不是数据,它不能被程序操纵。
可以操作的只有i的初始值。另一方面,该值不能像代码那样执行。您可以调用函数foo,但不能调用变量i。所以i是数据,但它不是代码。
Lisp没有这种区别。程序代码也是可以操作的数据。您的代码可以在运行时接受函数foo,也许可以添加另一个if语句,也许可以更改for循环中的条件,也许可以用另一个函数调用替换对baz的调用。您的所有代码都是可以检查和操作的数据,就像上面的函数可以检查和操作整数i一样。
https://stackoverflow.com/questions/1105522
复制相似问题