if条件下的scheme操作

时间:2012-12-17 10:23:28

标签: if-statement functional-programming scheme conditional

一般在Scheme - syntax: (if test consequent alternate)

我尝试在consequent部分中执行某些操作,例如:如果为true,则在44上设置sum1并返回1
在Scheme代码中 -

(if #t ( 
          (set! sum1 44)
          (if #t 1)
          )) 

以上代码无法解决并提示 -

application: not a procedure;
 expected a procedure that can be applied to arguments
  given: #<void>
  arguments...:
   1 

3 个答案:

答案 0 :(得分:4)

在Scheme中,括号总是用于应用;你不能为分组添加额外的括号。

您的consequent在这里:

((set! sum1 44) (if #t 1))

外部括号使Scheme尝试使用(set! sum1 44)的结果作为过程,将其应用于(if #t 1)的结果。

你想要的是按顺序评估两个表达式,然后返回最后一个的结果。执行此操作的表单为begin,因此应该是:

(begin (set! sum1 44) (if #t 1))

答案 1 :(得分:3)

(if #t (begin 
          (set! sum1 44)
          (if #t 1))) 

答案 2 :(得分:3)

如果你写if没有else部分,有些口译员(例如球拍)会抱怨。为了解决这个问题,并且为了避免在后续部分中有多个表达式时明确使用begin,最好使用when特殊表单(如果可用,因为它不是标):

(when #t
  (set! sum1 44)
  (when #t 1))

一般来说,这是when及其兄弟unless的结构:

(when <condition>    ; equivalent to (if <condition> (begin ...))
  <exp1>             ; consequent, no alternative
  <exp2>)

(unless <condition>  ; equivalent to (if (not <condition>) (begin ...))
  <exp1>             ; consequent, no alternative
  <exp2>)

如果结果和备选方案都有多个表达式,则可以在每个部分中使用if begin

(if <condition>
    (begin     ; consequent
      <exp1>
      <exp2>)
    (begin     ; alternative
      <exp3>
      <exp4>))

...但使用cond更为实际,begin隐含地在每个子句中使用(cond (<condition> <exp1> ; consequent <exp2>) (else ; alternative <exp3> <exp4>))

{{1}}