Лисп интроспекция? когда функция вызывается и когда она выходит

StackOverflow https://stackoverflow.com/questions/231649

  •  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

Система также включает в себя профилировщик:

http://www.sbcl.org/manual/Deterministic-Profiler.html

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top