我最近开始玩Racket模式匹配系统,遇到了一个我无法理解的问题.
如果我做:
(match (list 1 2 3 4 5 6 7 8 9 10 11 12)
[(list _ x y z ...) (list y ': x)])
Run Code Online (Sandbox Code Playgroud)
在REPL我得到
'(3 : 2)
Run Code Online (Sandbox Code Playgroud)
作为我想要的结果.
如果我做:
(match (current-date)
[(date* _ x y z ...) (list y ': x)])
Run Code Online (Sandbox Code Playgroud)
要么
(match (date* 5 18 13 18 11 2011 5 321 #f 3600 0 "W. Europe Standard Time")
[(date* _ x y z ...) (list y ': x)])
Run Code Online (Sandbox Code Playgroud)
我收到此错误:
match: wrong number for fields for structure date*: expected 12 but got 5 in: (_ x y z ...)
Run Code Online (Sandbox Code Playgroud)
我怀疑Kleene星...由于某种原因不适用于struct类型.为什么会这样?
Asu*_*awa 10
看起来你真正想做的是匹配结构中字段的子集,而不是实际将结构中的其余字段绑定到(z ...).在这种情况下,您可能希望尝试使用struct* match模式.
这是一个例子:
(match (date* 5 18 13 18 11 2011 5 321 #f 3600 0 "W. Europe Standard Time")
[(struct* date ([minute x] [hour y])) (list y ': x)])
Run Code Online (Sandbox Code Playgroud)
我怀疑Kleene星
...由于某种原因不适用于struct类型.
正确.该...符号,以及相关的..k和___与__k符号,是不是真的匹配的普遍特征,而是一个特定的功能list-matching和hash-table-matching等.如果你检查文档中的正式生产,你会看到某些类型的子模式在不同的地方接受lvp(被定义为pat,或者pat被...其中一个或其中一个朋友定义),而其他子模式只接受pat.
为什么会这样?
我想它只是...用于将列表或向量或散列表或其他部分转换为自己的列表,并且对于固定长度的结构没有合理的方法.值得指出的是,...对于不同类型的行为有所不同 - 例如,它可用于提取哈希表中的键列表 - 因此支持结构的唯一理由是,如果存在特定的类似对结构有意义的操作.我不认为有一个.