【问题标题】:Understanding expressions in Scheme理解 Scheme 中的表达式
【发布时间】:2015-03-31 00:54:49
【问题描述】:

我正在使用在线教科书来学习 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 h) 中的wagetaxwage 之前在(tax (wage h)) 中看到一个数学运算符。在这个练习之前,教科书没有提到这个异常。之前的所有示例都类似于(* num1 num2)。有人可以解决我的困惑吗?谢谢。

【问题讨论】:

  • scheme 中的数学运算符实际上只是另一个函数。请记住,这不是中缀;它看起来不像一个普通的数学表达式。想想:(function parameter)
  • 如果wage之前有一个运算符,比如(+ wage h),那意味着什么?如何为数字添加函数?
  • (wage something) 表示将 something 乘以 12。
  • @WickedJargon 表达式(wage x)wage 函数应用x
  • (wage h)(tax (wage h)) 在这个表达式中是什么意思?教科书在练习之前没有明确说明这一点。所以我假设taxwage 都是变量/数字。

标签: scheme lisp expression


【解决方案1】:

确实,在这些表达式中使用了一个数学运算符,即减法。 netpay 函数也可以这样写:

(define (netpay h)
  (- (wage h) (tax (wage h))))

这样更清楚吗?在Scheme中,空格是insignificant,意思是多个空格相当于一个空格,换行符相当于空格。基本上,空格的 数量 无关紧要。它只是用作通用分隔符。

在您习惯之前,Scheme 的前缀符号有时会让人感到困惑。但是,基本思想是所有表达式都具有以下形式:

(f x ...)

这相当于函数应用,也叫“调用函数”。在类似 C 的语言中,语法可能看起来像这样:

f(x, ...)

数学运算符只是常规函数,因此它们共享相同的语法。所以,(+ 1 2) 是 3,(* (+ 1 2) 3) 是 9(看看它们是如何嵌套的)。

那么,这个表达式有什么作用呢?

(- (wage h) (tax (wage h)))

它从(wage h) 中减去(tax (wage h))。在类似 C 的语法中,整个表达式看起来像这样:

wage(h) - tax(wage(h))

【讨论】:

    猜你喜欢
    • 2021-05-25
    • 2016-07-23
    • 2015-05-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-01-29
    • 2015-07-26
    • 2014-01-17
    相关资源
    最近更新 更多