Можно ли изменить результат синтаксического класса? - PullRequest
3 голосов
/ 27 марта 2019

В настоящее время у меня есть несколько классов синтаксиса сплайсинга, которые я использую для генерации кода.
Они выглядят так:

(define-splicing-syntax-class vec-exp
  (pattern (~seq x y)
    #:with result #'(vec x y)))

Цель состоит в том, чтобы иметь возможность сопоставлять последовательность x y в любом месте изамените его на (vec x y).

Единственный способ, который я пока вижу, - это создать атрибут с именем result и использовать его:

> (syntax-parse #'(position 4.2 5.7)
    [(<name> <pos>:vec-exp)
     (attribute <pos>.result)])
#'(vec 4.2 5.7)

Есть ли способ изменить мой кодчтобы я мог получить тот же результат, написав следующее?

> (syntax-parse #'(position 4.2 5.7)
    [(<name> <pos>:vec-exp)
     (attribute <pos>)])
#'(4.2 5.7) ;; not what I want

Ответы [ 2 ]

2 голосов
/ 29 апреля 2019

FWIW, вы можете сделать это.Не уверен, что это приемлемо для вас или нет.

(require syntax/parse
         (for-syntax syntax/parse))

(define-splicing-syntax-class vec-exp
  (pattern (~seq x y) #:with result #'(vec x y)))

(define-syntax ~res
  (pattern-expander
   (syntax-parser
     [(_ pat cls)
      #'(~and (~var PAT cls) (~bind [pat (attribute PAT.result)]))])))

А потом:

> (syntax-parse #'(position 4.2 5.7)
    [(<name> (~res <pos> vec-exp))
     (attribute <pos>)])
#'(vec 4.2 5.7)
1 голос
/ 08 апреля 2019

Я так не думаю. Шаблон (<name> <pos>:vec-exp) означает «Входные данные должны быть списком; связать его элементы с переменными шаблона <name> и <pos>». Эти переменные шаблона обеспечивают доступ к тому, что было сопоставлено. Атрибуты, возвращаемые классом синтаксиса, то, что было сгенерировано. Система syntax-parse очень разборчива в том, чтобы сохранить эти два понятия различными, поэтому Я не думаю, что это позволит вам заменить одно на другое.

Вы пытаетесь сделать ваш макрос более читабельным или менее подверженным ошибкам? Если так, возможно, расскажите нам немного больше. Может быть, есть способ сделать это.

...