在Racket的match中能否为模式的部分命名?
在Racket中使用类似F#的命名模式(As Pattern)
Racket的match(包括define/match)原生支持给模式的部分绑定名称,完全可以实现你想要的功能,不需要重复执行解构逻辑。有两种常用写法:
1. 简洁语法:绑定名:模式
这是最直观的写法,直接在模式前加上绑定名和冒号,就能把匹配到的模式结果绑定到该名称上。
针对你给出的代码,修改第三个分支如下:
(define/match (make lst) [((list)) (const #f '())] [((list (cons _ n))) (cons (make-tree-node n) '())] [((list-rest (cons parent pnum) child-pair:(cons child cnum) rest)) ; 直接使用child-pair,无需重新构造(cons child cnum) ; rest已经是匹配到的剩余列表,直接使用即可 (displayln child-pair) ; 示例:打印绑定的child-pair ; 其他逻辑 ])
2. 标准写法:(and 模式 绑定名)
如果你偏好更显式的语法,可以用and模式同时匹配结构并绑定名称:
(define/match (make lst) [((list)) (const #f '())] [((list (cons _ n))) (cons (make-tree-node n) '())] [((list-rest (cons parent pnum) (and (cons child cnum) child-pair) rest)) ; 同样可以直接使用child-pair (displayln child-pair) ; 其他逻辑 ])
两种写法的效果完全一致,都不会重复执行解构操作——绑定的名称直接引用match宏已经解构出的结果,既清晰又高效。
内容的提问来源于stack exchange,提问作者primfaktor
相关产品推荐
相关产品推荐

