首页 > 解决方案 > 在方案中使用平等 - 为什么有时它是有效的,有时不是

问题描述

这不是关于点“。”的重复。在计划中

除了 cons 符号之外,点的含义是什么?据我所知,点只是缺点符号。所以我不明白这里的意思:

为什么:

> (equal? . 8)
Exception: invalid syntax (equal? . 8)
Type (debug) to enter the debugger.

但:

> (equal? . ((quote . ((a . (b . (c . ()))))) . ('(a b c))))
#t

这里的点是什么意思?

标签: scheme

解决方案


在 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?


推荐阅读