LINUX.ORG.RU

История изменений

Исправление 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 позволяет использовать биндинги из него.