小编Edg*_*gar的帖子

是否有可能从Clojure重新定义Java方法?

使用multimethods,我们可以向现有的Java类添加方法.我的问题是,是否有可能重新定义一种特定方法,以及如何从Clojure代码中重新定义.例如,如果您有以下课程,

public class Shape {
    public void draw() {
        ...
    }
}
Run Code Online (Sandbox Code Playgroud)

我希望能够运行一些东西来添加一个before方法,比如:

(attach-to-method Shape/draw :before
    (println "... about to draw a shape"))
Run Code Online (Sandbox Code Playgroud)

在评估该表单后,所有后续的绘制调用将在执行调用之前开始打印字符串.

我之前/之后/周围,类似AOP的行为的附件的目的是,可以动态地更改在现有实例上调用该方法的框架并开始运行新附加的代码.目前我正在使用AspectJ,但我已经到了使用不同的编译器不是一个选项,我很想知道我是否可以放弃AspectJ.

aop clojure

8
推荐指数
1
解决办法
1097
查看次数

如何将clojure源文件连接到Emacs上正在运行的clojure repl?

我目前正在为Tomcat容器中的现有J2EE webapp添加功能,我正在使用Clojure编写我的添加内容.我的设置很简单:我只是添加对clojure生成的静态方法的调用,并编写来自clojure方面的所有艰苦工作.构建过程包括编译clojure代码(lein uberjar),然后在类路径上使用该jar编译java代码.

在webapp init中,我调用了一个生成的类,该类使用a激活swank服务器(swank/start-repl).我希望能够将我的Aquamacs的粘液连接到该服务器,并从那里以交互方式工作(直到某一点,我不会尝试任何需要java端重新编译的东西).但我有一种我不太明白的情况.如果我这样做\M-x slime-connect,我会得到一个REPL提示符(在收到通知后没有低级的lisp进程,我认为没关系,因为劣质的lisp进程在emacs控制之外运行).我可以完美地评估表格,我甚至可以检查类似的东西my.own.namespace/my-var.但是,如果我访问一个已经编译过的clojure代码的文件,我似乎无法让slime认出它作为它的来源.考虑一个简单的clojure文件:

(ns my.namespace
  (:gen-class
   :name my.namespace
   :methods [#^{:static true} [testFunc [] void]]))

(def *secret* "shhhh")

(defn -testFunc []
  (println (str "our secret is: " secret)))
Run Code Online (Sandbox Code Playgroud)

假设这是编译并包含在webapp加载的uberjar中,我可以进行评估/检查my.namespace/*secret*.但是如果我尝试在代码缓冲区内进行评估,那么Slime认为我在user命名空间中(甚至可以理解!).但现在我只剩下一个工作选项了 - 我必须逐一评估文件中的所有表格!\C-c \C-l(加载源文件)将不会做任何事情 - 显然只返回nil并输出其他内容.编译所有内容似乎就是这样 - 它编译,如果找到它们会显示错误,但不会更改我的命名空间.而最奇怪的是\C-~(同步包和目录),它使用Common Lisp它正是我想要的,但在这里它冻结了clojure REPL.

总是可以选择切换到REPL,打字(in-ns 'my.namespace),然后一切正常.但是当clojure文件数量增加时,这根本不够实用(因为代码缓冲区的命名空间不会自动更改!)

我的问题是,我是否缺乏基本的命令/配置 - 或者是否有明显的原因导致这种行为发生.

emacs aquamacs clojure slime

5
推荐指数
2
解决办法
1420
查看次数

标签 统计

clojure ×2

aop ×1

aquamacs ×1

emacs ×1

slime ×1