Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/scheme/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Lisp中的递归范围添加句点?_Lisp_Scheme - Fatal编程技术网

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 . ())))))
这意味着您得到了一个不正确的列表,该列表由atom
4
终止

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