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 |