Здравствуйте, Дарней, Вы писали:
Д>А в плюсах не так, что ли?
А при чем здесь плюсы? В плюсах вообще нет возможностей, предоставляемых Nemerle.
Д>Давайте лучше временно придушим свою страсть к критиканству, и подумаем, как можно решить эту проблему лучше. Я полагаю, разработчики языка будут рады любым дельным предложениям.
+1
Так же к этому предложению я бы добавил прекратить выискивать в данном обсуждении противников Nemerle.
Д>Другой вариант — это разграничивать область действия макросов в явном виде, когда это необходимо.
Эти области могут сильно пересекаться и твое решение не будет работать. Так, я пытался приводить пример описания класса агента:
agent_class LoadBalancer
message MsgAddNode
{ /* Здесь должно быть описание класса MsgAddNode. */
// Для описания какой-то части потребовалось воспользоваться средствами другого макропакета.autosubscribe NodeListMonitor;
...
}
event EvtAddNode( m : MsgAddNode )
{
// В реализации метода так же могут потребоваться другие макропакеты.
} autosubscribe MsgAddNode priority 0;
Д>Есть еще идеи?
1. Позволять использовать квалифицированное имя для расширений синтаксиса в случае конфликтов:
agent_class LoadBalancer
message MsgAddNode
{ /* Здесь должно быть описание класса MsgAddNode. */
// Для описания какой-то части потребовалось воспользоваться средствами другого макропакета.alien.autosubscribe NodeListMonitor;
...
}
event EvtAddNode( m : MsgAddNode )
{
// В реализации метода так же могут потребоваться другие макропакеты.
} sobjectizer.autosubscribe MsgAddNode priority 0;
Причем, чтобы достаточно было указать минимально различимое имя (не полное, которое может быть очень длинным).
В качестве альтернативного синтаксиса для указания квалифицированного имени
autosubscribe#sobjectizer MsgAddNode ...;
2. Позволить ввести псевдонимы для ключевых слов.
alias autosubscribe from Macro.Library.Alien to msg_subscribe;
alias autosubscribe from SObjectizer.Macro.Library to event_subscribe;
agent_class LoadBalancer
message MsgAddNode
{ /* Здесь должно быть описание класса MsgAddNode. */
// Для описания какой-то части потребовалось воспользоваться средствами другого макропакета.msg_subscribe NodeListMonitor;
...
}
event EvtAddNode( m : MsgAddNode )
{
// В реализации метода так же могут потребоваться другие макропакеты.
} event_subscribe MsgAddNode priority 0;
И ограничить область действия alias-ов.
SObjectizer: <микро>Агентно-ориентированное программирование на C++.
Re[27]: Снова о Nemerle или профанация не пройдет :)
Здравствуйте, IT, Вы писали:
IT>Это уже откровенные придирки.
Это не придирки. Это способ показать, что мне не навится предложенное решение.
Хотя бы потому, что сначала могла быть куплена либа A и с ней не было проблем. Затем была куплена либо B, с которой так же не было проблем, пока кому-то не пришлось в одном месте объединить использование A и B. Когда здесь враперы делать? Сам же писал недавно про историю, когда в условиях цейтнота на косяки в конфигурации наткнулись. Хотел бы лично ты в таких условиях враперы для каких-то либ писать?
SObjectizer: <микро>Агентно-ориентированное программирование на C++.
Re[28]: Снова о Nemerle или профанация не пройдет :)
Здравствуйте, IT, Вы писали:
IT>3. MS купит команду Nemerle и конкуренция будут происходить в самой MS.
Собственно, в доке "Meta-programming in Nemerle", нашел следующую сноску:
The Nemerle project is supported by Microsoft Research ROTOR2 grant.
Так что конкуренция и происходит среди разработчиков, спонсируемых MS.
... << RSDN@Home 1.1.4 stable rev. 510>>
ДЭ!
Re[15]: Снова о Nemerle или профанация не пройдет :)
Здравствуйте, Vermicious Knid, Вы писали:
VK>Пример я сначала написал на Nemerle, а затем перевел на C#. При этом функциональность не идентична. Так JunkFood в Nemerle сделан вариантом, а не перечислением. Использование перечисления сделало бы код даже более кратким, но менее расширяемым(к варианту достаточно легко можно добавить различные свойства и методы). Еще в C# версии вместо списков массивы, но заменить списки массивами в Nemerle очень легко(размер програмы увеличится незначительно, просто со списками чуть-чуть красивее). А так програмы выдают в консоль один и тот же текст. По идее по коду должно быть достаточно легко понятно, что он делает. Но если что непонятно — спрашивайте.
VK>Сначала код на C#(133 строки, 3181 символ):
/.../ VK>Теперь Nemerle(93 строки, 2220 символов, ~ в 1.4 раза меньше по обоим параметрам):
/.../
Ключевое слово — выделено. Даже в С#, как и в других (квази)-ООЯ, можно воспользоваться встроенными механизмами для сокращения всех этих switch. Например (это скорее непроверенный псевдо-код, к модификаторам доступа и типам попрошу не придираться):
class Currency {
static public Currency UAH = new Currency("UAH", 1.0);
static public Currency USD = new Currency("USD", 5.05);
static public Currency EUR = new Currency("EUR", 6.06);
Decimal rate;
String isoName;
public Currency(String isoName, Decimal rate) {
this.isoName = isoName;
this.rate = rate;
}
public ToString() {
return isoName + "/" + rate;
}
}
class JankFood {
String name;
public JankFood(String name) {
this.name = name;
}
public ToString() {
return name;
}
}
class Price {
JunkFood food;
Currency currency;
Decimal amount;
public Price(JunkFood food, Currency currency, Decimal amount) {
this.food = food;
this.currency = currency;
this.amount = amount;
}
public Price ToCurrency(Currency newCurrency) {
return new Price(food, newCurrency, amount*currency.rate/newCurrency.rate);
}
public String ToString() {
return food.name + ": " + amount + " " + currency.isoName;
}
}
Тут я схалявил — просто отдельный класс для Price и для JunkFoodPrice мне писать лень. Идея понятна и без этого. Кстати, курсы не забиты гвоздями-сотками в код, но при желании можно сделать и это .
Я не знаю как ты считал строчки кода, но в любом случае, это лучше чем тот кусок спагетти, что привёл ты.
Здравствуйте, Andrei N.Sobchuck, Вы писали:
ANS>Я не знаю как ты считал строчки кода, но в любом случае, это лучше чем тот кусок спагетти, что привёл ты.
+1
Андрей, а ты мог бы этот же пример на Smalltalk написать? Хоть это и оффтопик в данной ветке, но лично мне очень интересно чистое ОО решение увидеть.
SObjectizer: <микро>Агентно-ориентированное программирование на C++.
Re[19]: Снова о Nemerle или профанация не пройдет :)
Y>Чем Вам A не параметр? Мне передан параметр A, я потребовал, чтобы он был INTEGER. Хотите узнавать а не требовать? TYPE-OF/CLASS-OF к Вашим услугам. Ы?
Нужно:
(mymacro 10) => ok
(mymacro (+ 1 2)) => ok
(mymacro "bla-bal") => error (причем во время распахивания макроса)
(mymacro (substr "bla-bla" :start 0 :end 2)) => error (причем во время распахивания макроса)
(mymacro (cosh (+ 1 2 3 (* 10 20))) => ok
(let ((x 10))
(declare (type number x))
(mymacro x))) => ok
(let ((x "bla-bla"))
(declare (type string x))
(mymacro x))) => error
Напишешь такое ?
Re[17]: Снова о Nemerle или профанация не пройдет :)
Здравствуйте, eao197, Вы писали:
ANS>>Я не знаю как ты считал строчки кода, но в любом случае, это лучше чем тот кусок спагетти, что привёл ты.
E>+1
E>Андрей, а ты мог бы этот же пример на Smalltalk написать? Хоть это и оффтопик в данной ветке, но лично мне очень интересно чистое ОО решение увидеть.
В конкретно данном случае, когда логики почти нет, а есть одни аксесоры, то код объектной модели такой же и будет Только без декларации типов, модификаторов и пр. (я там vitual забыл расставить). А разница могла бы быть в процессе разработки.
Здравствуйте, Andrei N.Sobchuck, Вы писали:
ANS>Ключевое слово — выделено. Даже в С#, как и в других (квази)-ООЯ, можно воспользоваться встроенными механизмами для сокращения всех этих switch. Например (это скорее непроверенный псевдо-код, к модификаторам доступа и типам попрошу не придираться).
Ты в состоянии читать внимательно? Я просил не приводить советов по улучшению кода, мне это даром не нужно.
Это не пример ООП/ООД и рефакторинга, это пример и сравнение switch/case и match. У меня не было цели решить конкретную задачу(у меня и задачи то не было). У меня была цель продемонстрировать конкретный синтаксис. В данном случае синтаксис match. Поверь мне я в состоянии самостоятельно отрефакторить этот код не хуже чем ты. Но просто суть в том, что в этом коде неважно, что конкретно делается, важно какими средствами.
Re[18]: Снова о Nemerle или профанация не пройдет :)
Здравствуйте, Vermicious Knid, Вы писали:
ANS>>Ключевое слово — выделено. Даже в С#, как и в других (квази)-ООЯ, можно воспользоваться встроенными механизмами для сокращения всех этих switch. Например (это скорее непроверенный псевдо-код, к модификаторам доступа и типам попрошу не придираться).
VK>Ты в состоянии читать внимательно? Я просил не приводить советов по улучшению кода, мне это даром не нужно.
VK>Это не пример ООП/ООД и рефакторинга, это пример и сравнение switch/case и match. У меня не было цели решить конкретную задачу(у меня и задачи то не было). У меня была цель продемонстрировать конкретный синтаксис. В данном случае синтаксис match. Поверь мне я в состоянии самостоятельно отрефакторить этот код не хуже чем ты. Но просто суть в том, что в этом коде неважно, что конкретно делается, важно какими средствами.
Сферический конь в вакууме? Ну-ну. Важно то, для чего какие средства есть.
Подсказка: паттерн-матчинг != switch/case. Соответсвенно, весь пример не репрезентативен. Что и было проиллюстрировано.
Здравствуйте, Andrei N.Sobchuck, Вы писали:
ANS>Сферический конь в вакууме? Ну-ну. Важно то, для чего какие средства есть.
Приведи свой пример. Хотя бы на Smalltalk, я его чуть-чуть знаю и попытаюсь переписать на Nemerle и C#. И чем больше будет логики тем лучше, голого ООП не нужно. Правда наверное Smalltalk по краткости вполне может дать фору обоим, но все равно интересно будет сравнить.
ANS>Подсказка: паттерн-матчинг != switch/case. Соответсвенно, весь пример не репрезентативен. Что и было проиллюстрировано.
Подсказка: В Nemerle паттерн-мэтчинг == switch/case. Пример демонстрирует то с каким успехом паттерн-мэтчинг в Nemerle заменяет и switch/case, и if/else(который в отличие от switch/case в языке все же есть), и некоторые другие конструкции.
Согласись, что то что на C# выглядит просто отвратительно(в каком-то смысле я намеренно писал плохой код) на Nemerle выглядит намного читабельнее. Опять таки легче провести рефакторинг Nemerle кода, просто потому, что смысл более понятен.
Re[19]: Снова о Nemerle или профанация не пройдет :)
ANS> Проще новый язык разработать без старого багажа.
Не, ну, нужно все же более трезво смотреть на реальность. Что проще? Он уже есть!
ANS> Типа Z#, а C# объявить устаревшим Это как раз вписывается в популярную в нынешней индустрии схему "раз в пять-сем лет — новый язык".
Дык есть C# 1.х, есть C# 2.х, и будет C# 3.х. Это три разных языка имеющие обратную совместимость сверху вниз. При этом ты можешь писать на C# 1.х используя компилятор и среду от 3.х. Что еще нужно? Тебя же никто не заставляет использовать неудобные или непонятные по твоему мнению констркции?
И вот через полгода, мы узнаём, что C#3 устарел, смысла ждать C#4 нет и вообще. С буковкой я, конечно, ошибся, но использование "N" вместо "Z" вполне логично — остаётся еще куча буковок на развитие.
Здравствуйте, Vermicious Knid, Вы писали:
VK>Приведи свой пример. Хотя бы на Smalltalk, я его чуть-чуть знаю и попытаюсь переписать на Nemerle и C#. И чем больше будет логики тем лучше, голого ООП не нужно. Правда наверное Smalltalk по краткости вполне может дать фору обоим, но все равно интересно будет сравнить.
Я же и привёл. Вот его и нужно сравнивать с Nemerle.
ANS>>Подсказка: паттерн-матчинг != switch/case. Соответсвенно, весь пример не репрезентативен. Что и было проиллюстрировано.
VK>Подсказка: В Nemerle паттерн-мэтчинг == switch/case.
В любом источнике, где объясняется сопоставление с образцом, сказано, что он используется для разложения типа на составляющие.
Вот тебе ссылка с сайта Nemerle:
Matching is a way of destructuring complex data structures
Доступ к составляющим сложного типа это никак не область применения switch. Для этой цели используются объекты+методы.
VK>Пример демонстрирует то с каким успехом паттерн-мэтчинг в Nemerle заменяет и switch/case, и if/else(который в отличие от switch/case в языке все же есть), и некоторые другие конструкции.
Я не спорю, что припомощи набора if & goto можно смоделировать вызов процедур, но это не значит, что вызов процедур == if.
VK>Согласись, что то что на C# выглядит просто отвратительно(в каком-то смысле я намеренно писал плохой код)
"На любом языке можно писать как на Фортране" (с).
VK> на Nemerle выглядит намного читабельнее. Опять таки легче провести рефакторинг Nemerle кода, просто потому, что смысл более понятен.
Твой пример нормальный. Только его нужно писать с помощью родных средств C#. Вот еще вариант — функциональщики обычно хвастаются с какой лёгкостью делаются деревья на pattern matching. Вот и нужно сделать дерево на простое объектах и на pattern-matching.
Здравствуйте, Andrei N.Sobchuck, Вы писали:
ANS>Всё равно прийдёт Влад и скажет, что в ST невозможно сделать intellisens, а значит там нет ничего достойного внимания.
Очень часто можно не обращать внимания на Влада и его высказывания (в данной теме полно примеров). Но в том обсуждении ведь не только Влад участвовал
Я например, уже в этой теме, когда говорил, что для языка IDE -- это всего лишь инструмент, всегда хотел сделать комментарий, что Smalltalk в этом плане является исключением.
SObjectizer: <микро>Агентно-ориентированное программирование на C++.
Re[21]: Снова о Nemerle или профанация не пройдет :)
Здравствуйте, eao197, Вы писали:
E>Я например, уже в этой теме, когда говорил, что для языка IDE -- это всего лишь инструмент, всегда хотел сделать комментарий, что Smalltalk в этом плане является исключением.
Просто он изначально разрабатывался не как язык, не как библиотека, и не как ИДЕ, пусть и скриптуемая сама из себя, а как комплексная среда помогающая человеку. То есть вначале принципы, потом язык, стандартные библиотеки классов, оболочка. И всё это цельно увязано друг с другом. Можно писать и на ST без "живой" среды, например в emacs на Gnu ST. Но зачем?
Здравствуйте, Andrei N.Sobchuck, Вы писали:
ANS>Просто он изначально разрабатывался не как язык, не как библиотека, и не как ИДЕ, пусть и скриптуемая сама из себя, а как комплексная среда помогающая человеку. То есть вначале принципы, потом язык, стандартные библиотеки классов, оболочка. И всё это цельно увязано друг с другом. Можно писать и на ST без "живой" среды, например в emacs на Gnu ST. Но зачем?
Да, я в курсе, как раз недавно читал историю ST от Кея. Поэтому и не стал про ST ничего говорить, т.к. имхо, там все одно из другого выростало и не было бы ST без его среды и его среды без ST.
SObjectizer: <микро>Агентно-ориентированное программирование на C++.
Re[20]: Снова о Nemerle или профанация не пройдет :)
Здравствуйте, Andrei N.Sobchuck, Вы писали:
ANS>Я же и привёл. Вот его и нужно сравнивать с Nemerle.
Нет, это не то. К тому же на Nemerle можно это переписать один-в-один. Будет просто чуть короче, но абсолютно не интересно.
VK>>Подсказка: В Nemerle паттерн-мэтчинг == switch/case.
ANS>В любом источнике, где объясняется сопоставление с образцом, сказано, что он используется для разложения типа на составляющие.
На самом деле все гораздо банальнее. Сопоставление с образцом это именно сопоставления значения любого типа(не обязательно алгебраического или другой сложной структуры данных, можно и значения простых типов сопоставлять) с набором образцов. Образцы при этом вполне могут быть литералами. Сопоставление с образцом это в первую очередь абстракция, и в этом свете switch/case это не что иное как частный случай сопоставления с образцом. К тому же в Nemerle, да и в ряде других языков сопоставление с образцом как синтаксическая конструкция это нечто большее и распологает рядом дополнительных возможностей, например можно проверять предварительные условия(guards) или проверять типы(не деконструирую их).
ANS>Я не спорю, что припомощи набора if & goto можно смоделировать вызов процедур, но это не значит, что вызов процедур == if.
Нет, ты совершенно ничего не понял. В Nemerle вообще нет switch/case, равно как и if/else(который существует только в виде макроса). Все делается этим самым сопоставлением, при этом какой конкретно код сгенерируется зависит исключительно от случая и компилятора.
ANS>"На любом языке можно писать как на Фортране" (с).
Разница только в том, что на Nemerle можно писать в точности как на C#, но не наооборот.
ANS>Твой пример нормальный. Только его нужно писать с помощью родных средств C#. Вот еще вариант — функциональщики обычно хвастаются с какой лёгкостью делаются деревья на pattern matching. Вот и нужно сделать дерево на простое объектах и на pattern-matching.
Ну тогда это будет уже абсолютно несправедливо по отношению к C#. На этом примере он полностью сольет Nemerle, даже никакие ухищрения не помогут. Можно было бы простые лексер и парсер написать, но с ними та же история. Nemerle создавался как идеальный язык для написания компиляторов, вообще как язык на котором просто и легко будет написать компилятор самого Nemerle. Первый компилятор Nemerle, написанный на C#, если мне не изменяет память вообще не больше двух-трех месяцев прожил, они его еще до релиза первой публичной версии переписали(причем изначально в функциональном стиле с GADT, списками и прочей ерундой).
Re[21]: Снова о Nemerle или профанация не пройдет :)
Здравствуйте, Vermicious Knid, Вы писали:
VK>Нет, ты совершенно ничего не понял. В Nemerle вообще нет switch/case, равно как и if/else(который существует только в виде макроса). Все делается этим самым сопоставлением, при этом какой конкретно код сгенерируется зависит исключительно от случая и компилятора.
Мой point в том, что сравнивать switch с pettern matching это сверхупрощение.
ANS>>Твой пример нормальный. Только его нужно писать с помощью родных средств C#. Вот еще вариант — функциональщики обычно хвастаются с какой лёгкостью делаются деревья на pattern matching. Вот и нужно сделать дерево на простое объектах и на pattern-matching.
VK>Ну тогда это будет уже абсолютно несправедливо по отношению к C#. На этом примере он полностью сольет Nemerle, даже никакие ухищрения не помогут.
???. один класс с C#2 итератором полностью сольёт?