理解Scheme中的表达式

时间:2015-03-31 00:54:49

标签: scheme lisp expression

我正在使用在线教科书来学习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)。有人可以清除我的困惑吗?谢谢。

1 个答案:

答案 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))