我从来没有真正想过一个符号是否可以在Lisp的一个数字,所以我今天发挥它周围:Lisp中1和'1之间有什么区别?
> '1
1
> (+ '1 '1)
2
> (+ '1 1)
2
> (define a '1)
> (+ a 1)
2
上面的代码方案,但它似乎是大致的Common Lisp同还有Clojure。 是 1和报价1有什么区别?
我从来没有真正想过一个符号是否可以在Lisp的一个数字,所以我今天发挥它周围:Lisp中1和'1之间有什么区别?
> '1
1
> (+ '1 '1)
2
> (+ '1 1)
2
> (define a '1)
> (+ a 1)
2
上面的代码方案,但它似乎是大致的Common Lisp同还有Clojure。 是 1和报价1有什么区别?
那么,它们实际上是非常不同。然而,'1
与(quote 1)
完全相同。 (car ''x)
评估为符号'quote'。
1
是S表达式,它是数据的外部表示,数字1.要说1
是一个“数字对象”或用于输入该对象的S表达式都是可以接受的。通常据说1
是实际数字对象的外部表示。
(quote 1)
是另一个S-表达,这是一个S-表达为一个列表其第一个元素是符号“报价”和其第二元件是数字1。这是它已经不同,句法的关键字,不像功能,不被视为语言中的对象,并且他们不评估它们。
但是,两者都是对象(数据)的外部表示,它们将评估为为相同的数据。其外部表示形式为1
的数字,它们当然不是相同的对象,相同的代码,相同的数据都是相同的,它们只是对同一事物进行评估。数字评估自己。如果说它们是相同的是说:
(+ 1 (* 3 3))
而且
(if "Strings are true" (* 5 (- 5 3)) "Strings are not true? This must be a bug!")
是“相同的”,他们不是,他们是这只是碰巧终止两个不同的程序同样的价值,一个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
)
自我评估数据真正评估自己,他们是不是“预定义的符号”有些种类。
引用可以防止表达式在晚些时候被评估。例如,以下不是正确的列表:
(1 2 3)
这是因为Lisp将1解释为函数,而不是。因此,名单必须被引用:
'(1 2 3)
当你举一个很简单的表达了一些这样的,Lisp的不能有效地改变其行为。
为什么这会得到upvotes?这根本不回答这个问题!正确的答案是“数字评估自己”,如下所示。 – mquander 2010-06-04 18:08:37
这个答案得到了提升,因为它解释了为什么数字评估自己,并提供了一个链接到维基百科文章与进一步的信息。它确实回答了这个问题。 – mcandre 2010-06-15 17:39:51
但是例如,7维数组和lambda表单是自我评估的对象,而缺陷单元不是,我不确定我会将前面的示例称为比后者更简单的示例。所以这只适用于将“非常简单的表达式”定义为“自我评估对象”的情况。 :-) – Ken 2010-07-04 22:16:42
数字是self-evaluating objects。这就是为什么你不必担心引用它们,就像你所做的那样,比如说,列表。
符号可以从任何字符串。如果你想,其名称是单个字符1
的符号,你可以说:
(intern "1")
它打印|1|
,这意味着一个备用的方式进入它:
'|1|
我使用clojure 1.1.0 ...''| 1 |'评估为' | 1 |'。 '| 1 |'带回......'无法解析符号:| 1 |' – Droogans 2012-02-22 04:30:05
Common Lisp中,“1 (QUOTE 1)的简写。评估时,(报价东西)返回东西部分,未评估。然而,1评估和1评估没有区别。
所以对读者有一个区别:'1读为(QUOTE 1),1读为1.但是在评估时没有区别。
这适用于所有自我评估的表达式 – mathk 2010-06-08 11:36:22
在Lisp中,撇号防止符号被评估。在数字之前使用撇号是不被禁止的,因为数字代表它们自己,所以没有必要。但是,像其他任何列表一样,它会自动转换为适当的函数调用。口译员认为这些数字与他们的价值一致。
函数调用?哪个功能? – 2010-06-03 18:55:35
我打算写QUOTE(函数调用)! – Secko 2010-06-03 19:06:42
QUOTE不是函数。在Lisp中,撇号阻止评估任何东西。在阅读期间,它被转换成(引用...)。 QUOTE是一种特殊的形式,它只是返回未评估的论点。 Lisp评估者(解释者或编译器)对此有一个特殊的评估规则。 – 2010-06-04 17:59:50
正如已经指出的那样,没有区别,因为数字评估自己。您可以使用eval
确认:
(eval 1) ;=> 1
顺便说一下,这不仅限于数字。事实上,在Common Lisp中,大多数事情都是自己评估的。这只是非常罕见的数字,字符串,符号和列表以外的东西进行评估。例如,下面的工作:
(eval (make-hash-table)) ;equivalent to just (make-hash-table)
在Lisp中,quote
阻止评估以下表达式。 '
是quote
的简写。因此,'1
与(quote 1)
相同。
但是,在Lisp中,符号永远不可能是数字。我的意思是,'abc
是一个符号,但'123
不是(评估为)符号。我认为Lisp的设计是错误的。另一种情况不仅是#t
或#f
可以用作布尔表达式。
我进入了相当多的细节回答基本上相同的问题在这里:http://stackoverflow.com/questions/2297452/using-quote-in-clojure - 也许这个答案可能会对你有所帮助。 – 2010-06-03 22:06:01