湯浅太一著「Scheme入門」を読んでおります。
その8章の例題問題、8.2.2の解答を見て、疑問があります。
lisp
1 2(define (diff-fmla fmla var) 3 (cond ((symbol? fmla) 4 (if (eq? fmla var) 1 0)) 5 ((number? fmla) 0) 6 (else 7 (case (car fmla) 8 ((+) (cons '+ 9 (map (lambda (f) (diff-fmla f var)) 10 (cdr fmla)))) 11 ((*) (cons '+ 12 (map (lambda (f) (cons '* f)) 13 (diff-*-args (cdr fmla) var)))) 14 ((^) (list '* 15 (caddr fmla) 16 (list '^ 17 (cadr fmla) 18 (- (caddr fmla) 1)) 19 (diff-fmla (cadr fmla) var))) 20 ((-) (list '- 21 (diff-fmla (cadr fmla) var))))))) 22 23 24(define (diff-*-args fmlas var) 25 (if (null? fmlas) 26 '() 27 (cons (cons (diff-fmla (car fmlas) var) 28 (cdr fmlas)) 29 (map (lambda (fs) (cons (car fmlas) fs)) 30 (diff-*-args (cdr fmlas) var))))) 31
これは例えば
lisp
1(diff-fmla '(+ (^ x 2) (* x 2) 'x)
を評価すると
lisp
1(+ (* 2 (^ x 1) 1) (+ (* 1 2) (* x 0)))
と導関数を返す関数です。
疑問なのはまず diff-fmla 関数の
lisp
1((+) (cons '+ 2 (map (lambda (f) (diff-fmla f var)) 3 (cdr fmla))))
です。この
lisp
1(map (lambda (f) (diff-fmla f var)) 2 (cdr fmla))
の部分は
lisp
1(map diff-fmla (cdr fmla) var)
と同じように思えるのですが、何故lambdaでdiff-fmlaを書かなければならないのでしょうか?
ちなみに私に思えたように書いてみると、Errorになりました。
. 次にdiff-*-args関数内の
lisp
1(map (lambda (fs) (cons (car fmlas) fs)) 2 (diff-*-args (cdr fmlas) var))
です。mapのあとにconsを書くならば、何となく
lisp
1(map cons 'a '((1) (2)))
とすれば
lisp
1((a 1) (a 2))
になるように思えるのですが、実際にはこれもエラーになります。mapの後に引数を2つ取る関数(例えばcons)を置くならば、lambdaで一つ一つ書かなければならないのでしょうか?
この2ヶ所がよく納得行きません。お分かりの方、どうかよろしくご教授のほどお願い致します。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。