Дано:
(define-syntax (test stx)
(syntax-case stx ()
[(_ body ...)
(with-syntax ([body0 (process-body #'(body ...))])
#'body0)]))
Как я должен получить шаблон и эллипсы в помощнике? Я даже не уверен, что обертывание тела ... внутри () правильно, но я видел его повсюду, и это единственное, что не дает сбоев.
Процедура тела процесса заканчивается синтаксисом, который имеет дополнительную () обертку. Я могу попытаться разбить это на части, но мне просто интересно, как правильно это сделать.
process-body оборачивает шаблон тела некоторым кодом до И после. И, как и в случае с определением, я хочу предоставить макросу несколько форм, а не все формы в одном списке. Итак, если задано (форма1) (форма2), где форма2 — многоточие, тело процесса должно (делать-что-то) (форма1) (форма2) (делать-что-то-еще).
ie,
(define-for-syntax (process-body body-syntax)
(with-syntax ([stx body-syntax])
(syntax/loc body-syntax
(λ (request)
stx))))
Конечно, у меня это работает, когда я определяю шаблон в строке, и я полагаю, что мог бы сделать это здесь, но иногда шаблон становится громоздким, и приятно вызвать помощника.
Большое спасибо.
В качестве редактирования, чтобы попробовать первый пример dyoo, я предоставляю следующее:
#lang racket
(define-syntax (test2 stx)
(syntax-case stx ()
[(_ body ...)
(with-syntax ([(body0 ...) (process-body2 #'(body ...))])
#'(begin body0 ...))]))
(define-for-syntax (process-body2 bodies)
(with-syntax ([(body ...) bodies])
(syntax/loc bodies
(λ (request)
body ...))))
(test2 (print "hi"))
λ: плохой синтаксис
process-body
предназначен для использования списка синтаксисов, то вы, вероятно, можете сделать что-то вроде:(process-body (syntax->list #'(body ...)))
, используяsyntax->list
для фрагментации объекта синтаксиса на его части. - person dyoo   schedule 15.01.2013process-body
, вопрос немного неясен. Можете ли вы добавить больше деталей? - person dyoo   schedule 15.01.2013begin
для сплайсинга? - person dyoo   schedule 15.01.2013