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)) 

这是一个过早的完成。