common-lisp                
            Hashtabeller
        
        
            
    Sök…
Skapa ett hashbord
 Hashtabeller skapas av make-hash-table : 
(defvar *my-table* (make-hash-table))
Funktionen kan ta nyckelordsparametrar för att ytterligare specificera beteendet hos den resulterande hashtabellen:
-  test: Väljer funktionen som används för att jämföra tangenter för jämlikhet. Kanske en beteckning för en av funktionernaeq,eql,equalellerequalp. Standardvärdet äreq.
-  size: Ett ledtråd till implementeringen om utrymmet som initialt kan krävas.
-  rehash-size: Om ett heltal (> = 1) kommer hashtabellen att öka sin kapacitet med det angivna numret när du gör en omskalning. Om det annars är en flottör (> 1.0), kommer hashtabellen att öka sin kapacitet till produkten frånrehash-sizeoch den föregående kapaciteten.
-  rehash-threshold: Anger hur fullständigt hashtabellen måste vara för att utlösa en omväxling.
Iterera över inmatningarna i en hashtabell med maphash
(defun print-entry (key value)
  (format t "~A => ~A~%" key value))
(maphash #'print-entry *my-table*) ;; => NIL
 Användning av maphash gör det möjligt att iterera över inmatningarna i en hashtabell. Ordningen på iteration är ospecificerad. Det första argumentet är en funktion som accepterar två parametrar: nyckeln och värdet på den aktuella posten. 
 maphash returnerar alltid NIL . 
Iterera över inmatningarna i ett hashbord med slinga
Loop- makroen stöder iteration över tangenterna, värdena eller tangenterna och värdena i en hashtabell. Följande exempel visar möjligheter, men syntaxen med full slinga tillåter fler kombinationer och varianter.
Över nycklar och värden
(let ((ht (make-hash-table)))
  (setf (gethash 'a ht) 1
        (gethash 'b ht) 2)
  (loop for k being each hash-key of ht
     using (hash-value v)
     collect (cons k v)))
;;=> ((A . 1) (B . 2))
(let ((ht (make-hash-table)))
  (setf (gethash 'a ht) 1
        (gethash 'b ht) 2)
  (loop for v being each hash-value of ht
     using (hash-key k)
     collect (cons k v)))
;;=> ((A . 1) (B . 2))
Över nycklar
(let ((ht (make-hash-table)))
  (setf (gethash 'a ht) 1
        (gethash 'b ht) 2)
  (loop for k being each hash-key of ht
       collect k))
;;=> (A B)
Övervärden
(let ((ht (make-hash-table)))
  (setf (gethash 'a ht) 1
        (gethash 'b ht) 2)
  (loop for v being each hash-value of ht
       collect v))
;;=> (1 2)
Iterera över inmatningarna i ett hashtabell med en hastabell iterator
Nycklarna och värdena för en hashtabell kan itereras över med makro med hash-tabell-iterator . Detta kan vara lite mer komplicerat än maphash eller loop , men det kan användas för att implementera iterationskonstruktionerna som används i dessa metoder. with-hash-table-iterator tar ett namn och en hash-tabell och binder namnet i en kropp så att på varandra följande samtal till namnet producerar flera värden: (i) en booleska som indikerar om ett värde är närvarande; (ii) postens nyckel; och (iii) postens värde.
(let ((ht (make-hash-table)))
  (setf (gethash 'a ht) 1
        (gethash 'b ht) 2)
  (with-hash-table-iterator (iterator ht)
    (print (multiple-value-list (iterator)))
    (print (multiple-value-list (iterator)))
    (print (multiple-value-list (iterator)))))
;; (T A 1) 
;; (T B 2) 
;; (NIL)