Здравствуйте, c-smile, Вы писали:
CS>Возврат к основам?
C++ во многом вобрал идеи Смолтока и других ОО языков. Был ли это возврат к основам или реализация давно известных методик на качественно новом и доступном уровне?
... << RSDN@Home 1.2.0 alpha rev. 0>>
Если нам не помогут, то мы тоже никого не пощадим.
CS>>Возврат к основам?
IT>C++ во многом вобрал идеи Смолтока и других ОО языков. Был ли это возврат к основам или реализация давно известных методик на качественно новом и доступном уровне?
Я о другом.
С точки зрения мета-програмизма Форт фактически идеален.
Может быть идеальный мета-язык и/или выполняемая среда
должна(ен) иметь вычислительную модель близкую к Форту?
Чего-то мне не сильно нравится (эстетически если хотите)
наличие двух фактически разных нотационных систем (макро и код)
со сложной системой вызовов этих макро (до и после AST).
То что технически грамотно должно быть как минимум красиво.
Я так думаю.
CS>Может быть идеальный мета-язык и/или выполняемая среда CS>должна(ен) иметь вычислительную модель близкую к Форту?
И мы бы все тогда полюбили стеки со всей пролетарской ненавистью
CS>Чего-то мне не сильно нравится (эстетически если хотите) CS>наличие двух фактически разных нотационных систем (макро и код) CS>со сложной системой вызовов этих макро (до и после AST).
Благодаря этому язык сохраняет свой синтаксис.
Лирическое отступление: а зачем Nemerle вообще синтаксис? Вот тут все говорят — у Форта синтаксиса нет, у Лиспа нет... Да, это так, но нужен ли этот самый синтаксис? Ответ — да, нужен, потому что язык с C-like синтаксисом:
Ближе людям, которые писали на C или C++. Собственно, Nemerle и рассчитан на тех, кто сейчас педалит на C#.
Программы писать легче на языке, хоть немного похожем на человеческий. Похожий не словами и всякими там оборотами, а хотя бы последовательностью действий.
Строки кода на языке с C-like синтаксисом несут больше информации. Их как бы легче читать, потому что они как бы описывают сами себя (может, это во мне императивщик говорит?).
Касательно #2 и #3 — давайте сравним те же Forth и Nemerle:
// Русский язык
Вася поехал за рыбой.
// Форт
ВАСЯ РЫБА ПОЕХАЛ-ЗА
// Немерле
вася.ПоехалЗа(Рыба)
А теперь давайте зарефакторим — выделим эту операцию в отдельный вызов:
// Форт
: РЫБАК РЫБА ПОЕХАЛ-ЗА ; \ человек -> человек поехал за рыбой
// Использование
ПЕТЯ РЫБАК
// Немерле (макрос)
macro Рыбак(человек)
{
<[ $человек.ПоехалЗа(Рыба); ]>
}
// Использование
Рыбак(петя)
// При этом скомпилируется в код
петя.ПоехалЗа(Рыба)
Как видно, при объявлении нового слова на Форте приходится писать комментарий о состоянии стека до и после выполнения. Ибо нету в Форте другой возможности явно передавать параметры. И ещё кое-что — тут Форт-машина не будет осуществлять никаких проверок валидности слова на этапе его добавления, а на этапе выполнения можно вообще получить какую-то непонятную бяку.
В Немерле ситуация другая. Ежели Вася рыбачить не умеет, компилятор нам об этом скажет. При этом сам макрос скомпилируется безо всяких проблем. И заметь, как мы легко и изящно возвращаем из макроса кусок AST — запись фактически та же, что и при прямом вызове.
CS>То что технически грамотно должно быть как минимум красиво. CS>Я так думаю.
Хмм... там всё вполне красиво. Попробуй немного попедалить на нём и оценишь.
Здравствуйте, c-smile, Вы писали:
CS>То что технически грамотно должно быть как минимум красиво. CS>Я так думаю.
А еще интересно, появятся ли макросы, которые можно использовать в реализации макросов (или есть уже)? Т.е., если внутри макроса Рыбак используется макрос Рыба, то макрос Рыба влияет (производит AST) не на результат макроса Рыбак, а на сам макрос Рыбак. Ну если есть код и есть метакод, то будет ли мета-мета-код? Или мета-мета-мета-код?
SObjectizer: <микро>Агентно-ориентированное программирование на C++.
Здравствуйте, eao197, Вы писали:
E>А еще интересно, появятся ли макросы, которые можно использовать в реализации макросов (или есть уже)? Т.е., если внутри макроса Рыбак используется макрос Рыба, то макрос Рыба влияет (производит AST) не на результат макроса Рыбак, а на сам макрос Рыбак. Ну если есть код и есть метакод, то будет ли мета-мета-код? Или мета-мета-мета-код?
Я думаю, лучше не надо. Ты хочешь резко поднять уровень заболеваемости шизофренией среди программистов?
Здравствуйте, eao197, Вы писали:
E>А еще интересно, появятся ли макросы, которые можно использовать в реализации макросов (или есть уже)? Т.е., если внутри макроса Рыбак используется макрос Рыба, то макрос Рыба влияет (производит AST) не на результат макроса Рыбак, а на сам макрос Рыбак. Ну если есть код и есть метакод, то будет ли мета-мета-код? Или мета-мета-мета-код?
Здравствуйте, Дарней, Вы писали:
Д>Я думаю, лучше не надо. Ты хочешь резко поднять уровень заболеваемости шизофренией среди программистов?
Нет
Но меня всегда удивляло, почему чаще всего есть только один уровень мета-? Бывают классы и метаклассы к ним. А вот метаклассов для метаклассов, как правило, нет... Как-то не справедливо
Хотя здесь и есть аналогия с попытками понять бесконечность вселенной... И тем, чем эти попытки иногда заканчиваются.
Но если взглянуть на вопрос серьезнее. Неужели, при написании больших и сложных макросов не возникнет ситуация, когда в реализации макросов захочется использовать вспомогательные макросы?
SObjectizer: <микро>Агентно-ориентированное программирование на C++.
Здравствуйте, eao197, Вы писали:
E>Но если взглянуть на вопрос серьезнее. Неужели, при написании больших и сложных макросов не возникнет ситуация, когда в реализации макросов захочется использовать вспомогательные макросы?
На самом деле, в Nemerle макрос — это всего лишь функция, которая принимает куски AST на вход и выдаёт другие куски AST на выход. Но когда компилятор видит такую функцию, он не встраивает её вызов в код а вызывает её немедленно и вставляет полученный AST в код.
Следовательно, код макроса ничем не отличается от любого другого кода и в нём также можно использовать макросы безо всяких проблем, что и показывает практика. Единственное "но" — тебе самому прийдётся позаботиться о многопроходной компиляции — грубо говоря, так писать нельзя:
Потому как Macro1 ещё не будет скомпилирован и не сможет быть использован при компиляции Macro2. Т.е. Macro1 должен быть в другой библиотеке, которая подсовывается компилятору при компиляции Macro2.
Здравствуйте, Oyster, Вы писали:
O>Как видно, при объявлении нового слова на Форте приходится писать комментарий о состоянии стека до и после выполнения. Ибо нету в Форте другой возможности явно передавать параметры. И ещё кое-что — тут Форт-машина не будет осуществлять никаких проверок валидности слова на этапе его добавления, а на этапе выполнения можно вообще получить какую-то непонятную бяку.
Возможность осуществить проверку и на этапе добавления и при выполнении в форте есть, другое дело что при отсутствии типизации много не напроверяешь.
Да про обратную польскую запись не надо Форт достаточно гибкий язык чтобы легко реализовать обычную последовательность, для выражений как там сам раньше писал
Вообще макросы немерле вполне повторяют то что было в forth (тот же immediate mode)
Здравствуйте, eao197, Вы писали:
E>А еще интересно, появятся ли макросы, которые можно использовать в реализации макросов (или есть уже)? Т.е., если внутри макроса Рыбак используется макрос Рыба, то макрос Рыба влияет (производит AST) не на результат макроса Рыбак, а на сам макрос Рыбак. Ну если есть код и есть метакод, то будет ли мета-мета-код? Или мета-мета-мета-код?
Собственно, вот что пишут в документе "Meta-programming in Nemerle" о метапрограммировании:
During this process programs are treated as object programs, which are data
supplied to meta-programs. They can be then arbitrarily transformed or analyzed
and the Final result is compiled just like a regular program. These operations may
be repeated or take place in stages. In the latter case the generated programs
can generate other programs and so on.
И тут можно сказать так: Great fleas have little fleas upon their backs to bite 'em,
And little fleas have lesser fleas, and so ad infinitum.
And the great fleas themselves, in turn, have greater fleas to go on;
While these again have greater still, and greater still, and so on. De Morgan: A Budget of Paradoxes
Здравствуйте, eao197, Вы писали:
E>Здравствуйте, c-smile, Вы писали:
CS>>То что технически грамотно должно быть как минимум красиво. CS>>Я так думаю.
E>А еще интересно, появятся ли макросы, которые можно использовать в реализации макросов (или есть уже)? Т.е., если внутри макроса Рыбак используется макрос Рыба, то макрос Рыба влияет (производит AST) не на результат макроса Рыбак, а на сам макрос Рыбак. Ну если есть код и есть метакод, то будет ли мета-мета-код? Или мета-мета-мета-код?
Не понял юмора. Кто мешает применять макросы в макросах, собственно? Без этой возможности они теряют 99% своей привлекательности.
Здравствуйте, eao197, Вы писали:
E>Но меня всегда удивляло, почему чаще всего есть только один уровень мета-? Бывают классы и метаклассы к ним. А вот метаклассов для метаклассов, как правило, нет... Как-то не справедливо E>Хотя здесь и есть аналогия с попытками понять бесконечность вселенной... И тем, чем эти попытки иногда заканчиваются.
E>Но если взглянуть на вопрос серьезнее. Неужели, при написании больших и сложных макросов не возникнет ситуация, когда в реализации макросов захочется использовать вспомогательные макросы?
У тебя неправильная аналогия. Макросы надо сравнивать с функциями — если мы можем использовать функции 2-го порядка, т.е. функции которые принимают как аргумент или возвращают функции 1-го порядка, то мы можем использовать функции какого угодно порядка. Если Nemerle не позволяет использовать макросы в макросах, то это его серьезный минус, просто гигантский минусище, я бы сказал.
Здравствуйте, eao197, Вы писали:
E>Здравствуйте, Дарней, Вы писали:
E>Но если взглянуть на вопрос серьезнее. Неужели, при написании больших и сложных макросов не возникнет ситуация, когда в реализации макросов захочется использовать вспомогательные макросы?
Конечно возникает, но с этим нужно быть ещё осторожнее чем с макросами.
. В особенности про то, что макросы должны находиться в разных макропакетах.
Вообще-то макросы компилируются с помощью гтовых макросов. Так что их можно применять и для самораскртуки. Именно так и делают Нэмереловцы. Ниже приведен кусок неприрывно идущий в файле core.n. Обрати внимание, что одни макросы используют другие:
Вот чего я пока не понял, так это можно ли применить макросы применяемые как атрибуты при генерации новых типов. Тогда АВК-шный пример занял бы пару строк, так как свойства можно генерировать атрибутом [Accessor]. А сгенерировать конструктор для полей атрибутом [Record]. Чесно говоря имея эти два атрибута и сама задача то не сильно интересной становится, но все же.
... << RSDN@Home 1.2.0 alpha rev. 637>>
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Здравствуйте, Oyster, Вы писали:
O>Следовательно, код макроса ничем не отличается от любого другого кода и в нём также можно использовать макросы безо всяких проблем, что и показывает практика. Единственное "но" — тебе самому прийдётся позаботиться о многопроходной компиляции — грубо говоря, так писать нельзя:
Вопрос... А можно ли как-то Нэмерел заставить отработать макросы задаваемые атрибутами на динамически создаваемых классах? Ну, к примеру, генерируя класс:
Здравствуйте, Quintanar, Вы писали:
Q>У тебя неправильная аналогия. Макросы надо сравнивать с функциями — если мы можем использовать функции 2-го порядка, т.е. функции которые принимают как аргумент или возвращают функции 1-го порядка, то мы можем использовать функции какого угодно порядка. Если Nemerle не позволяет использовать макросы в макросах, то это его серьезный минус, просто гигантский минусище, я бы сказал.
Исползовать макросы внутри других макросов он может. Но вот принимать и возвращать их в качестве параметров прохоже не может.
... << RSDN@Home 1.2.0 alpha rev. 637>>
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.