lisp "list" function/keyword 是做什么的?

What does lisp "list" function/keyword do?

我在 Emacs Elisp 编程简介,第 4.4.1 节中看到过:

(interactive
  (list (read-buffer
    "Append to buffer: "
    (other-buffer (current-buffer) t))
    (region-beginning)
    (region-end)))

Google"list" 在 lisp 中的含义出奇地难,因为每一页都很成功。我猜它只是列出了它的参数,在这种情况下,为什么使用它比只用另一组括号列出 "manually" 更好或更清楚?

那是因为你不能只使用"another set of parentheses"来制作列表。

这是一个创建包含数字 1、2、3、4 的列表的表达式。

(list 1 2 3 4)

但是,您不能使用 (1 2 3 4) 甚至 ((1 2 3 4)) 来表达。

list 是所有主要 Lisp 方言共享的基本功能。虽然它本身不是原始的,但它的实际实现是实现具有 varargs. It has been around since LISP 1.5 from 1962 (page 47) (In 1960 LISP1 had it as a special form (page 121))

的能力

它在 Common Lisp 和 Emacs Lisp 中的实现是:

(defun list (&rest args)
  args)

Emacs Lisp 无法用语法替换它,因为它没有 reader 宏,但 Common Lisp 可以引入新语法来代替 (list ..)。如何在 Common Lisp 中执行此操作的示例:

(defun read-list (stream char)
   (declare (ignore char))
   (cons 'list (read-delimited-list #\} stream t)))

(set-macro-character #\{ #'read-list)
(set-macro-character #\} (get-macro-character #\)))

{(+ 4 5) 'test {1 2 3}} 
; expands to: (list (+ 4 5) 'test (list 1 2 3))
; ==> (9 test (1 2 3))

当其他 lispers 被介绍到代码时,结果会让他们感到困惑,因此克服这个缺点确实非常有价值。 Clojure 为数组和映射引入了特殊语法,但 still use list to make lists.