以编程方式重新定义功能

用户名

我目前正在开始制作一个工具,该工具应该修改另一个名称空间中的所有功能,并在该(其他)名称空间中运行“ main”功能。几乎就像在单元测试中嘲笑一样,只是出于另一个目的。第一步是从另一个名称空间重新定义函数。第一个清单显示了有效的代码,在此我明确命名了要替换的函数。

(ns one)
(defn a-fun []
  (println "original"))

(defn caller []
  (a-fun))

(ns two)

(with-redefs [one/a-fun #(println "replaced")]
  (one/caller))
;; replaced
;; nil

下一步是从另一个名称空间以编程方式获取函数。这是我碰壁的地方。我已经做了很多尝试ns-publics,但是到目前为止还没有运气。因此,我尝试将问题分解。问题是该功能的替换不起作用。输出应打印“已替换”而非“原始”。

(ns two)
(def target (ns-resolve 'one (symbol "a-fun")))
(def caller (ns-resolve 'one (symbol "caller")))
(with-redefs [target #(println "replaced")]
  (caller))
;; original
;; nil

现在,#'two/target展示了#'one/a-fun我在repl中对其进行评估的过程。我可以one/a-fun通过输入((ns-resolve 'one (symbol "a-fun")))repl来打电话,所以我不知道哪个部分不起作用。

今天,我已经阅读了许多文档,但实际上并没有什么距离。

Trigoman

您可以这样尝试使用with-redefs-fn

(defn p [] "old")

(with-redefs-fn
  {(ns-resolve *ns* 'p) #(println "new")}
  (fn []
    (p)))
;; => new

这确实意味着的主体with-redefs-fn必须是使用您重新定义的Vars的函数。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

如何以编程方式重新定义变量的类?

来自分类Dev

Lisp重新定义功能

来自分类Dev

重新定义现有功能

来自分类Dev

如何全局重新定义LUA功能

来自分类Dev

如何自行更改/重新定义功能

来自分类Dev

重新定义现有功能

来自分类Dev

如何全局重新定义LUA功能

来自分类Dev

以编程方式调整大小/重新定位所需的窗口

来自分类Dev

重新定义功能中无法使用的打印功能

来自分类Dev

重新定义汇编程序中的错误asm

来自分类Dev

Eiffel:创建可重新定义的“常量”的最佳方式

来自分类Dev

重新定义和覆盖功能之间的区别

来自分类Dev

Superagent“请求”对象是否被重新定义为功能?

来自分类Dev

firefox sdk:重新定义内容脚本功能

来自分类Dev

如何重新定义Powershell模块导出的功能

来自分类Dev

firefox sdk:重新定义内容脚本功能

来自分类Dev

重新定义承诺

来自分类Dev

重新定义矩阵的%in%

来自分类Dev

Python:为什么重新定义函数不是错误?有没有一种骇人听闻的方式来拥有该功能?

来自分类Dev

在类模板中定义的朋友功能。功能模板重新定义错误

来自分类Dev

错误:重新定义班级

来自分类Dev

jshint错误:“ $”的重新定义

来自分类Dev

错误:工会的重新定义

来自分类Dev

错误:工会的重新定义

来自分类Dev

重新定义模块“领域”

来自分类Dev

重新定义Django的家

来自分类Dev

重新定义“ i”错误

来自分类Dev

Requirejs模块重新定义

来自分类Dev

用or逻辑重新定义