Можно ли иметь список шаблонов и опыта, применяемых для соответствия? - PullRequest
0 голосов
/ 31 мая 2018

Я хочу использовать функцию match в Racket, чтобы получить первый элемент, для которого exp0 дает истину.

(define mylist '(['c c] ['a a] ['* *]))

(match '* mylist))

Но это не работает.Выдает ошибку «ожидается предложение с шаблоном и результатом».Как мне этого добиться?

1 Ответ

0 голосов
/ 31 мая 2018

(Во-первых, у вас есть небольшая проблема; я действительно не думаю, что вы хотите заключать в кавычки ваши ключи внутри списка в кавычках; это приведет к созданию ключей, которые на самом деле являются списками, содержащими символ «цитата». По сути, простоне помещайте цитату в цитату.)

Далее: вы можете искать одну из нескольких разных вещей.

Первый и самый очевидный ответ - просто использовать что-то вроде dict-ref:

#lang racket

(define mylist '([c c] [a a] [* *]))

(dict-ref mylist '*)

... который создает список '(*).Вы можете прочитать документы на dict-ref, чтобы понять, почему это список.

Это будет работать до тех пор, пока вы на самом деле не захотите использовать более богатую семантику сопоставления, которую дает вам match.Если вы просто хотите сопоставить, используя равенство, просто используйте приведенное выше решение.

Итак, допустим, вы ищете ключ, состоящий из буквы 'a, за которой следует число:

#lang racket

(define mylist
  '([(c b) c]
    [(a 3) a]
    [(* *) *]))

(findf (match-lambda [(list (list 'a (? number?)) _) #t]
                     [other #f])
       mylist)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...