Возвращаясь на круги своя....
От: c-smile Канада http://terrainformatica.com
Дата: 20.02.06 22:51
Оценка:
Здравствуйте, VladD2, Вы писали:

Как-то все это очень напоминает старый добрый Forth.

Собственно Forth это "натурально метапрограммныый" язык/система.

Форт-слова по мере поступления образуют проблемно ориентированный язык
и его компилятор.

Возврат к основам?

23.02.06 01:01: Ветка выделена из темы Возвращаясь на круги своя....
Автор: VladD2
Дата: 18.02.06
— VladD2
Re[2]: Возвращаясь на круги своя....
От: IT Россия linq2db.com
Дата: 20.02.06 23:00
Оценка: +1
Здравствуйте, c-smile, Вы писали:

CS>Возврат к основам?




C++ во многом вобрал идеи Смолтока и других ОО языков. Был ли это возврат к основам или реализация давно известных методик на качественно новом и доступном уровне?
... << RSDN@Home 1.2.0 alpha rev. 0>>
Если нам не помогут, то мы тоже никого не пощадим.
Re[3]: Возвращаясь на круги своя....
От: c-smile Канада http://terrainformatica.com
Дата: 21.02.06 05:57
Оценка: 12 (3) +4
Здравствуйте, IT, Вы писали:


CS>>Возврат к основам?


IT>C++ во многом вобрал идеи Смолтока и других ОО языков. Был ли это возврат к основам или реализация давно известных методик на качественно новом и доступном уровне?


Я о другом.
С точки зрения мета-програмизма Форт фактически идеален.

Может быть идеальный мета-язык и/или выполняемая среда
должна(ен) иметь вычислительную модель близкую к Форту?

Чего-то мне не сильно нравится (эстетически если хотите)
наличие двух фактически разных нотационных систем (макро и код)
со сложной системой вызовов этих макро (до и после AST).

То что технически грамотно должно быть как минимум красиво.
Я так думаю.
Re[4]: Возвращаясь на круги своя....
От: Lazy Cjow Rhrr Россия lj://_lcr_
Дата: 21.02.06 06:20
Оценка: :)
c-smile,

CS>То что технически грамотно должно быть как минимум красиво.

CS>Я так думаю.

