Я часто нахожу следующий тип добавочного определения полезным:
(define (foo) (display "bar"))
(foo)
;prints bar
(define foo (let ((bar foo))
(lambda ()
(display "foo")
(bar))))
(foo)
;prints foobar
Как мне преобразовать этот тип инкрементального определения с помощью макросов?
Мне не удалось получить синтаксис let для обеспечения той же функциональности.
В настоящее время я использую схему plt, но хотел бы видеть ответы и в других реализациях lisp.
Edit:
Наивно я хотел бы сделать следующее:
(define-syntax foo
(syntax-rules ()
((_) (display "bar"))))
(define-syntax foo
(let-syntax ((old-foo (syntax-rules () ((_) (foo)))))
(syntax-rules ()
((_) (begin
(display "foo")
(old-foo))))))
Перевод наивных макросов в рабочие макросы схемы plt:
(require-for-syntax scheme/base)
(define-syntax foo
(syntax-rules ()
[(foo) (display "bar")]))
(define-syntax foo
(let ([old (syntax-local-value #'foo)])
(lambda (stx)
#`(begin #,((syntax-rules ()
[(_) (begin (display "foo"))]) stx)
#,(old #'(_))))))
(foo)
Если мне не хватает лучшего метода, дайте мне знать.