【发布时间】:2016-07-13 17:17:17
【问题描述】:
我正在阅读《球拍领域》一书,第 175 页,我实际上看到了这段代码:
(struct dice-world (src board gt))
(struct game (board player moves))
(define (no-more-moves-in-world? w)
(define tree (dice-world-gt w))
(define board (dice-world-board w))
(define player (game-player tree))
player)
书中的函数不会返回播放器,但该行之前的所有内容都与书中一样。对我来说,这表明需要模式匹配!
确实,这很好用,对我来说更具可读性和明确性:
(define (no-more-moves+? w)
(match w
[(dice-world _ board (game _ player _)) player]))
但是在这里我们仍然毫无理由地将变量命名为w。我希望能够直接在函数参数上进行模式匹配,如下所示(无效语法):
(define (no-more-moves2? (dice-world _ board (game _ player _)))
player)
到目前为止,从我的谷歌搜索来看,这似乎是不可能的?这听起来让我难以置信?我猜这可能是通过一些宏技巧来实现的,但我真的很惊讶这不是从书中编写代码的标准方法?作为初学者的书,我想也许以后会介绍模式匹配,但我在索引中根本找不到?
另外,如果答案是不可能/不是惯用的,我想知道其他 lisps 是否也一样?
【问题讨论】: