Поскольку вы не используете ветку "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))
, который совпадает сваша версия, но более явная.
В любом случае, все они функционально эквивалентны.Я бы лучше подумал о том, как эти функции будут использоваться.Если вы сделаете это следующим образом, вам придется выполнять нулевые проверки каждый раз, когда вы вызываете эти функции, что утомительно.
Было бы лучше использовать условия, либо через объявления типов, либо через утверждения, либо через явныеwhen
… signal
формы.Затем вы можете определить обработчики и перезапустить для этих условий для всех частей вашей программы.Дальнейшее чтение: Практический Common Lisp, гл.19 .
В этом случае я бы вообще здесь не занимался:
(defun safe-div (a b)
(/ a b))
(точнее, просто используйте /
).
Если /
получит неверные аргументы, это будет сигнализировать об ошибке, которую вы можете затем обработать снаружи, где вы знаете, что это может означать.