为什么在逻辑上否定未使用的可选参数会抛出错误?

Why does logically negating an unused optional argument throw an error?

提问人:J. Mini 提问时间:9/28/2023 更新时间:9/28/2023 访问量:30

问:

我正在尝试解决本教程的练习 5.5

编写一个带有可选参数的交互式函数,该函数测试其参数(数字)是否大于或等于或小于 的值,并在消息中告诉您哪个。但是,如果不将参数传递给函数,请使用 56 作为默认值。fill-column

为此,我写了这篇文章。

(defun foo (&optional x)
  (interactive "P")
  (if (not x) (setq x 59))
  (message (cond ((>= x fill-column) "bigger or equal")
    ((< x fill-column) "smaller"))))

当没有传递参数 () 时,它会抛出错误C-u M-x foo

错误的类型参数:number-or-marker-p。(4).

我从实验、推理和调试器中收集到的信息是,此函数在其第三行失败。显然,一个可选但未使用的参数并不一致。我已经检查了文档,但没有帮助。这给了我一个问题:为什么否定一个未使用的参数会抛出错误?notnot

我还没有完全掌握 Emacs 中的调试器,所以很抱歉我自己无法解决这个问题。我是 Emacs 和 Emacs Lisp 的初学者。我不是一个新的程序员,甚至不是一个新的Lisper。我已经知道方案了。随意教我如何钓鱼。

ELISP 可选参数 否定

评论

0赞 phils 9/28/2023
(4)不是,所以返回,因此形式计算形式(作为其“else”子句),该子句很快计算它需要是一个数字。nil(not x)nilifmessage(>= x fill-column)x
0赞 phils 9/29/2023
还要注意的是,“当不传递参数时(C-u M-x foo)”是一个矛盾的,因为使用确实传递了一个参数(你已经明确使用了导致这种情况的规范)。C-uinteractive

答:

1赞 J. Mini 9/28/2023 #1

(4)指的是导致错误的原因。这是包含四个的列表。回想一下本教程所说的内容。C-u

如果不键入数字,则默认为带有 4 的 cons 单元格C-u

想必,的错误就是指这个。not

评论

0赞 phils 9/28/2023
事实上,错误将是由于需要一个数字参数。使用列表参数没有问题,因为只关心参数是否为 .(>= x fill-column)notnotnil
0赞 phils 9/28/2023
有关前缀参数的更多信息,请参阅,并结合此,仔细注意 和 之间的区别C-h i g (elisp)Prefix Command ArgumentsC-h f interactive(interactive "P")(interactive "p")
0赞 J. Mini 9/29/2023
@phils啊。显然,我需要学习更多关于在 Emacs 中调试的信息。