LINUX.ORG.RU

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

Исправление monk, (текущая версия) :

Собственно проблема кодогенерации вообще и макросов в частности именно в этом, как по мне, что у тебя инструмент превращается в непоймичо и это непоймичо надо расковыривать отдельно. А сделать так, чтобы было композабельно и при этом не требовало лезть внутрь сделать могут немногие. Ну и остальное уже не единожды упоминали, что если в лиспах макросинг это нормальный путь, потому что у тебя весь синтаксис это AST жопой к программисту, то в том же расте у тебя есть обычные макросы с наркоманским синтаксисом и proc-macro, которые считай трансформер token stream непоймичего в растовый token stream.

Действительно. Вот и ответ. Макросы в стиле лиспа сложно отлаживать и поддерживать в IDE. Как я уже писал, единственное исключение Racket, но в нём как раз при выборе между макросом и функцией всегда выбирают функцию.

Макросы в стиле лиспа в общем случае сложно писать. По крайней мере, практически везде, кроме самого Common Lisp, есть альтернативный «простой» путь написания макросов (как обычные макросы в расте).

Макросы в стиле лиспа являются протекающей абстракцией, так как используемый в них символы могут иметь не то значение, которое ожидается, в момент применения. Где-то с этим борются вводя гигиену (и заметно усложняя макросы, так как теперь каждый узел тащит контекст), где-то (как в Common Lisp) просто запоминают, где грабли.

Для макроса в стиле лиспа аргументы макроса должны быть корректными синтаксическими деревьями. Это ограничивает возможный синтаксис. И если в лиспе ограничение не так заметно, так как все синтаксические структуры и так имеют вид последовательности элементов в скобках, то для других языков почти всегда невозможно сделать ещё один if. Приходится делать что-то вроде if2(cond(), { do_if_true(); }, { do_if_false(); });, что ужасно некрасиво.

Исходная версия monk, :

Собственно проблема кодогенерации вообще и макросов в частности именно в этом, как по мне, что у тебя инструмент превращается в непоймичо и это непоймичо надо расковыривать отдельно. А сделать так, чтобы было композабельно и при этом не требовало лезть внутрь сделать могут немногие. Ну и остальное уже не единожды упоминали, что если в лиспах макросинг это нормальный путь, потому что у тебя весь синтаксис это AST жопой к программисту, то в том же расте у тебя есть обычные макросы с наркоманским синтаксисом и proc-macro, которые считай трансформер token stream непоймичего в растовый token stream.

Действительно. Вот и ответ. Макросы в стиле лиспа сложно отлаживать и поддерживать в IDE. Как я уже писал, единственное исключение Racket, но в нём как раз при выборе между макросом и функцией всегда выбирают функцию.

Макросы в стиле лиспа в общем случае сложно писать. По крайней мере, практически везде, кроме самого Common Lisp, есть альтернативный «простой» путь написания макросов (как обычные макросы в расте).

Макросы в стиле лиспа являются протекающей абстракцией, так как используемый в них символы могут иметь не то значение, которое ожидается, в момент применения. Где-то с этим борются вводя гигиену (и заметно усложняя макросы, так как теперь каждый узел тащит контекст), где-то (как в Common Lisp) просто запоминают, где грабли.

Для макроса в стиле лиспа аргументы макроса должны быть корректными синтаксическими деревьями. Это ограничивает возможный синтаксис. И если в лиспе ограничение не так заметно, так как все синтаксические структуры и так имеют вид последовательности элементов в скобках, то для других языков почти всегда невозможно сделать ещё один if. Приходится делать что-то вроде if2(cond(), { do_if_true(); }, { do_)if_false(); });, что ужасно некрасиво.