一つは、プログラムの読み取り時にハッシュテーブルを構築することができます。
(defvar *ht* #.(let ((ht (make-hash-table)))
(loop for (key . value) in
'((a . 1) (b . 2) (c . 3))
do (setf (gethash key ht) value))
ht))
(describe *ht*)
#.
は、読み出し時間の評価のために使用されます。コンパイラは、ハッシュテーブルをFASLファイルにダンプします。
これは、その後コンパイルすることができます:SBCLを使用して
:
* (compile-file "/tmp/test.lisp")
; compiling file "/private/tmp/test.lisp" (written 24 MAY 2012 10:08:49 PM):
; compiling (DEFVAR *HT* ...)
; compiling (DESCRIBE *HT*)
; /tmp/test.fasl written
; compilation finished in 0:00:00.360
#P"/private/tmp/test.fasl"
NIL
NIL
* (load *)
#<HASH-TABLE :TEST EQL :COUNT 3 {100299EA43}>
[hash-table]
Occupancy: 0.2
Rehash-threshold: 1.0
Rehash-size: 1.5
Size: 16
Synchronized: no
T
* *ht*
#<HASH-TABLE :TEST EQL :COUNT 3 {100299EA43}>
ハッシュテーブルを作成する関数として:
(defun create-hashtable (alist
&key (test 'eql)
&aux (ht (make-hash-table :test test)))
(loop for (key . value) in alist
do (setf (gethash key ht) value))
ht)
https://github.com/vseloved/rutils/ blob/master/core/readtable.lisp#L10 –
たとえば、次のように注意してください。 http://www.aiai.ed.ac.uk/~jeff/lisp/cl-pitfallsは、 'defconstant'フォームの値としてハッシュテーブルを使用することを警告します。 – Hugh
ありがとうございました。この基本的な機能は標準では欠けており、何らかの形で追加する必要があります。 PerlやPHPを模倣する新しい構文を導入するのではなく、make-hash-tableをラップし、オプションを追加するマクロを書くことについてどう思いますか?たとえば、make-arrayなどの標準でサポートされている同じオプションのinitial-contents?私はこれがおそらく非常に効率的ではないと思います。なぜなら、コンテンツは横断されなければならないalistによって指定されるだろうが、少なくともLisp構文と一貫しているからです。 –