mapcar 関数と mapc 関数比較
もう少しみてみることにした。前に定義した、
(defun mapc-test (lst) (if (listp lst) (mapc #'(lambda (x) (format t "~A~%" (concatenate 'string "Good-bye, " x))) lst) (format t "Usage: mapc-test $LIST~%")))
だと、厳密には mapc の実行結果が出力されていないように見えた。mapc が実行される前に format が実行されているように見える。そのため、これを書き換えた。
(defun mapc-test-improve (lst) (if (listp lst) (mapc #'(lambda (x) (progn (let ( (temp-value (concatenate 'string "Hello, " x)) ) (format t "~A~%" temp-value) ) ) ) lst) (format t "Usage: mapcar-test-improve $LIST~%")))
mapc が mapcar になった以外は全く同じ処理の関数も定義。
(defun mapcar-test-improve (lst) (if (listp lst) (mapcar #'(lambda (x) (progn (let ( (temp-value (concatenate 'string "Hello, " x)) ) (format t "~A~%" temp-value) ) ) ) lst) (format t "Usage: mapcar-test-improve $LIST~%")))
これを、以下のように実行してみた。
? (setf friends '("Taro" "Jiro")) ("Taro" "Jiro") ? (setf result01 (mapcar-test-improve friends)) Hello, Taro Hello, Jiro (NIL NIL) ? (eql friends result01) NIL ? (setf parents '("Dad" "Mom")) ("Dad" "Mom") ? (setf result02 (mapc-test-improve parents)) Hello, Dad Hello, Mom ("Dad" "Mom") ? (eql parents result02) T
渡しているリストのそれぞれの要素に対して、lambda で定義された中の処理が実行されていることが確認できた。そして、mapc と mapcar とでは、戻り値が新しく作成されたリストか、そうでないかと言う点も異なっている。これは想定通りだが・・・mapc の結果、parents の内容が変わるかと思ったが変わっていない。う〜ん・・・let を使ってしまったからそうなのか?もう少しサンプルを練り直す必要がある。もう一度挑戦。