私はread
ingの間に(他のアクションの中で)ハッシュテーブルを構築しようとしています。私はハッシュテーブルにグローバルスコープ(まだ)を持たせたくないので、マクロとgensym
でこれをやっています。 x
のマクロの中でsetf
に似ているが、どこかにシンボルを定義するのではなく、ハッシュテーブルのエントリを定義するマクロs
を定義しています。それは爆破する。私はエラーメッセージを理解していると思いますが、どのように動作させるのですか?gensymとmacroletを使ってハッシュテーブルを構築する
コード:
#!/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)
出力:であること、あなたにもマクロを定義しているので、通常の規則が適用され、あなたが式をバッククォートする必要がある。すなわちmacrolet
で
*** - 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
これは私があなたが何を必要としないことを賭けるだろうと非常に複雑に見えますそれ。マクロ、マクロレット、読み込みデータの評価、1文字のマクロ名、... –
通常、私は同意します:それはあまりにも複雑です。しかし、それはもっと関わっているものの一部です。私は一口サイズの状況にそれを蒸留したので、質問するのが簡単になりました。 –
なぜLispソースコードとしてハッシュテーブルをエンコードしたいのですか? –