方案:变量赋值

时间:2018-10-18 18:08:35

标签: variables if-statement scheme variable-assignment

桶是球的句子,例如:R W W B R R R G B。

每种球的颜色都有一个ex值:R(红色= 3)W(白色= 1)

所需的过程采用两个参数bucket1和bucket2,比较这两个存储桶的值,并输出其中一个具有较高的值,或者输出一个相等的值。此过程中使用的是另一个称为bucket-val的过程,该过程计算存储桶的值。

当我在底部执行if语句时,我正在尝试在名为buck1和buck2的过程中创建变量以简化代码。但是我得到了错误:

let:(buck1)

中的语法错误(不是绑定的标识符和表达式)
(define (bucket-val bucket)
  (+ (* (count-balls 'R bucket) (ball-val 'R))
     (* (count-balls 'W bucket) (ball-val 'W))
     (* (count-balls 'B bucket) (ball-val 'B))
     (* (count-balls 'G bucket) (ball-val 'G))))


(define (judge bucket1 bucket2)
  (lambda(buck1 buck2)
    (let ([buck1] (bucket-val bucket1))
      ([buck2] (bucket-val bucket2)))
    (if (equal? b1 b2 'truuuue))))

1 个答案:

答案 0 :(得分:2)

首先。语法上的括号[]()具有相同的含义。因此,如果要添加35,可以编写[+ 3 5] ; ==> 8。计划者使用不同的代码只是为了使一些代码更清晰。除此以外,我想说缩进是掌握的最重要技能,您应该使用为您完成缩进的编辑器。我使用DrRacket,但是如果您是Emacs的人,则应该添加对Scheme的支持。

您的代码有很多问题,主要是因为括号过多/缺少括号。例如。您的let是错误的根源:

(let ([buck1]                     ; make variable buck1 as ??
      (bucket-val bucket1))       ; make variable bcuket-val as bucket1
  ([buck2] (bucket-val bucket2))) ; call buck2 and call the result

是否注意到您混合使用[(?主体调用过程并调用结果。如果您使用buck()(bucket-val, bucket1)

,则在Algol语言中您会得到相同的结果

if不正确,并且在let之外,因此他们不能使用他们创建的局部变量。相反,您尝试将三个值与equal?比较,这将不起作用,并且缺少结果表达式和替代表达式(然后/其他)。某些实现可能不会在那里失败,但是它不是可移植的Scheme代码。

在您的描述中,您没有提到过程会返回一个在被调用时完成工作的过程。双重lambda规定了这一点。 (define (test x) (lambda ...))(define test (lambda (x) (lambda ...))))相同,因此过程返回一个过程,而不是“哪个值更高”。