Memoize

BasicWerk   EC Support   Technique   Facebook  

20140908142820_Common_Lisp_loop_hash

Common_Lisp_loop_hash

 

 

loop を使って alist のペアに何かするにはこう。

 
* (defvar lis '((a . 1)(b . 2)(c . 3)))
 
* (loop for (k . v) in lis do (format t "~A:~A~%" k v))
A:1
B:2
C:3
NIL
 
;; 捨てちゃう値のプレースホルダには nil を使う
* (loop for (nil . v) in lis sum v)
 
6
 
;; 上記はこう書いたのと同じ
* (loop for p in lis sum (cdr p))
 
6
 

 

相手が Hash の場合は、

 
* (defparameter h (make-hash-table))
 
* (setf (gethash 'a h) 1 (gethash 'b h) 2 (gethash 'c h) 3)
 
;; んんん〜ちょっと覚えにくい
* (loop for k being the hash-keys in h do (format t "~A:~A~%" k (gethash k h)))
A:1
B:2
C:3
NIL
 

 

場合によっては loop にこだわらず maphash を使おう。

 
;; ちなみに maphash は mapc 的な動きをする
* (maphash (lambda (k v) (format t "~A:~A~%" k v)) h)
A:1
B:2
C:3
NIL
 
;; だから loop の collect 的(というか do 以外の)動作をさせるにはちと面倒
* (let ((lis nil)) 
    (maphash (lambda (k v) (push (cons k v) lis)) h) 
    (nreverse lis))
 
((A . 1) (B . 2) (C . 3))
 
;; loop ~ collect だとスッキリする
* (loop for k being the hash-keys in h collect (cons k (gethash k h)))
 
((A . 1) (B . 2) (C . 3))
 

 


© Shin Nakamura/BasicWerk 2014