(require (planet dyoo/simply-scheme:1:2/simply-scheme))
(define (ball-val value)
(let ((color value))
(cond ((equal? 'R color) 5)
((equal? 'W color) 2)
((equal? 'B color) 2)
((equal? 'G color) 1))))
(define (count-balls color bucket)
(count (keep (lambda (c) (equal? color c)) bucket)))
这两个过程给出每个彩色球的值,并计算给定特定颜色的铲斗中球的数量。
假设唯一的参数是一个球桶,则需要编写另一个称为颜色计数的过程,以输出一个桶中每个彩色球的编号语句。
编写一个过程
color-counts
,该过程以存储桶作为参数,并返回一个句子,其中包含存储桶中红色的数量,绿色的数量,蓝色的数量和白色的数量。例如:
(color-counts '(R B G R R R B W R W)) '(5 1 2 2) (color-counts '(W R R R R G B B G W)) '(4 2 2 2)
是否可以在count-balls
中调用color-count
并仅为count-balls
中的每种颜色调用color-count
?还是不可能?
我尝试过:
(define (color-counts bucket)
(count-balls 'R bucket count-balls 'W bucket count-balls 'B bucket count-balls 'G bucket))
我得到的是:
#<procedure ...>
答案 0 :(得分:0)
您可以从任何其他过程中调用任何您喜欢的过程。
您打错了count-balls
。它只需要2个参数,但是您要用11个参数来调用它。您需要为每种颜色编写单独的调用,而不是将所有这些都放在一个调用中。并且您需要将其包装在对list
的调用中,以创建所有结果的列表。
(define (color-count bucket)
(list (count-balls 'R bucket)
(count-balls 'G bucket)
(count-balls 'B bucket)
(count-balls 'W bucket)))
您还可以使用map
函数删除所有重复的代码:
(define (color-count bucket)
(map (lambda (color) (count-balls color bucket))
'(R G B W)))
map
以列表(R G B W)
的每个元素为参数重复调用该过程,并返回所有结果的列表。