Lisp中1和1之间有什么区别?

Jas*_*ker 33 lisp scheme clojure common-lisp quote

我从来没有真正想过一个符号是否可以成为Lisp中的数字,所以我今天玩弄了它:

> '1
1
> (+ '1 '1)
2
> (+ '1 1)
2
> (define a '1)
> (+ a 1)
2
Run Code Online (Sandbox Code Playgroud)

上面的代码是scheme,但它在Common Lisp和Clojure中看起来大致相同. 是否有1,并引述1之间有什么区别?

Xac*_*ach 26

在Common Lisp中,'1是(QUOTE 1)的简写.在评估时,(QUOTE something)返回一些未评估的 部分.但是,1个评估和1个未评估之间没有区别.

所以读者有一点不同:'1读作(QUOTE 1),1读作1.但是评估时没有区别.

  • 这适用于所有自我评估的表达 (2认同)

Ken*_*Ken 14

数字是自我评估的对象.这就是为什么你不必担心引用它们,就像你使用列表一样.

符号可以由任何字符串组成.如果您想要名称为单个字符的符号1,您可以说:

(intern "1")
Run Code Online (Sandbox Code Playgroud)

打印|1|,建议另一种输入方式:

'|1|
Run Code Online (Sandbox Code Playgroud)


mca*_*dre 11

引用可防止在以后对表达式进行求值.例如,以下内容不是正确的列表:

(1 2 3)
Run Code Online (Sandbox Code Playgroud)

这是因为Lisp将1解释为函数,而不是.所以必须引用该列表:

'(1 2 3)
Run Code Online (Sandbox Code Playgroud)

当你引用一个非常简单的表达式(如数字)时,Lisp实际上不会改变它的行为.

维基百科:Lisp.

  • 为什么这会成功?这根本不回答这个问题!正确答案是"数字评估自己",如下所示. (2认同)
  • 我是lisp-y语言的noobie,这个解释(a)与OP有关,(b)有用 (2认同)

Zor*_*orf 9

嗯,事实上它们非常不同.'1然而,与...完全相同(quote 1).(car ''x)评估符号'quote'.

1是一个S表达式,它是一个数据的外部表示,一个数字1.要说这1是一个'数字对象'或一个进入该对象的S表达式都是可以接受的.通常它被认为1是实际数字对象的外部表示.

(quote 1)是另一个S表达式,它是列表的S表达式,其第一个元素是符号'quote',第二个元素是数字1.这是它已经不同的地方,句法关键字,与函数不同,不被视为对象语言,他们不评估他们.

但是,两者都是对象(数据)的外部表示,它们评估相同的数据.它的外部表示的数字,1然而它们肯定不是相同的对象,相同的,代码,相同的数据是相同的,它们只是评估到同一个东西.数字评估自己.说它们是相同的是说:

(+ 1 (* 3 3))
Run Code Online (Sandbox Code Playgroud)

(if "Strings are true" (* 5 (- 5 3)) "Strings are not true? This must be a bug!")
Run Code Online (Sandbox Code Playgroud)

是'相同',它们不是,它们都是不同的程序,恰好会终止到相同的值,一个lisp表单也是一个程序,一个表单是一个数据,也是一个程序,记住.

此外,我曾经被教过一个方便的技巧,这表明自我评估数据在输入时确实不是符号:

(let ((num 4))
  (symbol? num) ; ====> evaluates to #f
  (symbol? 'num) ; ====> evaluates to #t
  (symbol? '4) ; ====> evaluates to #f
  (symbol? '#\c) ; #f again, et cetera
  (symbol? (car ''x)) ; #t
  (symbol? quote) ; error, in most implementations
)
Run Code Online (Sandbox Code Playgroud)

自我评估数据真正地评估自己,它们不是某些类型的"预定义符号".