Как составить контракт на разнородный список с произвольным количеством значений? - PullRequest
2 голосов
/ 08 июля 2020

Я пытаюсь заключить контракт для данных, которые выглядят следующим образом:

'(a (b c) (d e) ...) ; a, b, c, d, e are all symbols

, который в основном представляет собой список, состоящий из символа, за которым следует произвольное количество списков из двух символов.

Есть list/c, но это позволяет мне делать это только с фиксированным количеством элементов. Существует также *list/c, который принимает произвольные начальные значения, за которыми следуют окончательные фиксированные значения, что является своего рода противоположностью тому, что мне нужно.

Как мне сделать правильный контракт для моей структуры данных?

1 Ответ

3 голосов
/ 08 июля 2020

Вы можете использовать cons/c, чтобы применить один контракт к началу списка, а другой - к хвосту. Вы хотите express, чтобы голова была символом, а хвост - списком пар символов, так что это будет:

(cons/c symbol? (listof (list/c symbol? symbol?)))
...