Макросы: в чем выгода? - PullRequest
0 голосов
/ 31 июля 2010

Пол Грэм пишет :

Например, типы кажутся неисчерпаемым источником исследовательских работ, несмотря на то, что статическая типизация, по-видимому, исключает истинные макросы - безкоторый, по моему мнению, не стоит использовать ни один язык.

Что за макросы?Я не проводил с ними много времени, но из устаревшего C / C ++, с которым я работал, они, по-видимому, в основном использовались как хак до появления шаблонов / шаблонов.

Трудно представитьчто

DECLARELIST(StrList, string);
StrList slist;

почему-то предпочтительнее, чем

List<String> slist;

Я что-то упускаю?

Тогда используется псевдо-функция, например MAKEPOINTS :

POINTS MAKEPOINTS(
    DWORD dwValue
);

Почему бы вместо этого не определить его как функцию?Является ли это некоторой оптимизацией, когда вы избегаете дублирования кода без дополнительных накладных расходов другого фрейма стека?

Кроме того, существуют сложные элементы управления потоком данных, связанные с GOTO, которые кажутся сомнительными.

Что хорошего в макросах?Они менее безопасны по типу (в C и C ++) (верно?).Почему Пол Грэм не будет программировать без них?

Ответы [ 2 ]

6 голосов
/ 31 июля 2010

Макросы LISP - это совершенно другой зверь. Макросы C / C ++ могут просто заменить фрагмент текста другим фрагментом текста, используя чрезвычайно простой язык. Принимая во внимание, что программа LISP (после «чтения») является структурой данных LISP и поэтому может управляться с использованием всего языка.

С такими макросами вы могли (если вы действительно умный хакер) значительно расширить язык, и каждый мог бы использовать его относительно легко, поскольку вы делали это с макросами. Взять, к примеру, Common Lisp Object System. По своей сути язык не имеет ничего общего даже с объектами. Он полностью реализован на самом языке, включая относительно простой синтаксис для использования - с использованием макросов.

Конечно, макросы менее нужны, когда в языке есть большинство вещей, которые вы все хотели бы встроить. OTOH, поклонники LISP считают, что достаточно простой язык (LISP) с достаточно мощными возможностями метапрограммирования (макросы) лучше, так как новые концепции могут быть включены в язык без изменения спецификации или рабочих реализаций. Но наиболее убедительным примером использования макросов является область DSL. Ruby on Rails и другие ежедневно показывают, насколько полезными могут быть DSL. Да, в Ruby нет макросов, он просто использует количество синтаксиса Ruby. В других языках, или даже если синтаксис Ruby недостаточно гибок, вам нужны макросы или полноценный синтаксический анализатор / интерпретатор для реализации сложного DSL.

0 голосов
/ 31 июля 2010

Макросы действительно хороши только для двух вещей в C / C ++ и, как правило, должны быть последним средством (если вы можете сделать что-то без использования макросов, сделайте это).

  1. Создание новых синтаксических структур или абстракций, которые не существуют в языке.
  2. Устранение дублирования, особенно между вещами, которые должны синхронизироваться друг с другом.

Практически никогда не использовать макрос в качестве функции.

Вы также должны понимать, что макросы LISP не C / C ++ макросы.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...