带有多个参数的 QUOTE
QUOTE with multiple arguments
我正在分析 LISP,我不是专家,但有件事困扰着我:
一些原语如list
接受多个参数。例如:
(list 1 2 3)
=> (1 2 3)
另一方面,quote
似乎只接受一个参数。例如:
(quote (1 2 3))
=> (1 2 3)
(quote x)
=> 'x
(quote 1 2 3)
=> 1 ???
为什么 (quote 1 2 3)
即引用多个参数而忽略其他参数是有原因的吗?
如果 (quote 1 2 3)
的计算结果为 (1 2 3)
会发生什么,即当提供多个参数时的一种特殊情况?
我明白这种特殊情况是多余的,但我对 LISP 黑客的问题是:
将这种特殊情况添加到 quote
会破坏一切吗?它会破坏 REPL 吗?它会破坏宏吗?
注:测试于http://repl.it/ and http://clojurescript.net/
请注意,Lisp 不是单一的语言,而是一个大家族,其中包含一些相似的语言。您似乎已经尝试过 Scheme(repl.it 运行 BiwaScheme)和 ClojureScript。
Scheme 的另一种方言 Scheme spec only defines one argument for quote
, so BiwaScheme seems to be wrong in that respect. (quote 1 2 3)
should be an error in Scheme. For example, Racket 不接受它们:
$ racket
Welcome to Racket v5.3.6.
> (quote 1)
1
> (quote 1 2 3)
stdin::10: quote: wrong number of parts
in: (quote 1 2 3)
context...:
/usr/share/racket/collects/racket/private/misc.rkt:87:7
BiwaScheme 是用 JavaScript 编写的,JavaScript 只是忽略了 any 函数的额外参数,所以行为可能来自那里。
ClojureScript 可能会从 JavaScript 或 Clojure 继承其行为方式。 Clojure's documentation 明确声明具有多个参数的 quote
仅计算第一个参数。
Common Lisp,另一种流行的 Lisp 语言,also only accepts a single argument 到 quote
:
$ sbcl
* (quote 1 2 3)
debugger invoked on a SIMPLE-ERROR in thread
#<THREAD "main thread" RUNNING {1002B2AE83}>:
wrong number of args to QUOTE:
(QUOTE 1 2 3)
请注意,一般来说,对于任何 Lisp,quote
很少被拼写出来。它只是一种特殊形式,是 '
的扩展。在 '
形式中,甚至 不可能 给出 quote
额外参数:
'(1 2 3) ≡ (quote (1 2 3))
'x ≡ (quote x)
'??? ≡ (quote 1 2 3)
我没有立即看到用任何给定语言扩展 quote
的定义有什么问题,如果有多个参数,将它们评估为一个列表,但我当然看不到用于该功能,要么。
在大多数 lisps 中,quote
会在给出多个参数时出错。这种行为似乎是 Clojure(或 ClojureScript?)的特性。
允许 quote
的多个参数成为一个列表并不是一个很好的设计。如果您有创建列表的操作,您显然应该能够使用它来构造单个元素列表,但修改后的 quote
不允许这样做。
(我测试了 SBCL、Emacs Lisp 和 scheme48,所有这些都抱怨 quote 有多个参数。)
QUOTE
最初的想法是表示一个常量,特别是符号和列表:
(quote sin)
(quote (sin 10))
要获取未引用的数据,我们调用 SECOND
或 CADR
。
(defun unquote (expression)
(second expression))
例如我们可以调用:
(unquote '(quote (sin 10)))
如果知道 (quote sin 10)
与 (quote (sin 10))
相同,那么我们需要为这两种情况重写我们的 unquote 函数:
(defun unquote (expression)
(if (consp (cddr expression))
(cdr expression)
(cadr expression)))
通过添加特殊情况我们不会获得任何新功能,但它会使必须处理此类表达式的代码复杂化...
我正在分析 LISP,我不是专家,但有件事困扰着我:
一些原语如list
接受多个参数。例如:
(list 1 2 3)
=> (1 2 3)
另一方面,quote
似乎只接受一个参数。例如:
(quote (1 2 3))
=> (1 2 3)
(quote x)
=> 'x
(quote 1 2 3)
=> 1 ???
为什么 (quote 1 2 3)
即引用多个参数而忽略其他参数是有原因的吗?
如果 (quote 1 2 3)
的计算结果为 (1 2 3)
会发生什么,即当提供多个参数时的一种特殊情况?
我明白这种特殊情况是多余的,但我对 LISP 黑客的问题是:
将这种特殊情况添加到 quote
会破坏一切吗?它会破坏 REPL 吗?它会破坏宏吗?
注:测试于http://repl.it/ and http://clojurescript.net/
请注意,Lisp 不是单一的语言,而是一个大家族,其中包含一些相似的语言。您似乎已经尝试过 Scheme(repl.it 运行 BiwaScheme)和 ClojureScript。
Scheme 的另一种方言 Scheme spec only defines one argument for quote
, so BiwaScheme seems to be wrong in that respect. (quote 1 2 3)
should be an error in Scheme. For example, Racket 不接受它们:
$ racket
Welcome to Racket v5.3.6.
> (quote 1)
1
> (quote 1 2 3)
stdin::10: quote: wrong number of parts
in: (quote 1 2 3)
context...:
/usr/share/racket/collects/racket/private/misc.rkt:87:7
BiwaScheme 是用 JavaScript 编写的,JavaScript 只是忽略了 any 函数的额外参数,所以行为可能来自那里。
ClojureScript 可能会从 JavaScript 或 Clojure 继承其行为方式。 Clojure's documentation 明确声明具有多个参数的 quote
仅计算第一个参数。
Common Lisp,另一种流行的 Lisp 语言,also only accepts a single argument 到 quote
:
$ sbcl
* (quote 1 2 3)
debugger invoked on a SIMPLE-ERROR in thread
#<THREAD "main thread" RUNNING {1002B2AE83}>:
wrong number of args to QUOTE:
(QUOTE 1 2 3)
请注意,一般来说,对于任何 Lisp,quote
很少被拼写出来。它只是一种特殊形式,是 '
的扩展。在 '
形式中,甚至 不可能 给出 quote
额外参数:
'(1 2 3) ≡ (quote (1 2 3))
'x ≡ (quote x)
'??? ≡ (quote 1 2 3)
我没有立即看到用任何给定语言扩展 quote
的定义有什么问题,如果有多个参数,将它们评估为一个列表,但我当然看不到用于该功能,要么。
在大多数 lisps 中,quote
会在给出多个参数时出错。这种行为似乎是 Clojure(或 ClojureScript?)的特性。
允许 quote
的多个参数成为一个列表并不是一个很好的设计。如果您有创建列表的操作,您显然应该能够使用它来构造单个元素列表,但修改后的 quote
不允许这样做。
(我测试了 SBCL、Emacs Lisp 和 scheme48,所有这些都抱怨 quote 有多个参数。)
QUOTE
最初的想法是表示一个常量,特别是符号和列表:
(quote sin)
(quote (sin 10))
要获取未引用的数据,我们调用 SECOND
或 CADR
。
(defun unquote (expression)
(second expression))
例如我们可以调用:
(unquote '(quote (sin 10)))
如果知道 (quote sin 10)
与 (quote (sin 10))
相同,那么我们需要为这两种情况重写我们的 unquote 函数:
(defun unquote (expression)
(if (consp (cddr expression))
(cdr expression)
(cadr expression)))
通过添加特殊情况我们不会获得任何新功能,但它会使必须处理此类表达式的代码复杂化...