存储解构图以供以后使用

Gar*_*ler 5 clojure map destructuring

我一直试图让它与引用,引用拼接,评估以及我能想到的其他任何东西一起工作,但到目前为止还没有运气.我明白为什么它不工作-它被看作是一张地图,它试图EVAL a,bc-只是没有怎么去解决它.

(def destructor {a :a b :b c :c})
; CompilerException java.lang.RuntimeException: Unable to resolve symbol: a in this context, compiling:(:1:15)

(let [destructor my-map]
  'etc)
Run Code Online (Sandbox Code Playgroud)

我有一个相当复杂的解构图,我正在考虑使用几次,所以把它藏在某个地方似乎是个好主意.也许还有更好的方法可以解决这个问题?

ama*_*loy 3

好主意,但你不能以这种方式做到这一点,因为你想要存储的东西并不是真正的值,所以你不能将它存储在 var 中。

相反,您可以定义一个宏,将其包含在其扩展中:

(defmacro with-abc [abc & body]
  `(let [~'{:keys [a b c]} ~abc]
     ~@body))

(with-abc foo
  (...use a, b, and c...))
Run Code Online (Sandbox Code Playgroud)

  • let 子句中看起来很滑稽的 `~'` 是为了使 a、b 和 c 不会通过语法引用获得名称空间限定。我认为这是必要的,但我现在不在真正的计算机上,所以如果有人看到它,请不要随意编辑。 (3认同)