Scheme 从列表创建列表

Scheme 从列表创建列表,scheme,racket,Scheme,Racket,我想为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'(12)'(34))时,REPL不会显示任何输出。

我想为
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'(12)'(34))
时,REPL不会显示任何输出。
我的问题是我应该更改什么,因为我没有看到任何语法错误。

您忘记在函数中编写
apply
。别担心,我一直都犯这个错误,这就是为什么我马上发现了它

基本上,您需要使用
(apply aux(map cdr args))
。否则,您的
aux
将仅使用一个参数递归到


哦,您还需要使用
(ormap null?args)
,而不仅仅是
(null?args)
,因为基本情况是所有给定的列表都已用尽,而不是没有给定的列表。

您忘记在函数中编写
apply
。别担心,我一直都犯这个错误,这就是为什么我马上发现了它

基本上,您需要使用
(apply aux(map cdr args))
。否则,您的
aux
将仅使用一个参数递归到


哦,您还需要使用
(ormap null?args)
,而不仅仅是
(null?args)
,因为基本情况是所有给定的列表都已用尽,而不是没有给定的列表。

克里斯是正确的。如果您想使用REST参数,然后在递归中使用它,则应该考虑将其包装在命名<代码> > 或创建本地帮助程序。

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

当然,实际会发生什么取决于实现,所以不要认为这些都是优化。这主要是为了代码清晰。

克里斯是正确的。如果您想使用REST参数,然后在递归中使用它,则应该考虑将其包装在命名<代码> > 或创建本地帮助程序。

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

当然,实际会发生什么取决于实现,所以不要认为这些都是优化。这主要是为了代码清晰。

虽然它没有解决代码中的问题,但请注意,这通常是通过(映射列表)来完成的。例如,(map list'(12)'(34))产生((13)(24)),而(apply map list'((12)(34))产生相同的结果。虽然它不能解决代码中的问题,但请注意,这通常是通过(map list)来完成的。例如,(映射列表’(12)’(34))产生((13)(24)),并且(应用映射列表’((12)(34))产生相同的结果。