map を自分で定義

もうひとつの Scheme 入門 8. 高階関数


練習問題 6 2. map を自分で定義してみてください。

この問題は以前できなかったんだけれども、思い出してやってみると、すごくダサイけれどそれなりに動くのが出来た。


(use srfi-1)

(define (mymap f . ls)
(if (null? ls)
(print "error:wrong number of arguments")
(if (= (length ls) 1)
(s-map f (car ls)) ; 引数のリストが1のとき
(m-map f 0 ls)))) ; 引数のリストが1以上のとき

;; 引数のリストが1のとき
(define (s-map f ls)
(if (null? ls)
'()
(cons (f (car ls)) (s-map f (cdr ls)))))

;; 引数のリストが1以上のとき
;; n 指定位置を0からリストの長さまで変化させる
(define (m-map f n ls)
(if (= (length ls) n)
'()
(cons (apply f (m1-map f n ls)) (m-map f (+ n 1) ls))))

(define (get n ls) (car (drop ls n)))

;; 各リストの指定位置の要素を集めてリストを作る。
;; n 指定位置
(define (m1-map f n ls)
(if (null? ls)
'()
(cons (get n (car ls)) (m1-map f n (cdr ls)))))

(print (mymap (lambda(x)(+ x 2)) '(1 2 3)))
(print (mymap + '(1 2 3) '(3 4 5) '(6 7 8)))
(print (mymap * '(1 2 3) '(3 4 5) '(6 7 8)))
 
$ gosh mymap.scm
(3 4 5)
(10 13 16)
(18 56 120)