我一直在思考玻璃市的格言,
LISP程序员知道一切的价值,却一无所获。
我可以找到一些提示和简短的解释,但对于引号的真正含义却无法获得清晰,有见地的解释,尤其是对于Lisp程序员而言。
您能先描述简单的单词,CS初学者容易理解的内容,再解释更多技术方面的内容,再通过描述代码所暗示的相关结构,操作或情况(可能使用代码或伪代码示例)来解释Perlis的命令吗?
就像他的许多格言一样,这至少部分是为了使您思考,而不是真正意味着任何具体的东西。
但是,很容易理解他在这里要做什么。报价分为两部分。
LISP程序员知道一切的价值...
这是指Lisp与许多编程语言不同,是一种表达语言。这意味着在Lisp中只有一件事:具有值的表达式(或者在最近的Lisps中,有一些值)。因此,例如在CL中,我可以说:
(let ((y (setq z 3))) ...)
Run Code Online (Sandbox Code Playgroud)
因为(setq ...)是一个表达式,其值是它分配的最后一个值。同样,我可以说
(setq y (let (...) ...))
Run Code Online (Sandbox Code Playgroud)
因为(let (...) ...)是一个表达式,其值(或多个值)是其主体中最后一个形式的值(或多个值),或者nil如果没有任何形式。
所以Lisp程序员知道一切的价值,因为在Lisp中,一切都是具有价值的表达。
例如,将其与C进行比较。在C中,有具有值的表达式,也有没有值的语句。所以我不能用C说:
int x = if (...) ... else ...;
Run Code Online (Sandbox Code Playgroud)
因为if (...) ... else ...是C中的语句,而不是表达式。相反,我必须使用特殊的条件表达式:
int x = ...? ... : ...;
Run Code Online (Sandbox Code Playgroud)
等等。
(但是,我可以说int x = y = 4;:赋值是C中的一个表达式。)
许多语言也是如此(例如Python具有相同的含义)。
我承认不理解为什么这些语言会产生这种区别:我认为除了使语言的语法和语义更加古怪之外,还必须有其他原因。
...但是没有任何代价。
引言的这一部分指的是Lisp中的各种操作都具有时间(可能还有空间)复杂性(即成本)的事实,这种情况不是恒定的。这主要是因为Lisp中最独特,最重要的复合数据结构(从来不是唯一的)是由conses构成的单链接列表,而获得这样一个列表的第n个元素所花费的时间与* n $成比例。
刚开始使用Lisp的程序员,或者只是没有认真思考的Lisp程序员,最终都会写出非常慢的代码,并且伸缩性很差。例如考虑一下:
(defun terrible-sum-list (list)
(let ((sum 0))
(dotimes (i (length list) sum)
(incf sum (nth i list)))))
Run Code Online (Sandbox Code Playgroud)
这在列表的长度上是平方的,因为它反复在列表中向下移动以获得第n个元素。但是,如果列表是一个数组,那么这将是一个完全合理的方法。相反,在Lisp中,您想要编写这样的内容(我故意这样编写,就好像很多CL不存在:这并不意味着是惯用的CL代码!):
(defun sum-list (list)
(let ((sum 0))
(mapc (lambda (e)
(incf sum e))
list)
sum))
Run Code Online (Sandbox Code Playgroud)
或者,如果您想成为真正的原始人(但使用CL的名称作为原始人):
(defun caveman-sum-list (list)
(let ((sum 0)
(tail list))
(tagbody
loop
(if (null tail)
(go end))
(setq sum (+ sum (first list))
tail (rest tail))
(go loop)
end)
sum))
Run Code Online (Sandbox Code Playgroud)
Lisp 在编程语言中(或至少在编程语言中是不寻常的)在于,它提供的操作和数据结构的成本并不容易理解。将Lisp与例如Fortran进行比较,尤其是将Lisp与当今的Fortran进行比较。
当然,引号实际上仅适用于非常小的程序或简单的程序,因为大而复杂的程序也开始具有可能并不明显的复杂性,从而导致了该引号的替代版本:
Fortran程序员知道几件事的价值和几件事的代价
(这对Fortran程序员而言并不无礼:我曾经是Fortran程序员。)
| 归档时间: |
|
| 查看次数: |
84 次 |
| 最近记录: |