Вы не предоставляете определения структуры для t1
или t2
, поэтому я сделаю предположение.
(struct t1 [a b c] #:transparent)
(struct t2 [d e] #:transparent)
Предполагая, что эти определения соответствуют вашим, я могу перевести каждую ветвь-вопрос и ответ.
Ветвь 1, условие с использованием шаблона ?
, именование для исключения селекторов
Первое условие ветвления (natural? (t1-b x))
можно преобразовать в
(t1 _ (? natural?) _)
Шаблон ?
применяет предикат к значению, с которым сопоставляется, и сопоставляется только тогда, когда предикат возвращает true.Чтобы найти документацию, поищите (? expr pat ...)
в документации по .
И, так как вы используете селекторы t1-a
, t1-b
и t1-c
в ветви-ответ, вы можете назвать их
(t1 a (? natural? b) c)
так, чтобы вся ветвь выглядела как
[(t1 a (? natural? b) c)
(+ a b c)]
ветвь 2, используя буквенные шаблоны, такие как 1
Второйусловие ветвления
(and (= (t2-e (t1-b x)) 1)
(= (t2-d (t1-b x)) 1))
Может быть переведено в
(t1 _ (t2 1 1) _)
И, так как вы не используете селекторы в ответе на ветвь, это не помогает называть символы подстановки,и всю пару вопрос-ответ можно перевести в
[(t1 _ (t2 1 1) _)
10]
Ветвь 3, исключив вложенные селекторы, начинающиеся изнутри
Для этого вопроса ветвления нет, но естьСелекторы, используемые в теле:
(- (+ (t2-d (t1-b x))
(t2-e (t1-b x)))
(t1-a x))))
Сначала уберите селекторы для t1
на x
:
[(t1 a b _)
(- (+ (t2-d b)
(t2-e b))
a)]
Затем уберите селекторы для t2
на b
:
[(t1 a (t2 d e) _)
(- (+ d e)
a)]
Собираем все вместе
Соединяем три ветви вместе в (match x branch1 branch2 ...)
в теле
; assuming these struct definitions
(struct t1 [a b c] #:transparent)
(struct t2 [d e] #:transparent)
(: f (t1 -> integer))
(define f
(lambda (x)
(match x
[(t1 a (? natural? b) c)
(+ a b c)]
[(t1 _ (t2 1 1) _)
10]
[(t1 a (t2 d e) _)
(- (+ d e)
a)])))