如何在Clojure编译器中调试我的函数的参数应用程序?

时间:2016-01-26 10:30:13

标签: java debugging intellij-idea clojure compiler-construction

我的目的是调试Clojure编译器以了解更多信息。 (我的项目代码有助于实现这一目的。)

我在IntelliJ IDE中设置了Clojure Compiler source和我的项目Error occurred running Grails CLI: Task 'dbmGenerateChangelog' not found in root project enter image description here

我已将test项目作为主要项目,而clojure项目位于类路径中。 enter image description here

我通过运行test项目中的clojure.main类来调试调试器中的Clojure REPL。 enter image description here

我的clojure项目在test test.core文件中包含以下来源:

core.clj

我设置了以下断点:

enter image description here

现在我正在做的是在我打开断点后将以下函数调用粘贴到REPL中:

(ns test.core
  (:gen-class))

(deftype SquarePeg [width length])

(deftype RoundHole [radius])

(def square-peg (SquarePeg. 5 50))

(defn insert-peg [^test.core.RoundHole peg]
    (println "insert-peg inserted with: " peg))

(defn -main
  "Insert a square peg in a round hole"
  [& args]
    (insert-peg square-peg)
  (println "Done."))

enter image description here

现在我看到上面代码中的(insert-peg square-peg) (如println)贯穿pr单个arg调用,但对AFn.java的调用没有。 (这是我想要调试的)。

enter image description here

(断点开启后第一个断点跳闸)。

enter image description here

我确实看到insert-peginsert-peg的声明贯穿square-peg中的emit代码 - 但我正在寻找的是函数应用< / em>的。我希望Compiler.java应用于在调试器中的编译器代码中运行的square-peg。 (也许我错过了一个断点,或者找错了地方)。

假设:

  • 我没有打开断点,直到加载REPL之后,我已将代码粘贴到IDE控制台中运行的REPL中。

我的问题是:如何在Clojure编译器中调试我的函数的参数应用程序?

1 个答案:

答案 0 :(得分:0)

诀窍是InvokeExpr(...)中的Compiler.java函数。

特别是VarExpr部分。