scheme - 在方案中使用平等 - 为什么有时它是有效的,有时不是
问题描述
除了 cons 符号之外,点的含义是什么?据我所知,点只是缺点符号。所以我不明白这里的意思:
为什么:
> (equal? . 8)
Exception: invalid syntax (equal? . 8)
Type (debug) to enter the debugger.
但:
> (equal? . ((quote . ((a . (b . (c . ()))))) . ('(a b c))))
#t
这里的点是什么意思?
解决方案
在 lisp 语言中,当阅读器遇到类似的内容时(non-list1 . non-list2)
,它会将其作为“cons”单元格返回,其“car”是non-list1
,其“cdr”是non-list2
。
现在让我们考虑一下语法(non-list . list)
。在这种情况下,读取这个 s 表达式的结果可以再次被视为带有non-list
“car”和list
“cdr”的“cons”单元格,但这正是具有其第一个元素的列表的定义non-list
,并且它的其余元素list
。
因此,例如,(2 . ())
读作(2)
,它是2
具有第一个元素且没有其他元素的列表(因此列表的其余部分是空列表,()
)。类似地,(1 . (2 . ()))
读作(1 2)
,依此类推。
因此,在您的示例中,阅读器将语法(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))))
请记住,语法'something
等价于(quote something)
,反之亦然,我们现在有:
(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)
根据谓词比较两个相等的列表equal?
。