gpt4 book ai didi

Lisp - if 语句各种 Action

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

这是我的 lisp 代码。

 (DEFUN F (A B)
(SETF C (* 4 A))
(SETF D (* 2 (EXPT B 3)))
(SETF RES (+ C D))
(IF (AND (TYPEP A 'INTEGER) (TYPEP B 'INTEGER))
(list 'Final 'value '= res)
'(YOUR INPUTS ARE NOT NUMBERS)))

例如,(f 5 9) 效果很好。但是 (f 'w 'q) 不适用于以下错误消息:

(ERROR TYPE-ERROR DATUM W EXPECTED-TYPE NUMBER FORMAT-CONTROL ~@<~s' is not of the expected type~s'~:@> FORMAT-ARGUMENTS (W NUMBER)) Error: W' is not of the expected typeNUMBER'

如果 A,B 是整数,我想计算 4A+2B^3。

否则如果至少有一个不是整数打印错误信息。

我尝试使用上面显示的代码。但是如何使用 if 语句进行错误处理?

最佳答案

首先,您应该使用 LET or LET*定义局部变量。

(defun f (a b)
(let* ((c (* 4 a)) ; You need LET* instead of LET because
(d (* 2 (expt b 3))) ; RES depends on the previous variables.
(res (+ c d)))
(if (and (typep a 'integer) (typep b 'integer))
(list 'final 'value '= res)
'(your inputs are not numbers))))

实际问题是您在检查参数是否为整数之前进行计算。您应该将计算移到 IF 中。

(defun f (a b)
(if (and (integerp a) (integerp b))
(let* ((c (* 4 a))
(d (* 2 (expt b 3)))
(res (+ c d)))
(list 'final 'value '= res))
'(your inputs are not numbers)))

返回这样的列表有点奇怪。如果您打算将它们作为用户的输出,您应该改为打印消息并返回实际结果。

(defun f (a b)
(if (and (integerp a) (integerp b))
(let ((result (+ (* 4 a)
(* 2 (expt b 3)))))
(format t "Final value = ~a~%" result)
result) ; Return RESULT or
(format t "Your inputs are not integers.~%"))) ; NIL from FORMAT.

在大多数情况下,如果参数类型不正确,您应该发出错误信号。打印执行计算的函数的输出通常不是一个好主意。

(defun f (a b)
(check-type a integer "an integer")
(check-type b integer "an integer")
(+ (* 4 a)
(* 2 (expt b 3))))

(defun main (a b)
(handler-case
(format t "Final value = ~a~%" (f a b))
;; CHECK-TYPE signals a TYPE-ERROR if the type is not correct.
(type-error () (warn "Your inputs are not integers."))))

(main 12 1)
; Final value = 50
;=> NIL
(main 12 'x)
; WARNING: Your inputs are not integers.
;=> NIL

Common Lisp 条件系统还允许您使用重新启动来修复错误。 CHECK-TYPE 建立一个名为 STORE-VALUE 的重启,您可以调用它来为该位置提供正确的值。在这种情况下,它可能没有意义,但您可以做一些事情,例如使用 1 作为默认值。

(defun main (a b)
(handler-bind ((type-error (lambda (e)
(store-value 1 e))))
(format t "Final value = ~a~%" (f a b))))

(main 12 1)
; Final value = 50
;=> NIL
(main 12 'x)
; Final value = 50
;=> NIL

请注意,条件/错误处理程序确实会增加一些开销,因此对于性能关键函数,您可能不想使用它们,而是在调用函数之前检查您的参数。

(declaim (ftype (function (integer integer) integer) f))
(defun f (a b)
(declare (optimize (speed 3) (safety 0) (debug 0)))
(+ (* 4 a)
(* 2 (expt b 3))))

(defun main (a b)
(if (and (integerp a)
(integerp b))
(format t "Final value = ~a~%" (f a b))
(warn "Your inputs are not integers.")))

关于Lisp - if 语句各种 Action ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42083725/

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