lisp - 澄清玻璃市格言, "LISP programmers know the value of everything and the cost of nothing."

标签 lisp

我一直在思考玻璃市的格言,

LISP programmers know the value of everything and the cost of nothing.

我可以找到一些提示和简短的解释,但不是对这句话的真正含义的清晰、有见地的解释,尤其是对于 Lisp 程序员而言。

请您解释一下 Perlis 的格言,可能先用简单的单词,CS 初学者可以理解的东西,然后再通过描述格言所隐含的相关结构、操作或情况,可能带有代码或伪代码示例来解释更多技术方面?

最佳答案

与许多 his epigrams 一样这至少部分是为了让您思考,而不是真正意味着任何真正具体的东西。

然而,理解他在这里的意思是相当简单的。引述分为两部分。

A LISP programmer knows the value of everything ...

这是指 Lisp 与许多编程语言不同,它是一种表达式语言。这意味着在 Lisp 中只有一种东西:表达式,它有一个值(或者在最近的 Lisp 中,有一些值)。因此,例如,在 CL 中,我可以说:

(let ((y (setq z 3))) ...)

因为 (setq ...) 是一个表达式,其值是它分配的最后一个值。同样我可以说

(setq y (let (...) ...))

因为 (let (...) ...) 是一个表达式,其值(或多个值)是其主体中最后一个形式的值(或多个值),或者 nil 如果没有表单。

所以 Lisp 程序员知道一切的值(value),因为在 Lisp 中,一切都是具有值(value)的表达式。

将此与 C 语言进行对比。在 C 语言中,有些表达式有值,有些语句没有。所以我不能在 C 中说:

int x = if (...) ... else ...;

因为 if (...) ... else ... 是 C 中的一个语句,而不是一个表达式。相反,我必须使用特殊的条件表达式:

int x = ...? ... : ...;

等等。

(但是,我可以说 int x = y = 4;:赋值是 C 中的一个表达式。)

许多语言也是如此(例如Python有同样的东西)。

我承认我不理解为什么这些语言会做出这种区分:我想除了使语言的语法和语义更加繁琐之外,肯定还有其他原因。

... but the cost of nothing.

引用的这一部分指的是 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)))))

这是列表长度的二次方,因为它重复遍历列表以获取第 n 个元素。但如果列表是一个数组,这将是一个非常合理的方法。相反,在 Lisp 中你想写这样的东西(我故意这样写,就好像很多 CL 不存在一样:这不是惯用的 CL 代码!):

(defun sum-list (list)
  (let ((sum 0))
    (mapc (lambda (e)
            (incf sum e))
          list)
    sum))

或者如果你想要真正原始(但使用 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))

Lisp 在编程语言中是,或者至少不同寻常的,因为它提供的操作和数据结构的理解成本并非微不足道。将 Lisp 与 Fortran 等进行比较,尤其是与当时的 Fortran 进行比较。

当然,这句话实际上只适用于非常小或简单的程序,因为大型和复杂的程序也开始具有可能不明显的复杂性,导致这句话的另一个版本:

Fortran programmers know the values of a few things and the costs of a few very small things

(这并不是要对 Fortran 程序员无礼:我一直是 Fortran 程序员。)

关于lisp - 澄清玻璃市格言, "LISP programmers know the value of everything and the cost of nothing.",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57427557/

相关文章:

macros - 为什么我们修改它时需要重新编译使用Common Lisp宏的定义?

字符串追加不起作用;不断覆盖以前的字符串

arrays - Lisp 变量未绑定(bind)

lisp - 我的 lisp 评估是否正确?

javascript - 是否有编译为 javascript 的 lisp?

windows - 为什么 lisp 数到十亿这么慢?

lisp - 在 Notepad++ 中编译 lisp/scheme

function - Common Lisp - 使用一个函数作为另一个函数的输入

scheme - 我需要帮助解决方案表达式

sorting - 具有可定制比较功能的排序功能