我想编写一个函数,n
个参数将创建n
个列表,每个参数包含每个参数的第n个元素,例如:
(aux '(1 2) '(3 4)) = `((1 3) (2 4))
我写了这样一个函数:
(define (aux . args)
(if (null? args)
'()
(cons (map car args)
(aux (map cdr args)))))
但是当我尝试评估(aux '(1 2) '(3 4))
时,REPL没有显示任何输出。
我的问题是我应该改变什么,因为我没有看到任何语法错误。
答案 0 :(得分:2)
您忘了在函数中写apply
。别担心,我总是犯这个错误,这就是我立刻发现它的原因。 ; - )
基本上,您需要使用(apply aux (map cdr args))
。否则,仅使用一个参数递归aux
。
哦,你还需要使用(ormap null? args)
而不仅仅是(null? args)
,因为基本情况是所有给定的列表都已用尽,而不是你没有给定的列表。
答案 1 :(得分:2)
let
中,或者做一个本地帮助程序。
(define (zip . args)
(let aux ((args args))
(if (ormap null? args)
'()
(cons (map car args)
(aux (map cdr args))))))
当有不改变的参数时,我也会这样做。例如。只有一个列表的map
实现我没有在每次迭代时传递过程:
(define (map1 proc lst)
(let aux ((lst lst))
(if (null? lst)
'()
(cons (proc (car lst))
(aux (cdr lst))))))
当然实际会发生什么取决于实现,所以不要将其中的任何一个视为优化。它主要用于代码清晰度。