Макрос STEP не работает в Clozure CL

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

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

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

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

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

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

Спасибо!


person Juanito Fatas    schedule 23.02.2012    source источник
comment
Технически допустимо, чтобы соответствующая реализация не предпринимала никаких действий, кроме нормального выполнения формы. В такой ситуации (шаговая форма) эквивалентна, например, (пусть () форма). В реализациях, где это имеет место, соответствующая документация должна упоминать этот факт. (CLHS) Я понятия не имею, прибегает ли Clozure к это решение...   -  person Dirk    schedule 23.02.2012
comment
вот соответствующий вопрос относительно SBCL: stackoverflow.com/questions/8617064/   -  person Vsevolod Dyomkin    schedule 23.02.2012


Ответы (5)


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

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

person Rainer Joswig    schedule 23.02.2012
comment
Беглый взгляд на источник подтверждает это. Из ccl:lib;macros.lisp: (defmacro step … (form) form). - person danlei; 24.02.2012

Именно потому, что 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

person informatimago    schedule 08.10.2013
comment
Теперь он находится на framagit: framagit.org/com-informatimago/com-informatimago ( со списком проблем) также есть зеркало в gitlab: informatimago и еще один на github: github.com/informatimago/lisp - person informatimago; 20.10.2020

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

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

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

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

пример:

? (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)))

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

person Juanito Fatas    schedule 03.11.2012

Эта библиотека больше не распространяется на quicklisp, однако она успешно собирается при установке в качестве локального проекта quicklisp.

person lucaregini    schedule 26.12.2019

используйте 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))
person user2129103    schedule 20.10.2013