Emacs+SLIME环境下Common Lisp CASE编译notes含义咨询
关于SBCL编译提示中「deleting unreachable code」笔记的含义
环境配置
emacs 29.1 sbcl 2.4.0 slime 2.29.1
定义的函数
(defun my-case () (case 'a (b "hello") (a "world") (otherwise "mars")))
编译输出与执行结果
使用C-c C-k编译函数时,SLIME REPL输出以下内容:
; processing (DEFUN MY-CASE ...) ; file: /var/tmp/slimeckqotJ ; in: DEFUN MY-CASE ; (CASE 'A (B "hello") (A "world") (OTHERWISE "mars")) ; --> COND IF PROGN ; ==> ; "hello" ; ; note: deleting unreachable code ; --> COND IF IF THE PROGN ; ==> ; "mars" ; ; note: deleting unreachable code ; ; compilation unit finished ; printed 2 notes
函数执行正常,返回预期结果:
CL-USER> (my-case) "world"
编译笔记的含义
这些note是SBCL编译器给出的优化提示:它检测到存在永远不会被执行到的代码,于是直接将这些冗余代码从最终生成的可执行代码中删除,不会影响程序的运行逻辑。
具体到你的函数:
- 第一条笔记指向的
"hello":case的测试对象是固定的'a,第一个分支匹配的是b,这个条件永远无法满足,所以"hello"这段代码永远不会被执行,属于不可达代码,被编译器删除。 - 第二条笔记指向的
"mars":当测试对象'a匹配到第二个分支(a "world")后,case结构会直接返回结果,后续的otherwise分支永远不会被触发,因此"mars"也是不可达代码,同样被编译器删除。
源码中的case被下划线标记,是SLIME结合SBCL的编译提示,高亮提醒你此处存在冗余代码,方便你优化,但不会影响函数的正常执行——你的函数返回"world"完全符合逻辑预期。
内容的提问来源于stack exchange,提问作者7stud
相关产品推荐
相关产品推荐

