2010-06-03 120 views
33

我从来没有真正想过一个符号是否可以在Lisp的一个数字,所以我今天发挥它周围:Lisp中1和'1之间有什么区别?

> '1 
1 
> (+ '1 '1) 
2 
> (+ '1 1) 
2 
> (define a '1) 
> (+ a 1) 
2 

上面的代码方案,但它似乎是大致的Common Lisp同还有Clojure。 1和报价1有什么区别?

+3

我进入了相当多的细节回答基本上相同的问题在这里:http://stackoverflow.com/questions/2297452/using-quote-in-clojure - 也许这个答案可能会对你有所帮助。 – 2010-06-03 22:06:01

回答

10

那么,它们实际上是非常不同。然而,'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 
) 

自我评估数据真正评估自己,他们是不是“预定义的符号”有些种类。

11

引用可以防止表达式在晚些时候被评估。例如,以下不是正确的列表:

(1 2 3) 

这是因为Lisp将1解释为函数,而不是。因此,名单必须被引用:

'(1 2 3) 

当你举一个很简单的表达了一些这样的,Lisp的不能有效地改变其行为。

参见Wikipedia: Lisp

+2

为什么这会得到upvotes?这根本不回答这个问题!正确的答案是“数字评估自己”,如下所示。 – mquander 2010-06-04 18:08:37

+1

这个答案得到了提升,因为它解释了为什么数字评估自己,并提供了一个链接到维基百科文章与进一步的信息。它确实回答了这个问题。 – mcandre 2010-06-15 17:39:51

+1

但是例如,7维数组和lambda表单是自我评估的对象,而缺陷单元不是,我不确定我会将前面的示例称为比后者更简单的示例。所以这只适用于将“非常简单的表达式”定义为“自我评估对象”的情况。 :-) – Ken 2010-07-04 22:16:42

14

数字是self-evaluating objects。这就是为什么你不必担心引用它们,就像你所做的那样,比如说,列表。

符号可以从任何字符串。如果你想,其名称是单个字符1的符号,你可以说:

(intern "1") 

它打印|1|,这意味着一个备用的方式进入它:

'|1| 
+0

我使用clojure 1.1.0 ...''| 1 |'评估为' | 1 |'。 '| 1 |'带回......'无法解析符号:| 1 |' – Droogans 2012-02-22 04:30:05

25

Common Lisp中,“1 (QUOTE 1)的简写。评估时,(报价东西)返回东西部分,未评估。然而,1评估和1评估没有区别。

所以对读者有一个区别:'1读为(QUOTE 1),1读为1.但是在评估时没有区别。

+2

这适用于所有自我评估的表达式 – mathk 2010-06-08 11:36:22

1

在Lisp中,撇号防止符号被评估。在数字之前使用撇号是不被禁止的,因为数字代表它们自己,所以没有必要。但是,像其他任何列表一样,它会自动转换为适当的函数调用。口译员认为这些数字与他们的价值一致。

+0

函数调用?哪个功能? – 2010-06-03 18:55:35

+0

我打算写QUOTE(函数调用)! – Secko 2010-06-03 19:06:42

+0

QUOTE不是函数。在Lisp中,撇号阻止评估任何东西。在阅读期间,它被转换成(引用...)。 QUOTE是一种特殊的形式,它只是返回未评估的论点。 Lisp评估者(解释者或编译器)对此有一个特殊的评估规则。 – 2010-06-04 17:59:50

1

正如已经指出的那样,没有区别,因为数字评估自己。您可以使用eval确认:

(eval 1) ;=> 1 

顺便说一下,这不仅限于数字。事实上,在Common Lisp中,大多数事情都是自己评估的。这只是非常罕见的数字,字符串,符号和列表以外的东西进行评估。例如,下面的工作:

(eval (make-hash-table)) ;equivalent to just (make-hash-table) 
1

在Lisp中,quote阻止评估以下表达式。 'quote的简写。因此,'1(quote 1)相同。

但是,在Lisp中,符号永远不可能是数字。我的意思是,'abc是一个符号,但'123不是(评估为)符号。我认为Lisp的设计是错误的。另一种情况不仅是#t#f可以用作布尔表达式。

相关问题