Балл поставил исключительно за эту фразу
quicksort =: (($:@(<#[),(=#[),$:@(>#[)) ({~ ?@#)) ^: (1<#)
Re[4]: Возвращаясь на круги своя....
От: Oyster Украина https://github.com/devoyster
Дата: 21.02.06 07:53
Оценка: 4 (1)
Здравствуйте, c-smile, Вы писали:

CS>Я о другом.

CS>С точки зрения мета-програмизма Форт фактически идеален.

Ну... не уверен: Re[20]: Снова о Nemerle или профанация не пройдет :)
Автор: Oyster
Дата: 20.02.06


CS>Может быть идеальный мета-язык и/или выполняемая среда

CS>должна(ен) иметь вычислительную модель близкую к Форту?

И мы бы все тогда полюбили стеки со всей пролетарской ненавистью

CS>Чего-то мне не сильно нравится (эстетически если хотите)

CS>наличие двух фактически разных нотационных систем (макро и код)
CS>со сложной системой вызовов этих макро (до и после AST).

Благодаря этому язык сохраняет свой синтаксис.

Лирическое отступление: а зачем Nemerle вообще синтаксис? Вот тут все говорят — у Форта синтаксиса нет, у Лиспа нет... Да, это так, но нужен ли этот самый синтаксис? Ответ — да, нужен, потому что язык с C-like синтаксисом:

  1. Ближе людям, которые писали на C или C++. Собственно, Nemerle и рассчитан на тех, кто сейчас педалит на C#.
  2. Программы писать легче на языке, хоть немного похожем на человеческий. Похожий не словами и всякими там оборотами, а хотя бы последовательностью действий.
  3. Строки кода на языке с C-like синтаксисом несут больше информации. Их как бы легче читать, потому что они как бы описывают сами себя (может, это во мне императивщик говорит?).

Касательно #2 и #3 — давайте сравним те же Forth и Nemerle:

// Русский язык
Вася поехал за рыбой.

// Форт
ВАСЯ РЫБА ПОЕХАЛ-ЗА

// Немерле
вася.ПоехалЗа(Рыба)

А теперь давайте зарефакторим — выделим эту операцию в отдельный вызов:

// Форт
: РЫБАК РЫБА ПОЕХАЛ-ЗА ; \ человек -> человек поехал за рыбой

// Использование
ПЕТЯ РЫБАК

// Немерле (макрос)
macro Рыбак(человек)
{
  <[ $человек.ПоехалЗа(Рыба); ]>
}

// Использование
Рыбак(петя)

// При этом скомпилируется в код
петя.ПоехалЗа(Рыба)

Как видно, при объявлении нового слова на Форте приходится писать комментарий о состоянии стека до и после выполнения. Ибо нету в Форте другой возможности явно передавать параметры. И ещё кое-что — тут Форт-машина не будет осуществлять никаких проверок валидности слова на этапе его добавления, а на этапе выполнения можно вообще получить какую-то непонятную бяку.

В Немерле ситуация другая. Ежели Вася рыбачить не умеет, компилятор нам об этом скажет. При этом сам макрос скомпилируется безо всяких проблем. И заметь, как мы легко и изящно возвращаем из макроса кусок AST — запись фактически та же, что и при прямом вызове.

CS>То что технически грамотно должно быть как минимум красиво.

CS>Я так думаю.

Хмм... там всё вполне красиво. Попробуй немного попедалить на нём и оценишь.
Re[4]: Возвращаясь на круги своя....
От: eao197 Беларусь http://eao197.blogspot.com
Дата: 21.02.06 08:30
Оценка: +1 :)
Здравствуйте, c-smile, Вы писали:

CS>То что технически грамотно должно быть как минимум красиво.

CS>Я так думаю.

А еще интересно, появятся ли макросы, которые можно использовать в реализации макросов (или есть уже)? Т.е., если внутри макроса Рыбак используется макрос Рыба, то макрос Рыба влияет (производит AST) не на результат макроса Рыбак, а на сам макрос Рыбак. Ну если есть код и есть метакод, то будет ли мета-мета-код? Или мета-мета-мета-код?


SObjectizer: <микро>Агентно-ориентированное программирование на C++.
Re[5]: Возвращаясь на круги своя....
От: Дарней Россия  
Дата: 21.02.06 08:54
Оценка: :)
Здравствуйте, eao197, Вы писали:

E>А еще интересно, появятся ли макросы, которые можно использовать в реализации макросов (или есть уже)? Т.е., если внутри макроса Рыбак используется макрос Рыба, то макрос Рыба влияет (производит AST) не на результат макроса Рыбак, а на сам макрос Рыбак. Ну если есть код и есть метакод, то будет ли мета-мета-код? Или мета-мета-мета-код?


Я думаю, лучше не надо. Ты хочешь резко поднять уровень заболеваемости шизофренией среди программистов?
... << RSDN@Home 1.1.4 stable rev. 510>>
Всех излечит, исцелит
добрый Ctrl+Alt+Delete
Re[5]: Возвращаясь на круги своя....
От: Oyster Украина https://github.com/devoyster
Дата: 21.02.06 08:57
Оценка: +1
Здравствуйте, eao197, Вы писали:

E>А еще интересно, появятся ли макросы, которые можно использовать в реализации макросов (или есть уже)? Т.е., если внутри макроса Рыбак используется макрос Рыба, то макрос Рыба влияет (производит AST) не на результат макроса Рыбак, а на сам макрос Рыбак. Ну если есть код и есть метакод, то будет ли мета-мета-код? Или мета-мета-мета-код?


