【Scheme】mapの定義

mapを定義してみた。

;;; リストの最初の要素を集めてリストにする
(define (first-elems lss)
    (let loop ((ls0 lss) (ls1 '()))
        (if (null? ls0)
            (reverse ls1)
            (loop (cdr ls0)
                  (if (null? (car ls0))
                       ls1
                       (cons (car (car ls0)) ls1))))))

;;; リストのcdrを集めてリストにする
(define (cdrs lss)
    (let loop ((ls0 lss) (ls1 '()))
        (if (null? ls0)
            (reverse ls1)
            (loop (cdr ls0)
                  (if (null? (car ls0))
                      ls1
                      (cons (cdr (car ls0)) ls1))))))

;;; my-mapの定義
(define (my-map func . lss)
    (let loop ((ls0 lss) (ls1 '()))
        (cond
            ((null? ls0) (reverse ls1))
            ((null? (car ls0)) (reverse ls1))
            (else (loop (cdrs ls0) (cons (apply func (first-elems ls0)) ls1))))))