Clojure:创建一个宏来引用地图的每个符号

Neo*_*mov 0 macros clojure

我正在尝试编写一个将地图作为输入的宏,并引用该地图中存在的每个符号(键和值).

这是我想做的.假设我有一个宏quote-everything,它将这样的地图作为输入:

{foo "foo" :bar bar}
Run Code Online (Sandbox Code Playgroud)

然后,评估:

(quote-everything {foo "foo" :bar bar})
Run Code Online (Sandbox Code Playgroud)

会产生:

{quote(foo) "foo" :bar quote(bar)}
Run Code Online (Sandbox Code Playgroud)

基本上,我希望宏生成一个新的地图,其中引用每个符号.问题是我不知道从哪里开始,如果有可能的话.问题是地图可以是任何东西,宏也应该支持嵌套地图.

可以使用来完成符号的检测symbol?.但是,为了支持嵌套映射,宏可能应该调用自己.但我不知道应该如何使用这样的宏创建新地图.

任何指针将不胜感激.

Ale*_*lex 5

quote特殊形式已经这样做了你:

user> (= (quote {foo "foo" :bar bar})
         {(quote foo) "foo" :bar (quote bar)})
;; => true
Run Code Online (Sandbox Code Playgroud)

所有引用都会阻止评估表单.我认为你可能会比实际需要更难.