Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/clojure/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/wix/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
1和'之间有什么区别;1在Lisp中?_Lisp_Clojure_Scheme_Common Lisp_Quote - Fatal编程技术网

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

1和'之间有什么区别;1在Lisp中?,lisp,clojure,scheme,common-lisp,quote,Lisp,Clojure,Scheme,Common Lisp,Quote,我从来没有真正想过一个符号是否可以是Lisp中的数字,所以今天我对它进行了研究: > '1 1 > (+ '1 '1) 2 > (+ '1 1) 2 > (define a '1) > (+ a 1) 2 上面的代码是scheme,但在公共Lisp和Clojure中似乎也大致相同。1和引用的1之间有什么区别吗?引用会阻止表达式在以后才被计算。例如,以下列表不合适: (1 2 3) 这是因为Lisp将1解释为一个函数,而事实并非如此。因此,必须引用以下列表: '(

我从来没有真正想过一个符号是否可以是Lisp中的数字,所以今天我对它进行了研究:

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

上面的代码是scheme,但在公共Lisp和Clojure中似乎也大致相同。1和引用的1之间有什么区别吗?

引用会阻止表达式在以后才被计算。例如,以下列表不合适:

(1 2 3)
这是因为Lisp将1解释为一个函数,而事实并非如此。因此,必须引用以下列表:

'(1 2 3)
当您引用一个非常简单的表达式(如数字)时,Lisp实际上不会改变其行为

请参阅。

编号为。这就是为什么你不必担心引用它们,就像你引用列表一样

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

(intern "1")
打印
|1 |
,建议另一种输入方式:

'|1|

在Common Lisp中,“1”是(引号1)的缩写。计算时,(引用something)返回未计算的something部分。但是,1个评估值和1个未评估值之间没有差异


所以读者有一个区别:“1读作(引用1),1读作1。但是求值时没有区别。

在Lisp中,撇号阻止符号求值。在数字前使用撇号是不被禁止的,因为数字代表它们自己。但是,与任何其他列表一样,它会自动转换为适当的函数调用。解释器认为这些数字与它们的值一致。

正如已经指出的那样,没有区别,因为数字是根据自己的价值来计算的。您可以使用
eval
确认这一点:

(eval 1)  ;=> 1
顺便说一句,这并不局限于数字。事实上,在公共Lisp中,大多数事物都是根据自身进行评估的。只是除了数字、字符串、符号和列表之外,很少有其他东西需要计算。例如,以下工作:

(eval (make-hash-table))  ;equivalent to just (make-hash-table)
嗯,事实上他们很不一样<代码>'1与
(引用1)
完全相同<代码>(汽车“x)计算为符号“quote”

1
是一个S表达式,它是一个数据的外部表示,一个数字1。如果说
1
是一个“数字对象”或输入该对象的S表达式,则两者都是可以接受的。人们常说,
1
是实际数字对象的外部表示

(quote 1)
是另一个S表达式,它是列表的S表达式,其第一个元素是符号“quote”,第二个元素是数字1。这就是已经不同的地方,与函数不同的是,语法关键字在语言中不被视为对象,也不会对它们求值

但是,两者都是对象(数据)的外部表示形式,其计算结果为同一基准。外部表示为
1
的数字,但它们肯定不是相同的对象,相同的代码,相同的数据,相同的任何东西,它们只是对非常相同的事物求值。数字会自我评估。说它们是一样的,就是说:

(+ 1 (* 3 3))

它们是“相同的”,它们不是,它们都是不同的程序,恰好终止于相同的值,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
)

自评估数据真正自我评估,它们不是某种类型的“预定义符号”。

在Lisp中,
quote
阻止对以下表达式进行评估
引号
的缩写。因此,
'1
(引号1)
相同


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

函数调用?哪个函数?我的意思是写引号(函数调用)!QUOTE不是一个函数。在Lisp中,撇号阻止对任何内容进行求值。在读取期间,它被转换为(引号…)。QUOTE是一种特殊形式,它只返回未赋值的参数。Lisp计算器(解释器或编译器)对此有一个特殊的求值规则。@Rainer我同意你的看法。我只是简单地说,在Lisp中,函数调用是以列表的形式编写的。我在这里详细地回答了一个基本相同的问题:--也许这个答案对你有帮助。为什么会这样?这根本不能回答问题!正确的答案是“数字对自己进行评估”,如下所示。这个答案之所以得到支持,是因为它解释了数字对自己进行评估的原因,并提供了一个指向维基百科文章的链接,提供了更多信息。事实上,它确实回答了这个问题。但是,例如,7维数组和lambda形式都是自评估对象,而cons单元格则不是,我不确定前一个例子比后一个例子更简单。因此,只有将“非常简单的表达式”定义为“自评估对象”时,这才有效我是lisp-y语言的高手,这个解释(a)与OP相关,(b)有帮助这适用于所有自评估表达式我使用的是clojure 1.1.0…
“|1 |
计算为
|1 |
<代码>|1 |返回…
无法解析符号:|1 |
(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
)