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.但是评估时没有区别.
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实际上不会改变它的行为.
嗯,事实上它们非常不同.'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)
自我评估数据真正地评估自己,它们不是某些类型的"预定义符号".