球拍列表语法似乎不一致

时间:2017-02-22 00:13:42

标签: list syntax racket

list的语法似乎很神秘

'(1 2)和(list 1 2)是相同的:

> (equal? '(1 2) (list 1 2))
#t

但这些不一样???

(equal? '('(1 2)) (list (list 1 2)))
#f

>  (list (list 1 2))
'((1 2))

> '( '(1 2))
'('(1 2))

1 个答案:

答案 0 :(得分:2)

是的,那些是不同的。这里的答案是引用比你想象的要强大得多。

具体来说,引用会让您进入"数据语言&#34 ;;在这种数据语言中,每对括号都引入了一个嵌套列表,每个标识符都被视为一个符号。

所以,例如,

'(a (b c) d "e" ((g)))

相同
(list 'a (list 'b 'c) 'd "e" (list (list 'g)))

注意第一个比第二个短了多少。

当你在引用的术语中加上引用的术语时,你会得到惊喜;这是因为' t实际上是(引用t)的简写。所以'('(1 2))是(quote((quote(1 2))))的缩写,与(list(list' quote(list 1 2))相同))。

简短版本:不要在引用中加上引号,并记住引号输入数据语言"。 quasiquote使事情变得更加有趣!