lisp - 带有多个参数的 QUOTE

标签 lisp

我正在分析 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/http://clojurescript.net/

最佳答案

请注意,Lisp 不是一种单一的语言,而是一个由多少有些相似的语言组成的大家族。您似乎已经尝试过 Scheme(repl.it 运行 BiwaScheme)和 ClojureScript。

Scheme spec只为 quote 定义了一个参数,因此 BiwaScheme 在这方面似乎是错误的。 (quote 1 2 3) 应该是Scheme中的一个错误。例如,Racket ,Scheme 的另一种方言,不接受它们:

$ 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 会简单地忽略任何函数的额外参数,因此行为可能来自那里。

ClojureScript 可能会从 JavaScript 或 Clojure 继承其行为方式。 Clojure's documentation明确声明具有多个参数的 quote 仅计算第一个参数。

Common Lisp,另一种流行的 Lisp 语言,also only accepts a single argument 引用:

$ 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 的定义有什么问题,如果有多个参数,将它们作为一个列表进行评估,但我当然没有看到一个用途对于那个功能,要么。

关于lisp - 带有多个参数的 QUOTE,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28122615/

相关文章:

algorithm - Lisp 堆栈溢出边界

clojure - lisp 宏在典型开发中真的有用吗?

LISP-简单函数,语法错误?

clojure - 初学者 Clojurist 惰性序列错误 : Don't know how to create ISeq from: java. lang.Long

emacs - SLIME 中的自动完成括号

lisp - 可以在 Scheme REPL 中重置用户环境吗?

lisp - Lisp : The LET binding spec is malformed 错误

lisp - clisp、plain-odbc 和连接到 sql server 数据库

javascript - 如何编写能够正确缩进方案代码的 JavaScript 函数?

lisp - CLOS 中的构造函数等价于什么?