Да прям щаз это всё есть:

macro Рыбак(человек)
{
    if (true)
        <[ $человек.ПоехалЗа(Рыба); ]>
    else
        <[ () ]>
}

Обратим внимание на то, что if — это тоже макрос
Re[6]: Возвращаясь на круги своя....
От: eao197 Беларусь http://eao197.blogspot.com
Дата: 21.02.06 09:02
Оценка:
Здравствуйте, Дарней, Вы писали:

Д>Я думаю, лучше не надо. Ты хочешь резко поднять уровень заболеваемости шизофренией среди программистов?


Нет
Но меня всегда удивляло, почему чаще всего есть только один уровень мета-? Бывают классы и метаклассы к ним. А вот метаклассов для метаклассов, как правило, нет... Как-то не справедливо
Хотя здесь и есть аналогия с попытками понять бесконечность вселенной... И тем, чем эти попытки иногда заканчиваются.

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


SObjectizer: <микро>Агентно-ориентированное программирование на C++.
Re[7]: Возвращаясь на круги своя....
От: Oyster Украина https://github.com/devoyster
Дата: 21.02.06 09:14
Оценка: 32 (3) +1
Здравствуйте, eao197, Вы писали:

E>Но если взглянуть на вопрос серьезнее. Неужели, при написании больших и сложных макросов не возникнет ситуация, когда в реализации макросов захочется использовать вспомогательные макросы?


Re[5]: Возвращаясь на круги своя....
Автор: Oyster
Дата: 21.02.06


На самом деле, в Nemerle макрос — это всего лишь функция, которая принимает куски AST на вход и выдаёт другие куски AST на выход. Но когда компилятор видит такую функцию, он не встраивает её вызов в код а вызывает её немедленно и вставляет полученный AST в код.

Следовательно, код макроса ничем не отличается от любого другого кода и в нём также можно использовать макросы безо всяких проблем, что и показывает практика. Единственное "но" — тебе самому прийдётся позаботиться о многопроходной компиляции — грубо говоря, так писать нельзя:

macro Macro1()
{
    <[ () ]>
}

macro Macro2()
{
    Macro1();
    <[ () ]>
}

Потому как Macro1 ещё не будет скомпилирован и не сможет быть использован при компиляции Macro2. Т.е. Macro1 должен быть в другой библиотеке, которая подсовывается компилятору при компиляции Macro2.
Re[5]: Возвращаясь на круги своя....
От: FR  
Дата: 21.02.06 09:43
Оценка:
Здравствуйте, Oyster, Вы писали:

O>Как видно, при объявлении нового слова на Форте приходится писать комментарий о состоянии стека до и после выполнения. Ибо нету в Форте другой возможности явно передавать параметры. И ещё кое-что — тут Форт-машина не будет осуществлять никаких проверок валидности слова на этапе его добавления, а на этапе выполнения можно вообще получить какую-то непонятную бяку.


Возможность осуществить проверку и на этапе добавления и при выполнении в форте есть, другое дело что при отсутствии типизации много не напроверяешь.
Да про обратную польскую запись не надо Форт достаточно гибкий язык чтобы легко реализовать обычную последовательность, для выражений как там сам раньше писал

Вообще макросы немерле вполне повторяют то что было в forth (тот же immediate mode)
Re[5]: Возвращаясь на круги своя....
От: VladGalkin Украина  
Дата: 21.02.06 09:48
Оценка:
Здравствуйте, 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
... << RSDN@Home 1.1.4 stable rev. 510>>
ДЭ!
Re[5]: Возвращаясь на круги своя....
От: Quintanar Россия  
Дата: 21.02.06 09:56
Оценка:
Здравствуйте, eao197, Вы писали:

E>Здравствуйте, c-smile, Вы писали:


CS>>То что технически грамотно должно быть как минимум красиво.

