Lispで行列の計算プログラム(改良の改良) | ~magi mode~ver3.10

~magi mode~ver3.10

マジックの練習は辞めて今はパソコンばかりいじっている。
アニメ好きだがオシャレも好き。
二次元と三次元の両立を図る日々。
最近トレーニングにもハマってる。

Lispで行列の計算プログラム(改良)の続き。
最初4行は読み込んだ行列を計算するコードだけど実行結果試すときは面倒だからコメントアウトして代わりに行列をsetqしてある。改良したのはそこじゃないけど。
改良したのは再帰の仕方。
今まで再帰の関数には引数にnilを与えてそこに関数結果を積み込んで最後にその戻り値を返すという方法を使ってたけどそれはアホな方法だった。
もっとスマートにするには戻り値に結果を積み込んでいくという方法…ってなんか伝えにくい。
なんにせよ前のと比べたらわかると思うけど、おかげで関数に余計なnilを与えなくて良くなったのと、余計なreverseを与えなくて良くなった。
実際の行列計算プログラムは赤文字のところ。
読みやすくもなったし、今の知識でできるのはこれくらいかな。
一応行列の計算プログラムは完了ということで。
########################################################
#|(format t "行列xを入力してください:~%例:~%((1 2 3)~% (4 5 6)~% (7 8 9))~2%")
(setq x (read))
(format t "行列yを入力してください:~%")
(setq y (read))|#

(setq x '((1 2 3)
              (4 5 6)))

(setq y '((1 5)
              (5 3)
              (8 1)))

(defun conv-y (y)
      (cond ((null (car y)) nil)
            (t (cons (mapcar 'car y) (conv-y (mapcar 'cdr y)))) ))

(defun calc (x y)
      (apply '+ (mapcar '* x y)) )

(defun step-ans2 (x y)
      (cond ((null y) nil)
            (t (cons (calc (car x) (car y)) (step-ans2 x (cdr y)))) ))

(defun step-ans1 (x y)
      (cond ((null x) (print 'end))
            (t (cons (print (step-ans2 x y)) (step-ans1 (cdr x) y))) ))

(format t "~%答え:~%")
(step-ans1 x (conv-y y))
########################################################

p.s.
さらに改変