- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在尝试通过《Common Lisp:符号计算的温和介绍》一书来学习 Common Lisp。此外,我正在使用 SBCL、Emacs 和 Slime。
在第 10 章结束时,作者讨论了有用的 break 函数。为了提供背景上下文,他提出了这个有问题的函数:
(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))
然后他检查了
控制栈在检查局部变量的值时:
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
但我收到一条错误消息:
The variable COMMISSION is unbound. [Condition of typeUNBOUND-VARIABLE]
p
而不是
e
并移动光标。然而,没有任何效果。
commission
的值?
最佳答案
如果您导航到调试器中的顶部框架并在该框架上按 Enter,您将看到 commission
调试器不知道作为局部变量:
Value of RESULT is NIL
[Condition of type SIMPLE-CONDITION]
Restarts:
0: [CONTINUE] Return from BREAK.
1: [RETRY] Retry SLIME REPL evaluation request.
2: [*ABORT] Return to SLIME's top level.
3: [ABORT] abort thread (#<THREAD "new-repl-thread" RUNNING {1002D65C93}>)
Backtrace:
0: (ANALYZE-PROFIT-DEBUGGING 2000 0.05)
Locals:
COMMISSION-RATE = 0.05
PRICE = 2000
RESULT = NIL
1: (SB-INT:SIMPLE-EVAL-IN-LEXENV (ANALYZE-PROFIT-DEBUGGING 2000 0.05) #<NULL-LEXENV>)
2: (EVAL (ANALYZE-PROFIT-DEBUGGING 2000 0.05))
--more--
这里的问题是编译器优化掉了一些调试信息。您可以使用
declaim
告诉编译器包含更多调试信息。在文件的开头,或
declare
在函数定义中:
(defun analyze-profit-debugging (price commission-rate)
(declare (optimize (debug 3)))
(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))
给
debug
的号码可以是 0、1、2 或 3;更大的数字意味着应该更加重视保留调试信息。
commission
直接地:
Backtrace:
0: (ANALYZE-PROFIT-DEBUGGING 2000 0.05)
Locals:
COMMISSION = 100.0
COMMISSION-RATE = 0.05
PRICE = 2000
RESULT = NIL
1: (SB-INT:SIMPLE-EVAL-IN-LEXENV (ANALYZE-PROFIT-DEBUGGING 2000 0.05) #<NULL-LEXENV>)
2: (EVAL (ANALYZE-PROFIT-DEBUGGING 2000 0.05))
--more--
并且,使用
e
顶部堆栈框架上的命令现在按您最初的预期工作:
Eval in frame (COMMON-LISP-USER)> commission
=> 100.0
关于debugging - 为什么 Slime 的调试器不评估所选帧中的这个特定表达式?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/67861723/
我宁愿不必手动为每一行添加分号。 规范: Aquamacs 2.1 (Emacs 23.2) 史莱姆 2010-11-16 MacPorts CLISP 2.49 Mac OS X 10.6.4 Ma
我正在尝试使用 asdf 创建一个名为“a”(学习)的基本包,我已经在 package.lisp 中定义了该包,我的主文件 a.lisp 开头为: (in-package :a) ... 如果我正在开
我有 sbcl 在 emacs 24.1 中工作的 slime,但无法打开 slime repl。 我可以使用 M-x slime 连接到 inferior-lisp 缓冲区中的 sbcl,但我无法调
我在短时间内使用 emacs 和 lisp(使用 slime)...这个工作正常,但是今天当我运行它时出现以下消息: eval-buffer:Symbol 的函数定义为 void:define-sli
我为 clojure 和普通 lisp 设置了 emacs,但我还想要 (slime-setup '(slime-fancy)) 用于普通 lisp。如果我将该行添加到 init.el,clojure
我目前处于模式:C-x 2 通常,我不太关心垂直拆分。但是,我在 13"显示器上进行编码,这使得垂直空间相当宝贵。 我想要一些设置,当我执行 C-x 2 时,我的窗口不是拆分为 50/50,而是拆分为
我开始使用 CLisp,因此也开始使用 Emacs,包括“SLIME”插件(或其他名称。它是怎么称呼的?) 所以我使用 REPL 已经有一段时间了,并用 (defun) 在其中定义了很多函数。 不幸的
我正在使用 SLIME 学习 Common Lisp。有没有一种方法可以自动完成括号,这样当我输入一个开括号时,就会自动添加一个闭括号?我更喜欢 vim,所以在 mv ~/.vimrc 中我有: in
有没有人有在 Common Lisp 的控制台上使用 SLIME 的经验?我正在尝试学习 Practical Common Lisp,但书中的命令似乎不适用于 emacs/SLIME 的控制台版本。我
好的,我一定遗漏了一些明显的东西。从昨天开始我就被困住了,无法启动 Emacs-live + slime。 我正在使用 EMACS 24.3.1,安装了 Emacs-live,它运行良好(如果我在没有
我正在尝试使用 CVS (2009-01-05) 中的 Slime,但不断收到此错误: LOAD: A file with name /usr/share/common-lis
尽管我在任何地方都设置了 UTF-8(在我的 lein 项目、slime-lisp 组自定义、Emacs 缓冲区本身...),但在尝试运行诸如 (def beta "β") 之类的代码时,我一直收到此
我正在尝试通过《Common Lisp:符号计算的温和介绍》一书来学习 Common Lisp。此外,我正在使用 SBCL、Emacs 和 Slime。 在第 10 章结束时,作者讨论了有用的 bre
我正在尝试在 Emacs 中使用 SLIME。 在 SLIME REPL 中,输入 ,(逗号)会导致错误 Comma not inside a backquote. 输入 quit 而不是 The v
在 Emacs 中使用 Slime repl 进行开发时,我无法重新加载多方法。 重新定义 defmethod 表单可以正常工作,但如果我更改调度功能,我似乎无法重新加载 defmulti 表单。我想
我正在寻找一种更好的技术来做到这一点。我的普遍问题是调试器进入太晚或太早而无法捕获变量的值。 我首先尝试的是: (loop for i from 0 to 10 do (break)) 当调试器进
我正在尝试为 *.lisp 文件添加自动完成功能。我的粘液设置是: (add-to-list 'load-path "~/.emacs.d/plugins/slime/") (setq slime-l
所以我最近一直在努力学习Lisp。不幸的是,似乎没有任何效果 - 我正在关注 this Common Lisp tutorial但是当我第二次尝试运行 (hello-world) 时,它没有做同样的事
我已经安装了 Emacs + SBCL + slime,但我遇到了 slime 的问题。我在 Mac OS X 10.7.4 上 当我使用 M-x slime 时,我在顶部有两个屏幕 scratch,
我认为这曾经在 Emacs 23 中开箱即用,但在 24 中则不然。 那么,假设我已经加载了 Quicklisp 的 Alexandria 包。例如,如果我在 REPL 中运行 (apropos "c
我是一名优秀的程序员,十分优秀!