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
,我在迷你缓冲区中看到以下内容:
在史莱姆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
并且,在我的源文件中,“case”一词带有下划线:
但是,我的函数运行良好:
CL-USER> (my-case)
"world"
什么是“笔记”?
注释告诉您子句
(b "hello")
和 (otherwise "mars")
无法访问。
评估
case
形式的第一个参数以生成用于测试子句的密钥。在 my-case
中,keyform 参数始终计算为符号 a
,因此编译器可以看到只有一种可能的结果。
当只有一种可能的结果时,case
表格没有多大用处。这是一个不会触发编译器注释和删除无法访问的代码的版本:
(defun my-case (&optional (k 'a))
(case k
(b "hello")
(a "world")
(otherwise "mars")))
CL-USER> (my-case)
"world"
CL-USER> (my-case 'b)
"hello"
CL-USER> (my-case 'guitars)
"mars"