clojure - 如何编写 Clojure 宏来获取 var 的值?
问题描述
user=> (def v-1 "this is v1")
user=> (def v-2 "this is v2")
user=> (defmacro m [v] (symbol (str "v-" v)))
user=> (m 1)
"this is v1"
user=> (m 2)
"this is v2"
user=> (let [i 2] (m i))
CompilerException java.lang.RuntimeException: Unable to resolve symbol: v-i in this context, compiling:(NO_SOURCE_PATH:73:12)
我可以写一个宏让两者
(m 2)
和
(let [i 2] (m i))
得到“这是 v2”?
解决方案
这在没有宏的情况下是可能的:
(defn m [v] (var-get (resolve (symbol (str "v-" v)))))
(m 1) ;; => "This is v1"
(let [i 2] (m i)) ;; => "This is v2"
如果需要,您也可以使用宏:
(defmacro m [v] `@(resolve (symbol (str "v-" ~v))))
推荐阅读
- android - 查看菜单文件的绑定?
- sqlite - 如何在颤动中保存共享首选项中的复选框状态?
- rest - 具有相同的路由要求而不是身份验证?
- amazon-web-services - 仅使用 API Gateway 从 S3 访问 AWS Lambda
- xml - VB.NET、XML、写入和保存,带有内部文本和属性
- token - 如何获取新的刷新令牌 - Identity Server 4
- pycharm - 有没有办法在 PyCharm 中编写代码时自动格式化代码?
- c# - Find list of events on calendar occurring within One Day using Linq
- python - 什么是错误?时间数据与格式 '%m/%d/%y %I:%M:%S %p' 不匹配
- python - python - 如何在python中的matplotlib图中悬停时从给定列表中显示元素的索引号?