gpt4 book ai didi

lisp - Lisp 中的递归范围添加句点?

转载 作者:太空宇宙 更新时间:2023-11-03 18:37:15 24 4
gpt4 key购买 nike

(define ..
(lambda (start stop)
(cond ((> (add1 start) stop) (quote ()))
((eq? (add1 start) stop) (sub1 stop))
(else (cons start (.. (add1 start) stop))))))

我定义了一个简单的范围函数。目的是为了

(.. 1 5)  -->  (1 2 3 4)

相反,我的元组中添加了一个奇怪的句点,我不知道为什么:

(.. 1 5)  -->  (1 2 3 . 4)

我不明白为什么会这样。感谢任何帮助

最佳答案

Scheme 中的列表要么是空列表 ()(在某些 Lisp 中也称为 nil),要么是 car(也称为 first)是列表的一个元素,其 cdr(也称为 rest)是列表的其余部分(即另一个列表),或终止列表的原子。常规终止符是空列表();以 () 结尾的列表被称为“适当的列表”。由任何其他原子终止的列表称为“不正确的列表”。列表 (1 2 3 4 5) 包含元素 1、2、3、4 和 5,并以 () 结束。你可以通过

(cons 1 (cons 2 (cons 3 (cons 4 (cons 5 ())))))

现在,当系统打印一个cons cell时,一般情况下是打印它

(car . cdr)

例如,(cons 1 2)的结果打印为

(1 . 2)

由于列表是由 cons 单元构成的,因此您也可以将此表示法用于列表:

'(1 2 3 4 5) ==
'(1 . (2 . (3 . (4 . (5 . ())))))

不过,这相当笨拙,所以大多数 lisps(据我所知)都有打印 cons 单元格的特殊情况:如果 cdr 是一个列表(另一个 cons 单元格,或者 ()),那么就不要打印 .,也不要打印 cdr 周围的圆括号(否则它会有,因为这是一个列表)。所以,如果您看到类似

的结果
(1 2 3 . 4)

这意味着您有一个不正确的列表,该列表由原子 4 终止。它具有结构

(1 . (2 . (3 . 4)))

现在的问题是:列表构造在您的代码中哪里出错了? .. 总是应该返回一个正确的列表,所以让我们看一下情况: 第一种情况总是返回一个正确的列表(空列表):

((> (add1 start) stop) (quote ()))

第二种情况看起来它可以返回一些不是列表的东西(假设 (sub1 stop) == (- stop 1)):

((eq? (add1 start) stop) (sub1 stop))

现在,如果 .. 正常运行,那么第三种情况将始终返回一个正确的列表(因为 (cons x y) 是一个正确的列表,如果 y 是):

(else (cons start (.. (add1 start) stop)))

让您的第二个案例返回一个列表,您应该已经准备就绪。

关于lisp - Lisp 中的递归范围添加句点?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16379657/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com