CS>>Я так думаю.

E>А еще интересно, появятся ли макросы, которые можно использовать в реализации макросов (или есть уже)? Т.е., если внутри макроса Рыбак используется макрос Рыба, то макрос Рыба влияет (производит AST) не на результат макроса Рыбак, а на сам макрос Рыбак. Ну если есть код и есть метакод, то будет ли мета-мета-код? Или мета-мета-мета-код?


Не понял юмора. Кто мешает применять макросы в макросах, собственно? Без этой возможности они теряют 99% своей привлекательности.
Re[7]: Возвращаясь на круги своя....
От: Quintanar Россия  
Дата: 21.02.06 09:59
Оценка: +1
Здравствуйте, eao197, Вы писали:

E>Но меня всегда удивляло, почему чаще всего есть только один уровень мета-? Бывают классы и метаклассы к ним. А вот метаклассов для метаклассов, как правило, нет... Как-то не справедливо

E>Хотя здесь и есть аналогия с попытками понять бесконечность вселенной... И тем, чем эти попытки иногда заканчиваются.

E>Но если взглянуть на вопрос серьезнее. Неужели, при написании больших и сложных макросов не возникнет ситуация, когда в реализации макросов захочется использовать вспомогательные макросы?


У тебя неправильная аналогия. Макросы надо сравнивать с функциями — если мы можем использовать функции 2-го порядка, т.е. функции которые принимают как аргумент или возвращают функции 1-го порядка, то мы можем использовать функции какого угодно порядка. Если Nemerle не позволяет использовать макросы в макросах, то это его серьезный минус, просто гигантский минусище, я бы сказал.
Re[7]: Возвращаясь на круги своя....
От: CrazyPit  
Дата: 21.02.06 15:11
Оценка:
Здравствуйте, eao197, Вы писали:

E>Здравствуйте, Дарней, Вы писали:


E>Но если взглянуть на вопрос серьезнее. Неужели, при написании больших и сложных макросов не возникнет ситуация, когда в реализации макросов захочется использовать вспомогательные макросы?


Конечно возникает, но с этим нужно быть ещё осторожнее чем с макросами.

вот например:
http://www.bookshelf.jp/texi/onlisp/onlisp_17.html

Кстати как с этим в немерле?
Re[6]: Возвращаясь на круги своя....
От: eao197 Беларусь http://eao197.blogspot.com
Дата: 21.02.06 15:21
Оценка:
Здравствуйте, Quintanar, Вы писали:

Q>Не понял юмора. Кто мешает применять макросы в макросах, собственно?


Незнание. Которое хорошо Oyster развеял
Автор: Oyster
Дата: 21.02.06
. В особенности про то, что макросы должны находиться в разных макропакетах.


SObjectizer: <микро>Агентно-ориентированное программирование на C++.
Re[6]: Возвращаясь на круги своя....
От: c-smile Канада http://terrainformatica.com
Дата: 22.02.06 01:05
Оценка:
Здравствуйте, Дарней, Вы писали:

Д>Я думаю, лучше не надо. Ты хочешь резко поднять уровень заболеваемости шизофренией среди программистов?


Только пробив крышу. Дальше некуда.
Re[7]: Возвращаясь на круги своя....
От: VladD2 Российская Империя www.nemerle.org
Дата: 22.02.06 02:11
Оценка:
Здравствуйте, eao197, Вы писали:

E>Незнание. Которое хорошо Oyster развеял
Автор: Oyster
Дата: 21.02.06
. В особенности про то, что макросы должны находиться в разных макропакетах.


Вообще-то макросы компилируются с помощью гтовых макросов. Так что их можно применять и для самораскртуки. Именно так и делают Нэмереловцы. Ниже приведен кусок неприрывно идущий в файле core.n. Обрати внимание, что одни макросы используют другие:
/** this macro provides convenient way to write a simple while loop,
        which performs execution of [body] parameter as long as
        [condition] is true
    */
