ひげぽんさんのエントリに出てたお題。3imp はへろへろで微妙かもしれんので、こっちに現実トウヒ (何
こんなカンジ

(deepmap min (lambda (x) (car x)) '((3 p) (2 q))) ;;=> (2 q) 

適当に書いてみた。

(define (deepmap f1 f2 l)
  (let inner-deepmap ((f1 f1)
		      (f2 f2)
		      (l (cdr l))
		      (ret (car l)))
    (if (null? l)
	ret
	(inner-deepmap f1 f2 (cdr l) (if (eq? (f2 ret)
					      (f1 (f2 ret) (f2 (car l))))
					 ret
					 (car l))))))

動作確認。

gosh> (define (deepmap f1 f2 l)
  (let inner-deepmap ((f1 f1)
		      (f2 f2)
		      (l (cdr l))
		      (ret (car l)))
    (if (null? l)
	ret
	(inner-deepmap f1 f2 (cdr l) (if (eq? (f2 ret)
					      (f1 (f2 ret) (f2 (car l))))
					 ret
					 (car l))))))
deepmap
gosh> (deepmap min car '((3 p) (2 q)))
(2 q)
gosh> 

む、これは f1 f2 はスルーで動くのかな。

gosh> (define (deepmap f1 f2 l)
  (let inner-deepmap ((l (cdr l))
		      (ret (car l)))
    (if (null? l)
	ret
	(inner-deepmap (cdr l) 
		       (if (eq? (f2 ret)
				(f1 (f2 ret) (f2 (car l))))
			   ret
			   (car l))))))
deepmap
gosh> (deepmap min car '((3 p) (2 q)))
(2 q)
gosh> 

なんかもの凄いナチュラルなボケをカマシてる気がしてならん。なんか map じゃないし。SICP な map の定義は以下

(define (map p l)
  (if (null? l)
      '()
      (cons (p (car l))
	    (map p (cdr l)))))

ええと基本的にはリストを手繰って要素の f2 が f1 な (日本語微妙) 要素が戻る、のかなぁ。リンクの先には fold なソレを使った例がある。しかも eq? じゃなくって eqv? だし。ええとプログラミング Gauche な 46p に fold が出ている。曰く

リストの要素を順に処理していく手続きの基本になるのは fold です。
プログラミング Gauche より引用

こんなカンジ??

(define (deepmap f1 f2 l)
  (define (cmp l1 l2)
    (f1 (f2 l1) (f2 l2)))
  (fold cmp (car l) (cdr l)))

むむ。違う。

gosh> (define (deepmap f1 f2 l)
  (define (cmp l1 l2)
    (f1 (f2 l1) (f2 l2)))
  (fold cmp (car l) (cdr l)))

deepmap
gosh> (deepmap min car '((3 p) (2 q)))
2
gosh> 

ええと、やっぱ比較してリスト戻さないと駄目。

(define (deepmap f1 f2 l)
  (define (cmp l1 l2)
    (if (equal? (f1 (f2 l1) (f2 l2)) (f2 l1))
	l1
	l2))
  (fold cmp (car l) (cdr l)))

微妙。ちょっと元気出てきたので 3imp ヤッてみるか。