Một lập trình có thể xây dựng một bảng băm lúc đọc:
(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*)
#.
được sử dụng để đánh giá thời gian đọc. Trình biên dịch sau đó sẽ đổ bảng băm vào tệp FASL.
này sau đó có thể được biên dịch:
Sử dụng 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}>
Tạo một bảng băm là một hàm:
(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)
Nguồn
2012-05-24 20:24:27
https://github.com/vseloved/rutils/ blob/master/core/readtable.lisp # L10 –
Lưu ý rằng vd http://www.aiai.ed.ac.uk/~jeff/lisp/cl-pitfalls cảnh báo chống lại việc sử dụng các bảng băm làm giá trị cho các dạng 'defconstant'. – Hugh
Xin cảm ơn tất cả. Có vẻ như tính năng cơ bản này thiếu tiêu chuẩn và phải được thêm vào theo một cách nào đó. Thay vì giới thiệu cú pháp mới, bắt chước Perl hoặc PHP, bạn nghĩ gì về việc viết macro bao bọc bảng băm và thêm tùy chọn: nội dung ban đầu, tùy chọn tương tự được hỗ trợ trong tiêu chuẩn bằng, ví dụ: make-array? Tôi nghĩ rằng điều này sẽ không có thể rất hiệu quả, vì nội dung sẽ được xác định bởi một alist mà phải được duyệt qua, nhưng ít nhất nó phù hợp hơn với cú pháp Lisp. –