所以,我有一个Racket的struct
,叫做stats:
(struct stats (str con dex int wis cha))
我有一个函数add-stats
:
(define (modify-stats mods base)
(stats (+ (stats-str mods)
(stats-str base))
(+ (stats-con mods)
(stats-con base))
(+ (stats-dex mods)
(stats-dex base))
(+ (stats-int mods)
(stats-int base))
(+ (stats-wis mods)
(stats-wis base))
(+ (stats-cha mods)
(stats-cha base))))
显然这很混乱,而且涉及到很多不必要的重复。我成功将其简化为更易读的版本:
(define (modify-stats mods base)
(define (add-stat statid)
(+ (statid mods)
(statid base)))
(stats (add-stat stats-str)
(add-stat stats-con)
(add-stat stats-dex)
(add-stat stats-int)
(add-stat stats-wis)
(add-stat stats-cha)))
但是这里仍然有很多"stat(s)"的重复。有没有更简洁的方法可以对相同类型的两个结构体的字段执行操作?
更新: 我已经成功改进了它,就像这样:
(define (stat a-stat stats)
(match a-stat
["str" (stats-str stats)]
["con" (stats-con stats)]
["dex" (stats-dex stats)]
["int" (stats-int stats)]
["wis" (stats-wis stats)]
["cha" (stats-cha stats)]
[_ (error "Not a stat!")]))
(define (modify-stats mods base)
(define (add-stat string)
(+ (stat string mods)
(stat string base)))
(stats (add-stat "str")
(add-stat "con")
(add-stat "dex")
(add-stat "int")
(add-stat "wis")
(add-stat "cha")))
add-stat
,而不是硬编码它。这个问题似乎更适合 StackExchange 代码审查,因为代码是工作的。
- ben rudgers