Многоточие над цитатой в выражении redex

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

#lang racket
(require redex)

(define-language L
   (e n ((n n) ...) (n ...))
   (n number))

(define-metafunction L
   ((add-up n) n)
   ((add-up ((e_1 e_2) ...)) (,(+ (term e_1) (term e_2)) ...)))

Тем не менее, последнее определение для add-up не принято - Redex жалуется на e_1 а также e_2 требующий многоточия, несмотря на то, что он уже ниже одного многоточия. Есть ли способ применить кавычку Ракетки к каждому члену многоточия в Redex?

1 ответ

Решение

Проблема здесь в том, что у вас есть переменные шаблона e_1 а также e_2 отделены от эллипсов ... без кавычек (,). Redex pattern matcher не достаточно умен, чтобы просматривать кавычки, потому что вы можете поместить туда произвольную ракетку.

Однако вы можете использовать конструкции Racket (в данном случае специально map) сложить свои номера. Выражение будет выглядеть так:

,(map + (term (e_1 ...)) (term (e_2 ...)))

Или все вместе:

#lang racket
(require redex)

(define-language L
   (e n ((n n) ...) (n ...))
   (n number))

(define-metafunction L
   ((add-up n) n)
   ((add-up ((e_1 e_2) ...)) ,(map + (term (e_1 ...)) (term (e_2 ...)))))
Другие вопросы по тегам