Как отладить применение аргументов к моей функции в Clojure Compiler?

Моя цель - отладить компилятор Clojure, чтобы лучше понять его. (Код моего проекта помогает в этом.)

У меня есть и источник Clojure Compiler, и мой проект test установить в моей IntelliJ IDE. введите описание изображения здесь

У меня есть clojure проект в качестве основного проекта, а test Проект находится на пути к классам. введите описание изображения здесь

Я запускаю Clojure REPL в отладчике, запустив clojure.main класс в clojure проект. введите описание изображения здесь

мой test Проект имеет следующий источник в test.corecore.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 раздел.

Другие вопросы по тегам