lisp“list”函数/关键字有什么作用?

时间:2015-03-21 13:08:09

标签: list emacs lisp elisp

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

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

对于Google来说,“列表”在lisp中意味着什么是令人惊讶的,因为每个页面都很受欢迎。我猜它只是列出了它的参数,在这种情况下,为什么使用它比使用另一组括号“手动”制作列表更好或更清楚?

2 个答案:

答案 0 :(得分:4)

那是因为你不能只使用"另一组括号"列表。

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

(list 1 2 3 4)

但是,您无法使用(1 2 3 4)甚至((1 2 3 4))来表达这一点。

答案 1 :(得分:2)

list是Lisp的所有主要方言之间共享的基本功能。虽然它本身不是原始的,但它的实际实现是实现具有varargs的能力。自LISP 1.5 from 1962 (page 47)以来一直存在(1960年LISP1将其作为a special form (page 121)

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

(defun list (&rest args)
  args)

Emacs Lisp不能用语法替换它,因为它没有读者宏,但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