macro @while (cond, body)
syntax ("while", "(", cond, ")", body) 
{
    def loop = Nemerle.Macros.Symbol (Util.tmpname ("while_"));

    <[ 
        $(PT.Name.Global ("_N_break") : name) : {
            def $(loop : name) () : void {
                when ($cond) {
                    $(PT.Name.Global ("_N_continue") : name) : {
                        $body 
                    } 
                    $(loop : name) ()
                }
            } 
            $(loop : name) (); 
        }
    ]>
}


macro repeatmacro (times, body)
syntax ("repeat", "(", times, ")", body)
{
    <[ for(mutable t = $times; t > 0;--t) $body ]>
}


/** shortcut for [if (cond) body else ()] */
macro whenmacro (cond, body)
syntax ("when", "(", cond, ")", body) 
{
    <[ match ($cond) { | true => $body : void | _ => () } ]>
}

macro @for (init, cond, change, body)
syntax ("for", "(", Optional (init), ";", Optional (cond), ";",
                Optional (change), ")", body) 
{
    def init = if (init != null) init else <[ () ]>;
    def cond = if (cond != null) cond else <[ true ]>;
    def change = if (change != null) change else <[ () ]>;    

    def loop = Nemerle.Macros.Symbol (Util.tmpname ("for_"));
    
    <[ 
        $init;
        $(PT.Name.Global ("_N_break") : name) : {
            def $(loop : name) () : void {
                when ($cond) {
                    $(PT.Name.Global ("_N_continue") : name) : {
                        $body
                    }
                    $change; 
                    $(loop : name) ()
                }
            }
            $(loop : name) ();
        }
    ]>
}


Вот чего я пока не понял, так это можно ли применить макросы применяемые как атрибуты при генерации новых типов. Тогда АВК-шный пример занял бы пару строк, так как свойства можно генерировать атрибутом [Accessor]. А сгенерировать конструктор для полей атрибутом [Record]. Чесно говоря имея эти два атрибута и сама задача то не сильно интересной становится, но все же.
... << RSDN@Home 1.2.0 alpha rev. 637>>
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[8]: Возвращаясь на круги своя....
От: VladD2 Российская Империя www.nemerle.org
Дата: 22.02.06 02:11
Оценка:
Здравствуйте, Oyster, Вы писали:

O>Следовательно, код макроса ничем не отличается от любого другого кода и в нём также можно использовать макросы безо всяких проблем, что и показывает практика. Единственное "но" — тебе самому прийдётся позаботиться о многопроходной компиляции — грубо говоря, так писать нельзя:


Вопрос... А можно ли как-то Нэмерел заставить отработать макросы задаваемые атрибутами на динамически создаваемых классах? Ну, к примеру, генерируя класс:
def cls = <[ decl: [Record] public class $(className.ToString() : usesite) { } ]>;

хочется, чтобы макрос [Record] генерировал конструктор для класса. Пока что у меня не удалось это дело применить.

Это невозможно в принципе? Или я что-то недопонял?
... << RSDN@Home 1.2.0 alpha rev. 637>>
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[8]: Возвращаясь на круги своя....
От: VladD2 Российская Империя www.nemerle.org
Дата: 22.02.06 02:11
Оценка:
Здравствуйте, Quintanar, Вы писали:

Q>У тебя неправильная аналогия. Макросы надо сравнивать с функциями — если мы можем использовать функции 2-го порядка, т.е. функции которые принимают как аргумент или возвращают функции 1-го порядка, то мы можем использовать функции какого угодно порядка. Если Nemerle не позволяет использовать макросы в макросах, то это его серьезный минус, просто гигантский минусище, я бы сказал.


Исползовать макросы внутри других макросов он может. Но вот принимать и возвращать их в качестве параметров прохоже не может.
... << RSDN@Home 1.2.0 alpha rev. 637>>
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.