Как отладить применение аргументов к моей функции в Clojure Compiler?
Моя цель - отладить компилятор Clojure, чтобы лучше понять его. (Код моего проекта помогает в этом.)
У меня есть и источник Clojure Compiler, и мой проект test
установить в моей IntelliJ IDE.
У меня есть clojure
проект в качестве основного проекта, а test
Проект находится на пути к классам.
Я запускаю Clojure REPL в отладчике, запустив clojure.main
класс в clojure
проект.
мой test
Проект имеет следующий источник в test.core
core.clj
файл:
(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."))
Я установил следующие точки останова:
Compiler.java
L4709 (Обработка переменных при выдаче значений)AFn.java
L154 ( вызов функции с одним аргументом)
Теперь я вставляю следующий вызов функции в REPL после того, как я включил точки останова:
(insert-peg square-peg)
Теперь я вижу, что println
(как pr
) в приведенном выше коде проходит через AFn.java
одиночный вызов arg, но вызов insert-peg
не. (Это то, что я хочу отлаживать).
(Первая точка останова срабатывает после включения точек останова).
Я вижу декларации insert-peg
а также square-peg
пробегая код выброса в Compiler.java
- но я ищу функцию приложения. Я хочу увидеть square-peg
применяться к insert-peg
работает в коде компилятора в отладчике. (Возможно, мне не хватает точки останова, или я смотрю не в том месте).
Предположения:
- Я не включаю точки останова, пока не загрузится REPL, и я вставил код в REPL, запущенный в консоли IDE.
Мой вопрос: как мне отладить применение аргументов к моей функции в Clojure Compiler?
1 ответ
Уловка была в функции InvokeExpr(...)
в Compiler.java
,
В частности VarExpr
раздел.