История изменений
Исправление monk, (текущая версия) :
(play (saw-err 440 0.0) 3) не компилится
У тебя в sl->synth-def попадает (saw-err 440 0.0). Он не начинается на hold. Раскрытие макросов всегда начинается снаружи. То есть если есть (play (saw-err 440 0.0) 3), и play и saw-err — макросы, то сначала раскроется play, а уже в результате раскрытия — (saw-err 440 0.0).
Если очень хочется (но этого делать крайне не рекомендуется) использовать макрос как функцию, то в sl->synth-def вместо (syntax-case sl-stx (lt hold push saw) надо писать что-то вроде (syntax-case (syntax-disarm (local-expand sl-stx (syntax-local-context) #f) #f) (lt hold push saw)
Здесь local-expand принудительно раскрывает макрос, а syntax-disarm позволяет использовать биндинги из него.
Исходная версия monk, :
(play (saw-err 440 0.0) 3) не компилится
У тебя в sl->synth-def попадает (saw-err 440 0.0). Он не начинается на hold. Раскрытие макросов всегда начинается снаружи. То есть если есть (play (saw-err 440 0.0) 3), и play и saw-err — макросы, то сначала раскроется play, а уже в результате раскрытия — (saw-err 440 0.0).
Если очень хочется (но этого делать кране не рекомендуется) использовать макрос как функцию, то в sl->synth-def вместо (syntax-case sl-stx (lt hold push saw) надо писать что-то вроде (syntax-case (syntax-disarm (local-expand sl-stx (syntax-local-context) #f) #f) (lt hold push saw)
Здесь local-expand принудительно раскрывает макрос, а syntax-disarm позволяет использовать биндинги из него.