Ant*_*oy' 6 initialization hashtable constants common-lisp
我正在寻找一种可能非冗长的可移植方式来初始化Common Lisp中的哈希表.例如,适用于常量哈希表的东西,也可用于预加载变量哈希.在CLISP我使用:
(defconstant +my-map+ #S(HASH-TABLE :TEST FASTHASH-EQ
(key1 . "value1")
...
(keyN . "valueN")
))
Run Code Online (Sandbox Code Playgroud)
但不幸的是这种格式只适用于CLISP.
可以在读取时以编程方式构造哈希表:
(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*)
Run Code Online (Sandbox Code Playgroud)
#.用于读取时间评估.然后,编译器将哈希表转储到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}>
Run Code Online (Sandbox Code Playgroud)
将哈希表创建为函数:
(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)
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
1442 次 |
| 最近记录: |