Лисп интроспекция? когда функция вызывается и когда она выходит
-
04-07-2019 - |
Вопрос
С общим списком, и я предполагаю свойства самоанализа. Как я могу добавить код в общий код lisp, который сообщит мне, когда вызывается функция и когда она завершается. Я хочу взять любой код LISP и это конкретное изменение кода. Я полагаю, что с помощью анализа АСТ Лиспа это должно быть возможно.
Решение
Вы можете использовать (функция трассировки)
Для простого механизма. Для чего-то более интересного, вот хорошее обсуждение от comp.lang.lisp . р>
[CL_USER]>
(defun fac (n)
"Naïve factorial implementation"
(if (< 1 n)
(* n (fac (- n 1)))
1))
FAC
[CL_USER]> (trace fac)
;; Tracing function FAC.
(FAC)
[CL_USER]> (fac 5)
1. Trace: (FAC '5)
2. Trace: (FAC '4)
3. Trace: (FAC '3)
4. Trace: (FAC '2)
5. Trace: (FAC '1)
5. Trace: FAC ==> 1
4. Trace: FAC ==> 2
3. Trace: FAC ==> 6
2. Trace: FAC ==> 24
1. Trace: FAC ==> 120
120
[CL_USER]>
Другие советы
Если CLOS является параметром, он имеет до, после и вокруг методов , которые выполняются до, после и вокруг других методов.
Common lisp имеет функцию TRACE, которая сообщает функцию, аргументы и результирующее значение каждого указанного вызова. Вот страница документации для версии Steel Bank, но вы должны найти что-то похожее в большинстве реализаций:
http://www.sbcl.org/manual/Function-Tracing.html р>
Система также включает в себя профилировщик: