Схема (Кава) - Как заставить расширение макроса внутри другого макроса - PullRequest
0 голосов
/ 25 августа 2018

Я хочу создать макрос, который при использовании в определении класса создает поле, его общедоступный установщик и аннотацию. Однако может показаться, что макрос не расширяется, главным образом потому, что он используется внутри другого макроса (определение класса).

Вот пример того, как определить класс с одним полем:

(define-simple-class test-class ()
    (foo :: java.util.List ))

Мой макрос (только определяет поле на данный момент):

(define-syntax autowire
  (syntax-rules ()
    ((autowire class id) 
            (id :: class))))

Однако, если я попытаюсь его использовать:

(define-simple-class test-class ()
    (autowire java.util.List foo))

и запрос полей нового класса с помощью отражения, я вижу, что он создает поле с именем autowire, а foo нигде не видно. Похоже, проблема порядка, в котором макросы раскрываются.

1 Ответ

0 голосов
/ 26 августа 2018

Да, макросы расширяются «извне».После расширения define-simple-class подчиненная форма (autowire java.util.List foo) больше не существует.

Если вы хотите такого рода модификацию поведения, вам нужно определить свой собственный макрос define-not-so-simple-class, который может расшириться до define-simple-classform.

Однако, пожалуйста, сделайте шаг назад, прежде чем делать такую ​​незначительную настройку на что-то стандартное, и спросите себя, стоит ли это того.Достоинством может быть синтаксис, который немного лучше согласован с тем, как вы думаете, но недостатком является то, что он может быть хуже выровнен с тем, как думают другие (кому может понадобиться понять ваш код).Существует правило для удобочитаемого и удобочитаемого кодирования: «будь традиционным».

...