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.
我在 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.