为什么`dir`传入`(ns-name *ns*)`获取的当前命名空间时无法运行
问题原因分析
- 核心原因是
dir是Clojure的宏,不会对传入的参数进行求值,而是直接接收参数的字面形式处理 - 你写的
(dir (ns-name *ns*))传入给dir的字面参数是(ns-name *ns*),这是一个PersistentList类型的列表结构,不是符号 dir的内部实现会自动给传入的参数加引用(quote),最终调用底层的dir-fn时传入的是未经求值的列表'(ns-name *ns*),而dir-fn要求输入是命名空间对应的Symbol类型,因此触发类转换异常
正确用法
- 直接传入命名空间的字面符号即可正常使用:
(dir user) - 如果需要动态获取当前命名空间调用,直接使用
dir的底层函数dir-fn即可,普通函数会对参数正常求值:(clojure.repl/dir-fn (ns-name *ns*))
内容的提问来源于stack exchange,提问作者Anthony
相关产品推荐
相关产品推荐

