尝试在两个列表中应用函数

时间:2011-12-10 14:30:19

标签: list function scheme racket

我编写了以下代码,以便为两个列表应用函数 这是列表列表的一部分但由于某种原因我在结果中得到#<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))]

2 个答案:

答案 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在技术上应该运行得很好,但正如奥斯卡所提到的那样,冒着覆盖内置程序的风险通常被认为是不好的。

我通过将()更改为'()来更新代码,并且运行得非常完美。