在Racket结构类型上与Kleene星形匹配

men*_*tus 5 scheme racket

我最近开始玩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)


rua*_*akh 8

我怀疑Kleene星...由于某种原因不适用于struct类型.

正确.该...符号,以及相关的..k_____k符号,是不是真的匹配的普遍特征,而是一个特定的功能list-matching和hash-table-matching等.如果你检查文档中的正式生产,你会看到某些类型的子模式在不同的地方接受lvp(被定义为pat,或者pat...其中一个或其中一个朋友定义),而其他子模式只接受pat.

为什么会这样?

我想它只是...用于将列表或向量或散列表或其他部分转换为自己的列表,并且对于固定长度的结构没有合理的方法.值得指出的是,...对于不同类型的行为有所不同 - 例如,它可用于提取哈希表中的键列表 - 因此支持结构的唯一理由是,如果存在特定的类似对结构有意义的操作.我不认为有一个.