旋转列表列表

Bla*_*ble 1 list racket

我想采取一个任意的列表列表并"旋转"它.也就是说,对于大小为3x3的列表列表:

#lang racket
(require rackunit)

(define (rotate-lol lol)
  (append (list (map first lol)) (list (map second lol)) (list (map third lol))))

(check-equal? (rotate-lol (list (list 'a 'b 'c)
                                (list 'd 'e 'f)
                                (list 'g 'h 'i)))
          (list (list 'a 'd 'g)
                (list 'b 'e 'h)
                (list 'c 'f 'i)))
Run Code Online (Sandbox Code Playgroud)

我想要list-ref替换first/ second/ third但我无法找到最简洁的方法来做到这一点.

我知道必须有一种优雅的方式来做到这一点.我在过去对这个问题做了一些不太优雅的解决方案,这些解决方案更具针对性,但我想在一般情况下解决这个问题,将其存放在个人库中,并解决问题.任何提示或解决方案?

Syl*_*ter 5

它非常像zip,你不必创建它,因为它已经在SRFI-1列表库中了:

(require srfi/1)
(zip '(a b c) '(d e f) '(g h I)) ; ==> ((a d g) (b e h) (c f i))
Run Code Online (Sandbox Code Playgroud)

现在要将所有参数作为您使用的列表应用:

(apply zip '((a b c) (d e f) (g h I)))
; ==> ((a d g) (b e h) (c f i))
Run Code Online (Sandbox Code Playgroud)

而且,只是为了完整性.以下是如何zip定义:

(define (zip . lsts)
  (apply map list lsts))
Run Code Online (Sandbox Code Playgroud)