| 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 |