使用do in equal说明为什么有时有效,有时无效



这不是重复的关于点"在scheme中

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

原因:

> (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表达式的结果可以再次被看作是一个"cons"单元格,其中non-list为"car",list为"cdr",但这正是列表的定义,它的第一个元素为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,这里我们根据谓词equal?比较两个相等的列表(a b c)

最新更新