Lisp中的递归范围添加句点?
我定义了一个简单的范围函数。 目的是为了Lisp中的递归范围添加句点?,lisp,scheme,Lisp,Scheme,我定义了一个简单的范围函数。 目的是为了 (define .. (lambda (start stop) (cond ((> (add1 start) stop) (quote ())) ((eq? (add1 start) stop) (sub1 stop)) (else (cons start (.. (add1 start) stop)))))) 相反,我的元组中添加了一个奇怪的句点,我不知道为什么: (.. 1 5) --&g
(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)
我不明白为什么会这样。感谢任何帮助Scheme中的列表要么是空列表
()
(在某些Lisp中也称为nil
),要么是cons单元格,其car
(也称为first
)是列表的一个元素,其cdr
(也称为rest
)是列表的其余部分(即另一个列表),或者一个终止列表的原子。传统的终止符是空列表()
;以()
结尾的列表称为“正确列表”。由任何其他原子终止的列表称为“不正确列表”。列表(1 2 3 4 5)
包含元素1、2、3、4和5,并以()
终止。你可以用
(.. 1 5) --> (1 2 3 . 4)
现在,当系统打印cons单元格时,一般情况下是通过
(cons 1 (cons 2 (cons 3 (cons 4 (cons 5 ())))))
例如,(cons 1 2)
的结果打印为
(car . cdr)
由于列表是由cons单元格构建的,因此您也可以对列表使用此符号:
(1 . 2)
不过,这相当笨拙,因此大多数Lisp(据我所知)都有一个特殊的情况用于打印cons单元格:如果cdr
是一个列表(或者是另一个cons单元格,或者()
),那么就不要打印
,也不要打印cdr
的括号(因为它是一个列表,否则它会有)所以,如果你看到这样的结果
'(1 2 3 4 5) ==
'(1 . (2 . (3 . (4 . (5 . ())))))
这意味着您得到了一个不正确的列表,该列表由atom4
终止
(1 2 3 . 4)
现在的问题是:在您的代码中,列表的构造哪里出错了?。
总是应该返回一个正确的列表,所以让我们看看案例:第一个案例总是返回一个正确的列表(空列表):
第二种情况看起来可以返回非列表的内容(假设(sub1 stop)=(-stop 1)
):
现在,如果。
功能正常,那么第三种情况将始终返回正确的列表(因为(cons x y)
是正确的列表,如果y
是:
让您的第二个案例返回一个列表,您应该已经准备好了。您的表达式(sub1-stop)
需要读取(list(sub1-stop))
为了让
cons
建立一个合适的列表,第二个元素需要是一个列表本身。因此,函数。
应该为每个cond
子句返回一个某种类型的列表。删除cond的这部分
(else (cons start (.. (add1 start) stop)))
这会导致过早完成。当您执行
(…12)
)时,会使用条件中的哪种情况?它会返回什么?感谢您的建议-解释清楚易懂。
((> (add1 start) stop) (quote ()))
((eq? (add1 start) stop) (sub1 stop))
(else (cons start (.. (add1 start) stop)))
((eq? (add1 start) stop) (sub1 stop))