Сопоставление с звездой Клини по типу конструкции в ракетке - PullRequest
5 голосов
/ 18 ноября 2011

Я недавно начал играть с системой сопоставления с образцом ракетки и столкнулся с проблемой, которую не могу понять.

Если я сделаю:

(match (list 1 2 3 4 5 6 7 8 9 10 11 12)
    [(list _ x y z ...) (list y ': x)]) 

в ответ я получаю

'(3 : 2)

как мой желаемый результат.

Если я это сделаю:

(match (current-date)
    [(date* _ x y z ...) (list y ': x)])

или

(match (date* 5 18 13 18 11 2011 5 321 #f 3600 0 "W. Europe Standard Time")
    [(date* _ x y z ...) (list y ': x)])

я получаю эту ошибку:

match: wrong number for fields for structure date*: expected 12 but got 5 in: (_ x y z ...)

Я подозреваю, что звезда Клини ... по какой-то причине не работает с типом структуры. Почему это так?

Ответы [ 2 ]

10 голосов
/ 18 ноября 2011

Похоже, что вы действительно хотите сделать, это сопоставить подмножество полей в структуре, а не связать остальные поля в структуре с (z ...).В этом случае вы можете попробовать вместо этого использовать шаблон сопоставления struct *.

Вот пример:

(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)])
8 голосов
/ 18 ноября 2011

Я подозреваю, что звезда Клини ... по какой-то причине не работает с типом структуры.

Правильно.Обозначения ... и связанные с ними обозначения ..k и ___ и __k на самом деле не являются общей функцией сопоставления, а скорее признаком сопоставления list и hash-table сопоставления искоро.Если вы изучите формальное производство в документации , вы увидите, что некоторые типы подшаблонов принимают lvp (который определяется как pat, или pat, за которым следует ... или одинсвоих друзей) в разных местах, тогда как другие принимают только pat.

Почему это так?

Я думаю, это просто, что ... используется дляпереведите часть списка, вектора, хеш-таблицы или еще чего-нибудь в собственный список, и для структуры фиксированной длины не существует разумного способа сделать это.Возможно, стоит отметить, что ... ведет себя по-разному для разных типов - например, его можно использовать для извлечения списка ключей в хэш-таблице - поэтому единственной причиной для поддержки его для структур будет наличиеконкретная аналогичная операция, которая будет иметь смысл для структур.Я не думаю, что есть один.

...