Макрос STEP не работает в Clozure CL - PullRequest
4 голосов
/ 23 февраля 2012

Я хочу использовать пошаговую функцию, чтобы увидеть, как она достигла ожидаемого результата, но она не работает.

Как в этом простом примере:

(STEP (IF (ODDP 3) 'YES 'NO))

но ничего не происходит.

Есть какая-то оптимизация, которая заставляет меня не видеть шаги трассировки ???

Как его отключить?

Спасибо!

Ответы [ 4 ]

3 голосов
/ 03 ноября 2012

STEP не поддерживается в CCL.

Решение для TRACE:

Когда функция FOO (с глобальным именем) определена с помощью DEFUN, компилятору разрешается предполагать, что функциональные ссылки на это имя функции ссылаются на определяемую функцию (если они не являются лексически затененными); поэтому он может пропустить неявный SYMBOL-FUNCTION («вызов всего, что находится в функциональной ячейке FOO») при самостоятельном вызове (вызов FOO из FOO.) Это сохраняет одну или две инструкции для этих вызовов, но (так как TRACE работает, изменяя то, что возвращает SYMBOL-FUNCTION) эти встроенные собственные вызовы не могут быть отслежены.

Однако компилятор не может этого сделать (даже не может предположить, что что-то, определенное DEFUN, не будет переопределено позже), если имя функции объявлено NOTINLINE в точке вызова self:

пример:

? (defun fact (x acc)
    (declare (notinline fact))
    (if (= x 0)
        acc
        (fact (- x 1) (* x acc))))

? (trace fact)
NIL

? (fact 3 1)
0> Calling (FACT 3 1) 
 1> Calling (FACT 2 3) 
  2> Calling (FACT 1 6) 
   3> Calling (FACT 0 6) 
   <3 FACT returned 6
  <2 FACT returned 6
 <1 FACT returned 6
<0 FACT returned 6

? (step (fact 3 1))
0> Calling (FACT 3 1) 
 1> Calling (FACT 2 3) 
  2> Calling (FACT 1 6) 
   3> Calling (FACT 0 6) 
   <3 FACT returned 6
  <2 FACT returned 6
 <1 FACT returned 6
<0 FACT returned 6

Это способ сказать компилятору: «В соответствии с политикой, я бы предпочел иметь возможность отслеживать функции, которые вызывают сами себя и определяются с помощью DEFUN, и не заботятся о сохранении нескольких циклов на себя. вызова».

от: DebugWithOpenMCL

или оцените следующую форму:

(DECLAIM (OPTIMIZE (DEBUG 3)))

перед определением любой функции для отслеживания.

3 голосов
/ 08 октября 2013

Именно потому, что CL: STEP не реализован в CCL, я реализовал com.informatimago.common-lisp.lisp.stepper.Вы можете получить его с помощью QuickLisp.Документация находится по адресу: https://gitorious.org/com-informatimago/com-informatimago/source/2b53ae44e8fa4d040fafcf4d93976500a8e464dc:common-lisp/lisp/stepper-packages.lisp#L146

3 голосов
/ 23 февраля 2012

Я не думаю, что Clozure CL поддерживает степпинг. IIRC еще никто не финансировал эту функцию. Это потребует некоторой работы, так как в Clozure CL отсутствует переводчик (где степпинг может поддерживаться относительно безболезненно).

Другие реализации поддерживают степпинг.

0 голосов
/ 20 октября 2013

используйте cl-stepper: step вместо cl-user: step, потому что Clozure CL не поддерживает его.если вы уже установили QuickLisp, попробуйте установить его: вот так.

(ql:quickload "com.informatimago.common-lisp.lisp.stepper")

(defpackage :test (:use :cl-stepper))
(in-package :test)

(def bar (hoge)
;; define some function
)

(step (bar 3))
...