#行列積をSchemeで書くのは面倒、というのを目にしたのでやってみた。(define (mul A B) (map (^a (map (^b (apply + (map * a b))) (apply map list B))) A))
#gosh> (mul '((1 2 3) (4 5 6) (7 8 9)) '((3 9 3) (4 5 1) (4 9 5)))
((23 46 20) (56 115 47) (89 184 74))
#検算
#gosh> (use gauche.array)
#<undef>
gosh> (define a (array (shape 0 3 0 3) 1 2 3 4 5 6 7 8 9))
a
gosh> a
#,(<array> (0 3 0 3) 1 2 3 4 5 6 7 8 9)
gosh> (define b (array (shape 0 3 0 3) 3 9 3 4 5 1 4 9 5))
b
gosh> b
#,(<array> (0 3 0 3) 3 9 3 4 5 1 4 9 5)
gosh> (array-mul a b)
#,(<array> (0 3 0 3) 23 46 20 56 115 47 89 184 74)
#確かにapply書くのが面倒だな。
#+ を畳み込みに流用しようとすればそうなるということでしょうかね。
#; srfi-42使った方が読みやすいけど少し長くなる
(define (mul A B) (list-ec (: a A) (list-ec (: b (apply map list B)) (apply + (map * a b))))
#; 仮に (apply f x) を (f $ x) と書けたとすれば
(define (mul A B) (list-ec (: a A) (list-ec (: b (map list $ B)) (+ $ (map * a b)))))