Lisp 试图计算工资总额

Lisp 试图计算工资总额,lisp,common-lisp,clisp,Lisp,Common Lisp,Clisp,我正在尝试创建一个程序,计算员工每周的总工资 这是我的密码 (princ"Enter working hours: ") (defparameter workhours(read)) (if (and (>= workhours 0)) (<= workhours 60)) (princ"Enter hourly pay rate: ") (defparameter HPrate(read)) (if(<= wor

我正在尝试创建一个程序,计算员工每周的总工资

这是我的密码

(princ"Enter working hours: ")
(defparameter workhours(read))
(if (and (>= workhours 0)) (<= workhours 60))
    (princ"Enter hourly pay rate: ")
    (defparameter HPrate(read))
    (if(<= workhours 40)
        (* workhours HPrate))

您应该尝试将代码的逻辑与输入/输出操作(如询问数字或编写结果)分开。通常最好只编写给定数字和输出数字的函数。然后,您可以从任何类型的用户界面(图形或文本)调用它

业务逻辑 您需要计算给定工作小时数和小时工资的总工资

因此,您定义了一个名为
毛工资
的函数,该函数将
工时数
小时工资
作为输入:

(defun gross-pay (work-hours hourly-rate)
  10000 ;; a lot of money, just for testing
  )
现在定义了它,您可以调用它,您的环境将自动打印结果:

* (gross-pay 0 0)
10000 
代码中的一个问题是,
if
分支包含一个测试和三个分支,这不是有效的语法。根据你所写的,我猜你想有这样的逻辑:

(defun gross-pay (work-hours hourly-rate)
  (assert (<= 0 work-hours 60))
  ;; ...
  )
通过使用
多值绑定
,可以获得多个
值的结果,如下所示:

(defun gross-pay (work-hours hourly-rate)
  (assert (<= 0 work-hours 60))
  (multiple-value-bind (regular overtime) (split-time work-hours)
    ;; here regular and overtime are bound to values
    ))
输入/输出 如果需要,可以在命令行界面中包装逻辑:

(defun gross-pay/io ()
  (gross-pay
   (ask "Enter working hours: " '(integer 0 60))
   (ask "Enter hourly pay rate: " '(integer 1 1000))))
上述功能的实现多亏了这个helper函数,它负责处理请求输入时可能出现的不同问题(清除缓冲、强制输出、读取值时禁用求值、检查类型等)

在我的环境中,以下是一个示例交互:

USER> (gross-pay/io)

Enter working hours: 5

Enter hourly pay rate: 3

15
还有一个输入错误的例子:

Enter working hours: 87
type mismatch: 87 not of type (INTEGER 0 60)
Enter working hours: ""
type mismatch:  not of type (INTEGER 0 60)
Enter working hours: 15

Enter hourly pay rate: 0
type mismatch: 0 not of type (INTEGER 1 1000)
Enter hourly pay rate: 88

1320

***-(我不认识这个语法“***-”你的Lisp环境是什么?工作时间的值是什么?顺便说一下,断言告诉你表达式是错误的(
* (gross-pay 10 1)
10

* (= (gross-pay 50 1)
     (+ (* 40 1) 
        (* 10 3/2)))
T
(defun gross-pay/io ()
  (gross-pay
   (ask "Enter working hours: " '(integer 0 60))
   (ask "Enter hourly pay rate: " '(integer 1 1000))))
(defun ask (prompt type)
  (let ((*standard-output* *query-io*))
    (loop
      (clear-input)
      (fresh-line)
      (princ prompt)
      (finish-output)
      (let ((value (let ((*read-eval* nil)) (read))))
        (if (typep value type)
            (return value)
            (format *error-output*
                    "type mismatch: ~a not of type ~a"
                    value type))))))
USER> (gross-pay/io)

Enter working hours: 5

Enter hourly pay rate: 3

15
Enter working hours: 87
type mismatch: 87 not of type (INTEGER 0 60)
Enter working hours: ""
type mismatch:  not of type (INTEGER 0 60)
Enter working hours: 15

Enter hourly pay rate: 0
type mismatch: 0 not of type (INTEGER 1 1000)
Enter hourly pay rate: 88

1320