这不是重复的关于点"在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)
。