[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
Re: Hash tables - how to look up values?
From: |
Thorsten Jolitz |
Subject: |
Re: Hash tables - how to look up values? |
Date: |
Wed, 04 Jul 2012 16:21:32 +0200 |
User-agent: |
Gnus/5.130002 (Ma Gnus v0.2) Emacs/24.0.93 (gnu/linux) |
"Pascal J. Bourguignon" <pjb@informatimago.com> writes:
>> I could not find such a function - does it exist already?
>
> rassoc returns the first hit, because lists, even association lists are
> ordered. Hash tables are not ordered. We can write something similar,
> returning the first hit, but there's no guarantee the first will always
> be the same.
>
>
> (require 'cl)
>
> (defun* getkey (val table &key (test (function eql)) (default nil))
> ;; (hash-table-test table) is for keys, not for values…
> (maphash (lambda (k v)
> (when (funcall test val v) (return-from getkey k)))
> table)
> default)
>
> (let ((h (make-hash-table)))
> (setf (gethash :one h) "un"
> (gethash :two h) "deux"
> (gethash :a h) "un")
> (getkey "un" h :test (function string=)))
> --> :one ; or :a, who knows?
>
> I'd rather write:
>
> (defun* getkeys (val table &key (test (function eql)))
> ;; (hash-table-test table) is for keys, not for values…
> (let ((keys '()))
> (maphash (lambda (k v)
> (when (funcall test val v) (push k keys)))
> table)
> keys))
>
> (let ((h (make-hash-table)))
> (setf (gethash :one h) "un"
> (gethash :two h) "deux"
> (gethash :a h) "un")
> (getkeys "un" h :test (function string=)))
> --> (:a :one)
Great! Thats most amazing about Emacs and its community - if you ask for
a functionality that does not yet exists, it might well exist 5 minutes
later just because you asked for it.
Thanks a lot, exactly what I need.
--
cheers,
Thorsten