带有多个参数的QUOTE

Luc*_*ato 3 lisp

我正在分析LISP,我不是专家,但有些事情困扰着我:

一些原语list接受多个参数.例如:

(list 1 2 3)
=> (1 2 3)
Run Code Online (Sandbox Code Playgroud)

另一方面,quote似乎只接受一个参数.例如:

(quote (1 2 3))
=> (1 2 3)
(quote x)
=> 'x
(quote 1 2 3)
=> 1  ???
Run Code Online (Sandbox Code Playgroud)

有没有理由说(quote 1 2 3)引用多个参数,只是忽略其他参数?

如果(quote 1 2 3)评估会发生什么(1 2 3),即提供多个参数的特殊情况?

我知道这个特例是多余的,但我对LISP黑客的问题是:

添加这样的特殊情况quote会破坏一切吗?它会破坏REPL吗?会破坏宏吗?

注意:在http://repl.it/http://clojurescript.net/上测试

jla*_*ahd 5

请注意,Lisp不是单一语言,而是一个有点类似语言的大家族.您似乎已经尝试过Scheme(repl.it运行BiwaScheme)和ClojureScript.

计划规范只定义了一个参数quote,所以BiwaScheme似乎是错误的在这方面.(quote 1 2 3)应该是Scheme中的错误.例如,另一种Scheme方言的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
Run Code Online (Sandbox Code Playgroud)

BiwaScheme是用JavaScript编写的,而JavaScript只是忽略了任何函数的额外参数,所以行为可能来自那里.

ClojureScript可以继承JavaScript或Clojure的方式.Clojure的文档明确指出,quote多个参数仅评估第一个参数.

Common Lisp的,另一种流行的Lisp编程语言,也只接受一个参数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)
Run Code Online (Sandbox Code Playgroud)

请注意,一般来说,对于任何Lisp,quote很少拼写出来.它只是一种特殊的形式,是一种扩展'.在'表单中,甚至不可能提供quote额外的参数:

'(1 2 3) ? (quote (1 2 3))
'x       ? (quote x)
'???     ? (quote 1 2 3)
Run Code Online (Sandbox Code Playgroud)

我不会立即看到quote在任何给定语言中扩展定义的问题,在多个参数的情况下,将它们作为列表进行评估,但我当然也看不到该功能的用途.