Я пытаюсь изучить Common Lisp с помощью книги Common Lisp: мягкое введение в символьные вычисления. Кроме того, я использую SBCL, Emacs и Slime.
К концу главы 10 автор обсуждает полезную функцию прерывания. Чтобы обеспечить фоновый контекст, он представляет эту проблемную функцию:
(defun analyze-profit (price commission-rate)
(let* ((commission (* price commission-rate))
(result
(cond ((> commission 100) 'rich)
((< commission 100) 'poor))))
(format t "~&I predict you will be: ~S"
result)
result))
Функция работает так, как ожидалось, при вызове в REPL с такими аргументами, как:
> (analyze-profit 1600 0.15)
I predict you will be: RICH
RICH
> (analyze-profit 3100 0.02)
I predict you will be: POOR
POOR
Однако он показывает неправильный результат, когда commission
равно ровно 100:
> (analyze-profit 2000 0.05)
I predict you will be: NIL
NIL
Для отладки автор вставляет в определение функцию break
:
(defun analyze-profit-debugging (price commission-rate)
(let* ((commission (* price commission-rate))
(result
(cond ((> commission 100) 'rich)
((< commission 100) 'poor))))
(break "Value of RESULT is ~S" result)
(format t "~&I predict you will be: ~S"
result)
result))
Затем он исследует стек управления, проверяя значения локальных переменных:
Я знаю, что отладчики, как известно, зависят от реализации.
В моей среде (emacs, slime, sbcl) мне удалось воспроизвести что-то подобное, следуя этому отличное руководство, написанное @Vindarel.
После помещения точки (курсора) в стек 0:
и нажатия e
:
Backtrace:
0: (ANALYZE-PROFIT-DEBUGGING 2000 0.05)
1: (SB-INT:SIMPLE-EVAL-IN-LEXENV (ANALYZE-PROFIT-DEBUGGING 2000 0.05) #<NULL-LEXENV>)
2: (EVAL (ANALYZE-PROFIT-DEBUGGING 2000 0.05))
Я могу оценить выражение в кадре стека. Таким образом, я получаю следующие сообщения в мини-буфере:
Eval in frame (COMMON-LISP-USER)> price
=> 2000 (11 bits, #x7D0, #o3720, #b11111010000)
А также:
Eval in frame (COMMON-LISP-USER)> commission-rate
=> 0.05
К сожалению, я не могу получить доступ к основной проблеме - local variable
с именем commission
:
Eval in frame (COMMON-LISP-USER)> commission
Я ожидал:
100.0
Но я получаю сообщение об ошибке:
Переменная COMMISSION не привязана. [Условие типа UNBOUND-VARIABLE]
Я дважды проверяю правописание. Кроме того, я также пытался использовать p
вместо e
и перемещать курсор. Однако ничего не получилось.
Как я могу проверить значение проблемной переменной commission
?