Кажется, это работает, это макрос, который расширяется до последовательных целых чисел, в зависимости от того, сколько раз он был расширен.
;; Library (test macro-state)
(library
(test macro-state)
(export get-count incr-count)
(import (rnrs))
(define *count* 0)
(define (get-count) *count*)
(define (incr-count) (set! *count* (+ *count* 1)))
)
;; Program
(import (rnrs) (for (test macro-state) expand))
(define-syntax m
(lambda (x)
(syntax-case x ()
((m) (begin (incr-count) (datum->syntax #'m (get-count)))))))
(write (list (m) (m) (m)))
(newline)
;; prints (1 2 3)
Но это неуклюже для меня, потому что состояние макроса *count*
и макросm
Сам есть в разных модулях.Есть ли лучший способ сделать это в r6rs, предпочтительно тот, который не разделяет реализацию на два модуля?
EDIT
Я должен дать понять, что хотяэтот пример - всего лишь один макрос, в действительности я ищу метод, который работает, когда нескольким макросам необходимо совместно использовать состояние.