一般在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
答案 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}}