Лисп интроспекция? когда функция вызывается и когда она выходит - PullRequest
3 голосов
/ 24 октября 2008

С обычным лиспом, и я предполагаю, что свойства самоанализа. Как я могу добавить код в общий код lisp, который сообщит мне, когда вызывается функция и когда она завершается. Я хочу взять любой код LISP и это конкретное изменение кода. Я полагаю, что с помощью анализа АСТ Лиспа это должно быть возможно.

Ответы [ 3 ]

6 голосов
/ 24 октября 2008

Вы можете использовать (trace function) для простого механизма. Для чего-то более интересного, вот хорошее обсуждение от 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]> 
3 голосов
/ 28 октября 2008

Если CLOS является опцией, он имеет до, после и вокруг методов , которые выполняются до, после и вокруг других методов.

2 голосов
/ 24 октября 2008

Common lisp имеет функцию TRACE, которая сообщает функцию, аргументы и результирующее значение каждого указанного вызова. Вот страница документации для версии Steel Bank, но вы должны найти что-то похожее в большинстве реализаций:

http://www.sbcl.org/manual/Function-Tracing.html

В систему также включен профилировщик:

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

...