我正在使用在线教科书来学习Scheme编程语言。我无法理解课本练习的解决方案(练习2.3.1。this page)。练习如下:
乌托邦的税务会计师总是使用计算所得税的计划 即使税率是稳定的,从不改变15%。定义 计划税,决定总薪酬的税收。
还定义netpay。该计划确定员工的净工资 从工作小时数。假设每小时12美元的费率。
在尝试使用教科书中提供的解决方案(找到here)之前,我做了几次尝试来完成它。解决方案如下:
;; computes the tax
(define (tax w)
(* 0.15 w))
;; computes the net pay
(define (netpay h)
(- (wage h)
(tax (wage h))))
;; computes the wage for a given number of hours
(define (wage h)
(* h 12))
;; EXAMPLES TURNED INTO TESTS
(tax 100) ;; should be 15
(wage 2) ;; should be 24
(netpay 40) ;; should be 408
这是令我困惑的代码部分:
(define (netpay h)
(- (wage h)
(tax (wage h))))
我不明白为什么这个表达有效。我期待在wage
(wage h)
之前和tax
之前wage
和(tax (wage h))
之前看到一个数学运算符。在本练习之前,教科书没有提到这种异常现象。之前的所有示例都类似于(* num1 num2)
。有人可以清除我的困惑吗?谢谢。
答案 0 :(得分:2)
实际上,是在这些表达式中使用的数学运算符,减法。 netpay
函数也可以这样写出:
(define (netpay h)
(- (wage h) (tax (wage h))))
那更清楚吗?在Scheme中,空格无关紧要,这意味着多个空格相当于一个空格,而换行符等同于空格。基本上,空白的金额并不重要;它只是一个普通的分离器。
在您习惯之前,Scheme的前缀表示法有时会令人困惑。但是,基本思想是所有表达式都具有以下形式:
(f x ...)
这相当于函数应用程序,也称为“调用函数”。在类C语言中,语法可能如下所示:
f(x, ...)
数学运算符只是常规函数,因此它们共享相同的语法。因此,(+ 1 2)
为3,(* (+ 1 2) 3)
为9(请参阅如何嵌套)。
那么,这个表达式做了什么?
(- (wage h) (tax (wage h)))
它从(tax (wage h))
中减去(wage h)
。在类C语法中,整个表达式看起来像这样,而不是:
wage(h) - tax(wage(h))