我想建立一個散列表(除其他動作),而read
ing。我不希望哈希表具有全局範圍(但),所以我用宏和gensym
來做這件事。在宏x
內部,我正在定義一個類似於setf
的宏s
,但在散列表中定義了一個條目而不是在某處定義了一個符號。它爆炸了。我想我理解錯誤信息,但是如何使其工作?建立一個散列表gensym和宏小號
代碼:
#!/usr/bin/clisp -repl
(defmacro x (&rest statements)
(let ((config-variables (gensym)))
`(macrolet ((s (place value)
(setf (gethash 'place ,config-variables) value)))
(let ((,config-variables (make-hash-table :test #'eq)))
(progn ,@statements)
,config-variables))))
(defun load-config()
(let ((config-file-tree (read *standard-input*)))
(eval config-file-tree)))
(defun load-test-config()
(with-input-from-string (*standard-input* "(x (s fred 3) (s barney 5))")
(load-config)))
(load-test-config)
輸出:
*** - LET*: variable #:G12655 has no value
The following restarts are available:
USE-VALUE :R1 Input a value to be used instead of #:G12655.
STORE-VALUE :R2 Input a new value for #:G12655.
SKIP :R3 skip (LOAD-TEST-CONFIG)
STOP :R4 stop loading file /u/asterisk/semicolon/build.l/stackoverflow-semi
這看起來很複雜,我敢打賭,你不需要任何東西那。一個宏,一個宏,一個讀取數據的EVALuation,一個字母的宏名,... – 2011-12-25 13:19:29
通常我會同意:它太複雜了。但它是更多參與的一部分。我把它精簡到一個小問題,這個問題更容易提出。 – 2011-12-25 13:43:38
你爲什麼要編碼一個哈希表作爲Lisp源代碼? – 2011-12-25 13:58:09