Memoize

BasicWerk   EC Support   Technique   Facebook  

20140815194324_common_lisp_mapc_dolist

common_lisp_mapc_dolist

 

 

副作用のみを目的として map するときは mapcar ではなく mapc を使ったほうが効率が良い。

 
* (mapc #'princ '("a" "b" "c"))
abc
("a" "b" "c")
 

 

ただし、上記の処理にちょっと手を加えたい、もしくは少し凝ったことをしたい場合は第2引数の関数を lamda にするなどの作業が必要。

 
* (mapc (lambda (x) (format t "~A~%" x)) '("a" "b" "c"))
a
b
c
("a" "b" "c")
 

 

mapc の代わりに dolist が使える。

 
* (dolist (x '("a" "b" "c")) (format t "~A~%" x))
a
b
c
NIL
 

 

dolist の中のシンボル x の役割に注目すれば(副作用上は)mapc と等価であることがわかり易い。

 

当然下記のシンボル p はリスト(ペア)を受け取る。

 
* (dolist (p '((a . b) (c . d))) (format t "~S~%" p))
(A . B)
(C . D)
NIL
 

 

dolist が便利なのは body 部にいくつでも処理を書き込めるところだ。

 
* (dolist (p '((a . b) (c . d))) (format t "~S~%" p) (format t "key is ~A~%" (car p)))
(A . B)
key is A
(C . D)
key is C
NIL
 

 

つまり mapc に比べて後からの変更が楽。

 


© Shin Nakamura/BasicWerk 2014