Я часто следующий типа дополнительного определения полезного:Возможно ли инкрементное определение макросов?
(define (foo) (display "bar"))
(foo)
;prints bar
(define foo (let ((bar foo))
(lambda()
(display "foo")
(bar))))
(foo)
;prints foobar
Как преформы этого типа дополнительного определения с макросами? Я не мог получить let-syntax для обеспечения той же функциональности.
В настоящее время я использую схему 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)
Если я пропускаю лучший метод дай мне знать.
Спасибо, я должен был включить (require-for-syntax scheme/base), чтобы компиляция была определена в фазе синтаксиса? (Чтобы сделать compose определен в определении-синтаксисе). Можете ли вы прокомментировать мой наивный подход (добавленный к вопросу), не реализован? Погода непрактична или как она несовместима с существующим синтаксисом? – Davorak
Да, вам нужно «схема/база», чтобы получить композицию; но вы можете комбинировать макрофункции любым способом - это просто функции от синтаксиса до синтаксиса, а «синтаксические правила» - это удобный (обычно второй) макрос, который генерирует такие функции. Что касается вашего наивного подхода, он сталкивается с некоторыми фундаментальными проблемами: он пытается каким-то образом захватить старый синтаксис, но вы не можете получить его * значение * таким образом, поэтому результатом будет макрос, который расширяется до вызовов к себе. Другая проблема заключается в попытке использовать 'display' для отладки файлов - макросы не будут * делать * это, они будут * расширять * на него. –
Спасибо, я знал, что не смогу захватить старый синтаксис таким образом и что он будет расширяться в себе. Я просто подумал, что это красиво оформлено синтаксисом, с которым я знаком, и задавался вопросом, почему, поскольку он существовал на уровне функции, почему он не существовал на уровне макросов, хотя, похоже, не было ничего фундаментального, чтобы остановить компилятор от действия этого способа. Я пытался использовать дисплей в качестве теста, чтобы убедиться, что макрос был создан правильно, я отредактировал свой вопрос как перевод моего наивного макроса на рабочий макрос схемы plt. – Davorak