我编写了以下代码,以便为两个列表应用函数
这是列表列表的一部分但由于某种原因我在结果中得到#<void>
个值。
代码:
(define (applyFunc list)
(cond ((null? list) ())
((null? (cdr list)) (car list))
(else (cons (func (car list) (car (cdr list)))
(applyFunc (cdr (cdr list)))))))
func
是一个在两个给定列表上应用函数的函数
跟踪我的代码得到的是:
>(applyFunc '((1) (1 1) (1 1 1) (1 1 1 1)))
> (applyFunc '((1 1 1) (1 1 1 1)))
> >(applyFunc '())
< <'()
< '(#<void>)
<'(#<void> #<void>)
(#<void> #<void>)
[假设输入为'((1) (1 1) (1 1 1) (1 1 1 1))
]
答案 0 :(得分:4)
首先要处理的几个错误:
list
一个过程参数(或其他任何事情),因为这是Scheme中的一个内置过程,你将覆盖它。'()
,而不是()
除此之外,您的程序运行正常:
(define (applyFunc lst)
(cond ((null? lst) '())
((null? (cdr lst)) (car lst))
(else (cons (func (car lst) (car (cdr lst)))
(applyFunc (cdr (cdr lst)))))))
问题可能在func
过程中,确保它确实适用于两个列表。我用这个测试了你的代码,它没有任何障碍:
(define (func l1 l2)
(append l1 l2))
答案 1 :(得分:-1)
我同意上面的奥斯卡。您的代码的主要问题是,在空案例中,您返回的是()
而不是'()
。
就你的命名惯例而言,list
在技术上应该运行得很好,但正如奥斯卡所提到的那样,冒着覆盖内置程序的风险通常被认为是不好的。
我通过将()
更改为'()
来更新代码,并且运行得非常完美。