我正在尝试创建一个函数games-won
,该函数使用游戏列表,结果以及字符串,名称,并在games
获胜的结果中产生name
的数量。
例如:
(define-struct game (winner loser high low))
(check-expect (games-won (list (make-game "Lori" "Troy" 52 34)
(make-game "Mary" "Lori" 30 20)) "Lori") 1)
以下是我到目前为止的内容:
(define (won? game name)
(equal? (game-winner game) name))
(define (wonlst results)
(filter won? results))
(define (lst-length lst)
(cond
[(empty? lst) 0]
[(cons? lst) (+ 1 (length (rest lst)))]))
(define (games-won results)
(cond
[(cons? (wonlst results)) (lst-length (wonlst results))]
[else 0]))
任何人都可以帮助纠正我的代码中的错误,或者告诉我如何使用local
并将所有功能放在一起吗?
答案 0 :(得分:0)
以下是修复程序:
games-won
应该接受两个参数:结果列表和名称。因此,我们向name
添加了一个参数games-won
。 lst-length
函数,只需使用length
。另外,games-won
无需担心在0
情况下返回else
的情况。基本情况由列表摘要处理。won?
接受两个输入,但是filter
中的谓词功能仅接受一个输入。因此,我们从name
中删除了won?
。将won?
放在本地后,就可以从周围函数的上下文中使用name
。 games-won
中,并将两个助手-won?
和won-lst
-放置在本地人中。 string=?
而不是equal?
,因为我们知道name
的{{1}}和winner
字段始终是字符串。 game
我们可以将所有内容与lambda放在一个函数中,如下所示:
(define-struct game (winner loser high low))
; games-won : [List-of Game] String -> Number
(define (games-won results name)
(local (; won? : Game -> Boolean
(define (won? game)
(string=? (game-winner game) name))
; wonlst : [List-of Game] -> [List-of Game]
(define (wonlst results)
(filter won? results)))
(length (wonlst results))))
(define my-games1 (list (make-game "Lori" "Troy" 52 34)
(make-game "Mary" "Lori" 30 20)))
(check-expect (games-won my-games1 "Lori") 1)
(define (games-won results name)
(length (filter (λ (game) (string=? (game-winner game) name)) results)))
本地表达式具有以下形状:
local
在方括号内,您可以根据需要在本地的 body 中放置任意数量的定义(即(local [definition ...] body-expression)
,define
)。 {1}}-您可以在方括号内放置任何可能使用或不使用定义的表达式。这些定义仅在正文中可用。
从HtDP开始,这是我们如何使用本地语言进行计算:
我们重命名本地定义的常量和函数,以使用程序中其他地方未使用的名称。
我们将本地表达式中的定义提升到最高级别,然后评估本地表达式的主体。