Как привязать «остальные» переменные к списку значений в макросе в Scheme - PullRequest
1 голос
/ 12 января 2010

Я хочу сделать вспомогательный макрос для написания расширений совпадений. У меня есть что-то вроде этого:

(define-match-expander my-expander
  (λ (stx)
    (let* ([dat (cdr (syntax-e stx))]
           [var1 (car dat))]
           [var2 (cadr dat)])
      ;transformer goes here )))

Итак, я хотел макрос, который будет выполнять привязку let. Я начал с чего-то вроде этого:

(define-syntax-rule (define-my-expander (id vars ...) body)
  (define-match-expander id
    (λ (stx)
      (match-let ([(vars ...) (cdr (syntax-e stx))])
        body))))

, но match-let не определено во время преобразования.

Первый вопрос: есть ли другой способ сделать это (я имею в виду, это расширители)? Может быть, в plt-схеме уже есть что-то похожее, чего я не знаю, или я каким-то образом ошибаюсь.

Независимо от ответа на первый вопрос, если я захочу связать список переменных со списком значений внутри макроса, как мне это сделать?

РЕДАКТИРОВАТЬ: в сочетании с макросом ответа Эли теперь выглядит так:

(define-syntax-rule (define-my-expander (id vars ...) body)
  (define-match-expander id
    (λ (stx)
      (syntax-case stx ()
        [(_ vars ...)
         body]))))

1 Ответ

4 голосов
/ 13 января 2010

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

(define-match-expander my-expander
  (lambda (stx)
    (syntax-case stx ()
      [(_ (var1 var2) stuff ...)
       ;; use #'var1 #'var2 and #'(stuff ...) here
       ])))

Дело в том, что syntax-e используется, чтобы "развернуть" объект синтаксиса и дать вам то, что он содержит - но фактический контент может вас удивить. Например, (foo . (bar)) будет иметь немного другое содержимое, чем (foo bar). Так что, вообще говоря, использование syntax-case для сопоставления с образцом для вас намного проще. В дополнение к тому, что это проще, он также будет выдавать некоторые разумные сообщения об ошибках при наличии ошибок вместо того, что вы получите с вашим кодом.

...