Shammer's Philosophy

My private adversaria

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 を使ってしまったからそうなのか?もう少しサンプルを練り直す必要がある。もう一度挑戦。