桶是球的句子,例如: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))))
答案 0 :(得分:2)
首先。语法上的括号[]
和()
具有相同的含义。因此,如果要添加3
和5
,可以编写[+ 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)
if
不正确,并且在let
之外,因此他们不能使用他们创建的局部变量。相反,您尝试将三个值与equal?
比较,这将不起作用,并且缺少结果表达式和替代表达式(然后/其他)。某些实现可能不会在那里失败,但是它不是可移植的Scheme代码。
在您的描述中,您没有提到过程会返回一个在被调用时完成工作的过程。双重lambda
规定了这一点。 (define (test x) (lambda ...))
与(define test (lambda (x) (lambda ...))))
相同,因此过程返回一个过程,而不是“哪个值更高”。