Scheme 在equal on方案中使用do-为什么有时有效,有时无效
这不是重复的 除了cons符号外,点的含义是什么? 据我所知,点只是一个符号。所以我不明白这里的意思: 原因: 但是:Scheme 在equal on方案中使用do-为什么有时有效,有时无效,scheme,Scheme,这不是重复的 除了cons符号外,点的含义是什么? 据我所知,点只是一个符号。所以我不明白这里的意思: 原因: 但是: 这里的点是什么意思?在lisp语言中,当读者遇到类似(non-list1.non-list2)的内容时,它将其作为“cons”单元格返回,其“car”是non-list1,其“cdr”是non-list2 现在让我们考虑语法(非列表.list)< /代码>。在这种情况下,读取此s表达式的结果可以再次视为一个“cons”单元,其中非列表为“car”,而列表为“cdr”,但这正是一
这里的点是什么意思?在lisp语言中,当读者遇到类似
(non-list1.non-list2)
的内容时,它将其作为“cons”单元格返回,其“car”是non-list1
,其“cdr”是non-list2
现在让我们考虑语法<代码>(非列表.list)< /代码>。在这种情况下,读取此s表达式的结果可以再次视为一个“cons”单元,其中
非列表
为“car”,而列表
为“cdr”,但这正是一个列表的定义,该列表的第一个元素非列表
,其余元素列表
例如,(2.()
被解读为(2)
,这是一个有2
的列表,它有它的第一个元素,没有其他元素(所以列表的其余部分是空列表,()
)。类似地,(1.(2)()
被解读为(12)
,依此类推
因此,在您的示例中,读取器将语法(equal?.8)
作为包含两个原子、一个符号和一个数字的cons单元格返回,这不是要计算的有效表达式(请记住,在lisp语言中,只能计算第一个元素为“运算符”(函数、宏等)的列表),并将列表的其余部分作为其参数)
让我们考虑第二个表达式,看看它是否是一个有效的表达式列表。
(equal? . ((quote . ((a . (b . (c . ()))))) . ('(a b c))))
部分(a.(b.(c)())
就是列表(a b c)
。因此,我们现在:
(equal? . ((quote . ((a b c))) . ('(a b c))))
(equal? . ((quote (a b c)) . ('(a b c))))
请记住,语法'something
等同于(引用something)
,反之亦然,我们现在有:
(equal? . ((quote . ((a b c))) . ('(a b c))))
(equal? . ((quote (a b c)) . ('(a b c))))
然后:
(equal? . ('(a b c) . ('(a b c))))
让我们来解释最右边的点:
(equal? . ('(a b c) '(a b c)))
最后:
(equal? '(a b c) '(a b c))
这是要计算的有效表达式。记住'X
是数据X
,这里我们比较两个列表(a b c)
,它们根据谓词相等?
相等