Lisp中的recursion范围增加了一个句点?
(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
)的cons单元列表的其余部分(即另一个列表)或终止列表的primefaces。 传统的终结者是空列表()
; 被()
终止的列表被认为是“正确的列表”。 任何其他primefaces终止的列表被称为“不正确的列表”。 列表(1 2 3 4 5)
包含元素1,2,3,4和5,并以()
结束。 你可以通过构build它
(cons 1 (cons 2 (cons 3 (cons 4 (cons 5 ())))))
现在,当系统打印一个黑格,一般的情况是打印一下
(car . cdr)
例如, (cons 1 2)
的结果被打印为
(1 . 2)
由于列表是由cons单元格构build的,因此您也可以使用这种表示法:
'(1 2 3 4 5) == '(1 . (2 . (3 . (4 . (5 . ())))))
尽pipe如此,所以大多数人(我所知道的)都有一个特殊的情况来打印cons单元格:如果cdr
是一个列表(或者是另一个单元格,或者是),那么不要打印该列表.
,不要打印cdr
的周围圆括号(否则它会有,因为它是一个列表)。 所以,如果你看到像这样的结果
(1 2 3 . 4)
这意味着你有一个不正确的列表被primefaces4
终止。 它有结构
(1 . (2 . (3 . 4)))
现在的问题是:在你的代码中,列表结构出错了? ..
总是应该返回一个正确的列表,所以让我们看看这些情况:第一个例子总是返回一个正确的列表(空列表):
((> (add1 start) stop) (quote ()))
第二种情况看起来像它可以返回不是列表(假设(sub1 stop) == (- stop 1)
):
((eq? (add1 start) stop) (sub1 stop))
现在,如果..
运行正常,那么第三个例子总是返回一个正确的列表(因为(cons xy)
是一个正确的列表,如果y
是):
(else (cons start (.. (add1 start) stop)))
让你的第二个案例返回一个列表,你应该全部设置。
你的expression式(sub1 stop)
需要阅读(list (sub1 stop))
为了build立一个合适的清单,第二个元素需要成为一个清单本身。 因此,你的函数应该为每个cond
子句返回一个types的列表。
删除这部分的条件
((eq? (add1 start) stop) (sub1 stop))
这是一个过早的完成。