gpt4 book ai didi

lisp - 在 Lisp 中编程的正确方法?

转载 作者:太空宇宙 更新时间:2023-11-03 18:39:25 25 4
gpt4 key购买 nike

我是 Common Lisp 的新手,发现自己利用了函数返回值的方式。以下是两个简单的例子:

(defun safe-avg (a b)
(and (numberp a) (numberp b) (/ (+ a b) 2)))

(defun safe-div (a b)
(and (numberp a) (numberp b) (> b 0) (/ a b)))

但我可以这样写(可以说更清晰):

(defun safe-avg (a b)
(if (and (numberp a) (numberp b))
(/ (+ a b) 2)))

(defun safe-div (a b)
(if (and (numberp a) (numberp b) (> b 0))
(/ a b)))

在我开始滥用这个习惯之前,我想知道做这样的事情的首选方法是什么以及背后的原因。

最佳答案

因为你不使用“else”分支,你可以使用when:

(defun safe-div (a b)
(when (and (numberp a) (numberp b) (> b 0))
(/ a b)))

这与:

(defun safe-div (a b)
(if (and (numberp a) (numberp b) (> b 0))
(/ a b)
nil))

这与您的版本相同,但更明确。

无论如何,这些在功能上都是等价的。我宁愿考虑如何使用这些功能。如果这样做,每次调用这些函数时都必须进行空值检查,这很乏味。

最好通过类型声明、断言或显式whensignal 形式来使用条件。然后,您可以为程序的整个部分为这些条件定义处理程序和重新启动。进一步阅读:Practical Common Lisp, ch. 19 .

在这种情况下,我根本不会在这里处理:

(defun safe-div (a b)
(/ a b))

(或者更确切地说,只使用 /)。

如果 / 得到错误的参数,它会发出错误信号,然后您可以在外部处理该错误,您知道这可能意味着什么。

关于lisp - 在 Lisp 中编程的正确方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7537805/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com