Re[15]: Типизатора Н2 – версия VladD2
От: VladD2 Российская Империя www.nemerle.org
Дата: 06.06.11 16:26
Оценка:
Здравствуйте, WolfHound, Вы писали:

WH>1)Переложить типизацию с пользователя на компилятор. Сейчас сложные макросы приходится типизировать руками.


Этого можно добиться смешением типизации до раскрытия с типизацией после раскрытия макроса.

WH>2)Дать ИДЕ всю информацию о коде. Это позволит получить автокомплит, навигацию итп для сложных ДСЛ полностью автоматом.


В смешанном режиме она так же будет.

S_S>> А сам запутанный процесс типизации-раскрытия макросов, где макросы друг в друга вложены, перемешаны, повязаны связями, он как-то изменится? И как пострадают от этого возможности?

WH>Это два разных процесса.

Глупо отбрасывать возможность раскрыть макросы и получить типизацию из коробки. А раз так, то это не два разных процесса, а части единого процесса.
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[16]: Типизатора Н2 – версия VladD2
От: VladD2 Российская Империя www.nemerle.org
Дата: 06.06.11 16:29
Оценка:
Здравствуйте, Silver_S, Вы писали:

S_S> Наложатся ли при этом такие ограничения? : Тип выражения которое вернет макрос, зависит только от типов входных параметров, но не от содержимого этих параметров (что конкретно там за дерево).

S_S>Например:
S_S>Если макросу приходит параметр(узел) "a:uint + b:uint" , и второй вариант "a:uint — b:uint", в обоих случаях a и b типа uint.
S_S>Можно ли будет сделать, чтобы в первом случае макрос вернул выражение типа uint, а во втором int ?
S_S>Т.е. чтобы то, как пойдет типизация, зависело от содержимого входного дерева, а не его типа?

Тип выражения определяется типизатором этого выражения. Для разных операторов код типизации, очевидно, должен быть разным.
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[17]: Типизатора Н2 – версия VladD2
От: VladD2 Российская Империя www.nemerle.org
Дата: 06.06.11 16:32
Оценка:
Здравствуйте, Silver_S, Вы писали:

S_S> Ну и будет куда приткнуть правильные сообщения об ошибках. В C# для LINQ по сообщениям об ошибках видно что MS сачконули, не полностью "Language Integrated". Для юзеров конечно было бы лучше полноценный LINQ. Только вот сколько времени его пришлось бы разрабатывать.


МС нигде не сочкавали. linq — это чистый синтаксический сахар. В спецификации записано, что он собственной семантики не имеет, а описывается в терминах паттерна query. Сделано это не от слабости духа, а для большей гибкости. Такое решение позволяет использовать query-паттерн для типов и методов которые еще не существовали в момент проектирования linq.
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[18]: Типизатора Н2 – версия VladD2
От: VladD2 Российская Империя www.nemerle.org
Дата: 06.06.11 16:33
Оценка: -1
Здравствуйте, WolfHound, Вы писали:

WH>Учитывая что они все пишут на С++ причем два раза(компилятор и ИДЕ)...

WH>У меня все уложится в несколько простых строк и один раз.

Мы уже неделю ждем когда ты сможешь написать эти несколько простых строк .
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[18]: Типизатора Н2 – версия VladD2
От: VladD2 Российская Империя www.nemerle.org
Дата: 06.06.11 16:37
Оценка:
Здравствуйте, Silver_S, Вы писали:

S_S>def d=Dictionary();

S_S>d[4] = MyMacro(d);

S_S>Допустим макросу зачем-то надо знать тип ключа у d (а тип значения тут естейственно неопределен т.к. зависит от самого макроса). Т.е. макросу надо наполовину типизированный Dictionary.

S_S>Макрос смотрит какого типа ключ у этого Dictionary, и в зависимости от этого возвращает значения разных типов либо int либо string (допустим если ключ типа byValue тогда вернуть 3, если тип reference то вернуть "a").

S_S> В Н1 сейчас такое можно?


Можно.

S_S>Если можно, то на какой стадии вызывать, после типизации? Но полностью все типизировать нельзя пока макрос не раскроется.


Н1 поддерживает отложенную типизацию. Ты просто типизируешь выражение как есть и откладываешь генерацию кода до момента когда тип станет известен.

S_S> Или это вредная фича, лишняя степень свободы, не нужная на практике, которую лучше заблокировать?


Очень даже нужная. Примером такого макроса является foreach который WolfHound так старательно не хочет показывать.
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[19]: Типизатора Н2 – версия VladD2
От: VladD2 Российская Империя www.nemerle.org
Дата: 06.06.11 16:57
Оценка:
Здравствуйте, WolfHound, Вы писали:

WH>Получается что-то типа такого:

WH>
WH>ast MyMacro : Expression
WH>syntax "MyMacro" "(" expr ")"
WH>{
WH>    expr : Expression;
WH>}
WH>typing
WH>{
WH>    Dictionary[key, _] = expr.Type;
WH>    Type = (key, key);
WH>}
WH>


Это какая-то фигня. В твоих терминах у тебя должно получиться что-то вроде:
typing
{
  def newKeyTypeVar = flesh();
  def newValTypeVar = flesh();

  // требуем чтобы expr.Type был подтипом Dictionary[_, _]
  expr.Type require Dictionary[newKeyTypeVar, newValTypeVar]; 

  // это должно выполнится только когда станет известен тип ключа
  if (newKeyTypeVar.IsValueType)
    newValTypeVar = int;
  else
    newValTypeVar = string;

  Type = newValTypeVar; // под "=" понимается Unify
}
rewrite // переписывание у тебя вообще не паказано, а по условиям задачи одно должно быть
{
  if (newKeyTypeVar.IsValueType) // дублирование проверки!
    <[ 3 ]>
  else
    <[ "a" ]>
}
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[20]: Типизатора Н2 – версия VladD2
От: VladD2 Российская Империя www.nemerle.org
Дата: 06.06.11 17:14
Оценка:
Здравствуйте, VladD2, Вы писали:

VD>Это какая-то фигня. В твоих терминах у тебя должно получиться что-то вроде:

VD>
VD>typing
VD>{
VD>  def newKeyTypeVar = flesh();
VD>  def newValTypeVar = flesh();

VD>  // требуем чтобы expr.Type был подтипом Dictionary[_, _]
VD>  expr.Type require Dictionary[newKeyTypeVar, newValTypeVar]; 

VD>  // это должно выполнится только когда станет известен тип ключа
VD>  if (newKeyTypeVar.IsValueType)
VD>    newValTypeVar = int;
VD>  else
VD>    newValTypeVar = string;

VD>  Type = newValTypeVar; // под "=" понимается Unify
VD>}
VD>rewrite // переписывание у тебя вообще не паказано, а по условиям задачи одно должно быть
VD>{
VD>  if (newKeyTypeVar.IsValueType) // дублирование проверки!
VD>    <[ 3 ]>
VD>  else
VD>    <[ "a" ]>
VD>}
VD>


А вот как тоже самое выглядело бы будучи реализовано в моем видении:
// для макросов имеющих синтаксис вызова синтаксис описывать не надо. 
// Параметры по умолчанию имеют тип Expression
macro MyMacro(expr) : Expression
  define types: keyTypeVar, valTypeVar; // описываем свежие типы (переменные типов)
  require: expr.Type subtype of Dictionary[keyTypeVar, valTypeVar];
  require: keyTypeVar unify valTypeVar // или keyTypeVar = valTypeVar
  require: keyTypeVar unify int || keyTypeVar unify string else Error("The type of 'expr' mast be string or int.")
{
  if (keyTypeVar.IsValueType) // проверка не дублируется!
    <[ 3 ]>
  else
    <[ "a" ]>
}
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[20]: Типизатора Н2 – версия VladD2
От: WolfHound  
Дата: 06.06.11 17:28
Оценка:
Здравствуйте, VladD2, Вы писали:

VD>Это какая-то фигня.

И кто-то тут постоянно удивляется что же с ним так не вежливо общаются.

VD>В твоих терминах у тебя должно получиться что-то вроде:

Это не в моих терминах, а в твоих.
Не нужно мне приписывать свои выдумки и с ним спорить.
... << RSDN@Home 1.2.0 alpha 4 rev. 1472>>
Пусть это будет просто:
просто, как только можно,
но не проще.
(C) А. Эйнштейн
Re[19]: Типизатора Н2 – версия VladD2
От: WolfHound  
Дата: 06.06.11 17:28
Оценка:
Здравствуйте, VladD2, Вы писали:

VD>Мы уже неделю ждем когда ты сможешь написать эти несколько простых строк .

Подождешь.
... << RSDN@Home 1.2.0 alpha 4 rev. 1472>>
Пусть это будет просто:
просто, как только можно,
но не проще.
(C) А. Эйнштейн
Re[19]: Типизатора Н2 – версия VladD2
От: WolfHound  
Дата: 06.06.11 17:28
Оценка:
Здравствуйте, VladD2, Вы писали:

S_S>>def d=Dictionary();

S_S>>d[4] = MyMacro(d);

S_S>> В Н1 сейчас такое можно?

VD>Можно.
Нельзя. Ты на код посмотри.

VD>Н1 поддерживает отложенную типизацию. Ты просто типизируешь выражение как есть и откладываешь генерацию кода до момента когда тип станет известен.

А тип не станет известен пока не сгенерируешь код.

VD>Очень даже нужная. Примером такого макроса является foreach который WolfHound так старательно не хочет показывать.

И что ты думаешь меня вот так можно затролить?
Думаешь, я подожму хвост и убегу в кусты?
Ну-ну.
... << RSDN@Home 1.2.0 alpha 4 rev. 1472>>
Пусть это будет просто:
просто, как только можно,
но не проще.
(C) А. Эйнштейн
Re[23]: Типизатора Н2 – версия VladD2
От: WolfHound  
Дата: 06.06.11 17:57
Оценка:
Здравствуйте, VladD2, Вы писали:

VD>Параметры макросов не связаны. У тебя есть три независимых выражения: var, collection и body.

VD>Ты собираешься создавать эту область видимости только для body?
Я собираюсь создать ее для всех.

VD>Но для body не просто имя нужно, а объявление переменной. Причем тип переменной вычисляется по разному в зависимости от типа collection.

Какой еще collection?
Мы про for говорим.

VD>Короче, покажи код. Уверен, что это будет ужасный код.

Это все твое больное воображение.
Автор: VladD2
Дата: 06.06.11


VD>Если есть лучшее — я не буду не против. Но во-первых, оно должно быть действительно лучше, а во-вторых, не должно быть лишних телодвижений для случаев когда комлит идет не по ДСЛ-ю, а по подвыражениям которые являются базовым языком или синтаксическим сахаром над ним.

Ты даже не пытаешься меня слушать.
В моем подходе вообще не будет телодвижений.
Ни одного. Разработчику синтаксического расширения никогда не нужно будет знать про автокомплит.
Все само заработает.

VD>А это не важно. Спецификации нужно тупо выполнять. Если дизайн твоего решения конфликтует с этим, то это проблемы твоего дизайна. С реалиями мира нужно считаться.

Он конфликтует только с твоими фантазиями.

VD>Иногда такие преобразования выигрывают от наложения дополнительны ограничений на типы (как в случае с if). Собственно даже linq выиграет от дополнительных проверок. Например, можно проверить если ли у коллекции методы в которые переписывается запрос

Ну, то есть ты тоже согласен, что мелкософт просто не осилил типизацию linq.

VD>Что-то я не пойму о чем ты. Расширяющий парсер просто встраивается в список приоритетного выбора базового парсера.

А про импорт правил из другой грамматики ты уже забыл?

WH>>Данный код срабатывает во время прарсинга, а пока все не разобрано список правил отдать нельзя.

VD>Ты несешь несуразицу. Разберись в проблеме, тогда поговорим. Доказывать тебе очевидные вещи вроде того что код комплита, в этом случае, должен вызываться из кода макроса я не намерен.
Ты прочитай, что я пишу.
А то у меня иногда возникают сомнения в том, что ты читать умеешь.
Попробую написать другими словами: Запустить автокомплит можно только после того как будет разобрана вся грамматика. Также не нужно забывать, что одна грамматика может ссылаться на другую и автокомплит по правилам другой грамматики тоже нужен, а порядок парсинга не определен.
Так что твое решение это эпик фейл.

WH>>1)Тормоза зависят от реализации.

VD>В первую очередь от алгоритма. Если он квадратичный, то ничего ты не сделаешь.
Это реализация.
Ты все еще путаешь модель вычислений и реализацию.
Есть ПЕГ. Это модель вычислений. Она ничего про асимптотику не знает.
Есть пакрат. Это один из вариантов реализации модели вычисления описанной ПЕГом.
Есть мой алгоритм. Это другая реализация модели вычислений ПЕГа.

VD>Он сразу учитывает подтипы и позволяет делать вывод икрементально. Плюс он компилированный и оптимизированный на конкретные нужды. Я обсуждал с Москалем идею использования универсального теорем-прувера. Москаль сказал, что специализированный алгоритм по любому будет быстрее, так как его можно будет оптимизировать под задачи. С этим трудно спорить.

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

VD>Ты предлагаешь их всюду вручную искать. Стало быть и в foreach. Я давно тебя прошу показать код foreach-а написанный в твоей идеологии.

Цитату про то где я предлагаю искать руками в студию.
И тебе уже раз сто сказал, что сейчас я работаю над обобщенным поиском имен.
Так что работать все будет автоматом.

WH>>2)Не заработает. В PegGrammar свой поиск имен.

VD>Он там вручную за 2 минуты на коленке пишется.
Языком.

VD>Это не интересный случай. Вот foreach — да.

А вот это совсем не интересно.

VD>Я тебе заранее сказал, что рассмотрим упрощенный случай. Случай паттерна еще сложнее, так что его лучше не рассматривать.

В моем подходе он идентичен. Совсем.

WH>>И он будет иметь свой тип.

WH>>Тип паттерна это словарь отражающий имя связанного значения в тип.
VD>Это какая-то чушь. Оставь паттерны. Твой паттерн в любом случае должен в переменную разложиться.
Ну и как с тобой разговаривать?
Ты исходишь из предположения, что я несу бред и даже не пытаешься думать о том что тебе говорят.
А ты подумай о том, что я написал.
Включи мозг для разнообразия.
Еще полезно перечитать это
Автор: WolfHound
Дата: 02.06.11
сообщение. Там показана работа с типом паттерна.
VD>Ну и зачем этот гимор? Ты сдублируешь часть типизации которая будет осуществляться над преобразованным кодом. При этом ты ровным счетом ничего не получишь. Зачем делать бессмысленные действия?
Это будет _одна_ строка кода.

VD>Код не получится идентичным. Ты собрался делать лишнюю работу. Сообщений никаких новых ты тоже не сможешь породить.

Ты умудряешься противоречить себе в одном сообщении:

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


VD>Еще один аспект, который нужно продумать, это вычисление отладочной информации.

Вот этому типизация SST уж точно никак не мешает.
Скорее на оборот.
... << RSDN@Home 1.2.0 alpha 4 rev. 1472>>
Пусть это будет просто:
просто, как только можно,
но не проще.
(C) А. Эйнштейн
Re[21]: Типизатора Н2 – версия VladD2
От: VladD2 Российская Империя www.nemerle.org
Дата: 06.06.11 18:55
Оценка:
Здравствуйте, WolfHound, Вы писали:

VD>>Это какая-то фигня.

WH>И кто-то тут постоянно удивляется что же с ним так не вежливо общаются.

VD>>В твоих терминах у тебя должно получиться что-то вроде:

WH>Это не в моих терминах, а в твоих.
WH>Не нужно мне приписывать свои выдумки и с ним спорить.

Можешь сам переформулировать в более приятных терминах, но то что ты описал смысла не имеет. Или ты забыл описать десять страниц документации.
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[20]: Типизатора Н2 – версия VladD2
От: VladD2 Российская Империя www.nemerle.org
Дата: 06.06.11 20:01
Оценка:
Здравствуйте, WolfHound, Вы писали:

WH>Здравствуйте, VladD2, Вы писали:


S_S>>>def d=Dictionary();

S_S>>>d[4] = MyMacro(d);

S_S>>> В Н1 сейчас такое можно?

VD>>Можно.
WH>Нельзя.

Ну, тут ты попался, так как все что касается Н1 можно легко проверить.

WH>Ты на код посмотри.


Не держи окружающих за идиотов. Я то как раз внимательно на код смотрел и внимательно читал его описание.

VD>>Н1 поддерживает отложенную типизацию. Ты просто типизируешь выражение как есть и откладываешь генерацию кода до момента когда тип станет известен.

WH>А тип не станет известен пока не сгенерируешь код.

Ты плохо знаешь Н1. Лучше бы послушал тех кто его знает пол лучше.

VD>>Очень даже нужная. Примером такого макроса является foreach который WolfHound так старательно не хочет показывать.

WH>И что ты думаешь меня вот так можно затролить?

Я троллингом не занимаюсь. Я говорю то что есть. У тебя была неделя чтобы показать пример. Примера нет. И совершенно очевидно, что не будет. Показывать гору трехэтажных наворотов ты постесняешься, а краткого и корректного решения у тебя не выйдет.

WH>Думаешь, я подожму хвост и убегу в кусты?

WH>Ну-ну.

У меня нет такой задачи.
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[24]: Типизатора Н2 – версия VladD2
От: VladD2 Российская Империя www.nemerle.org
Дата: 06.06.11 20:23
Оценка:
Здравствуйте, WolfHound, Вы писали:

VD>>Параметры макросов не связаны. У тебя есть три независимых выражения: var, collection и body.

VD>>Ты собираешься создавать эту область видимости только для body?
WH>Я собираюсь создать ее для всех.

Кто такие все? Область видимости нужна только для body.

VD>>Но для body не просто имя нужно, а объявление переменной. Причем тип переменной вычисляется по разному в зависимости от типа collection.

WH>Какой еще collection?
WH>Мы про for говорим.

Я описался. Смысл говорить про for нет. Там все просто. Речь конечно же про foreach.

VD>>Короче, покажи код. Уверен, что это будет ужасный код.

WH>Это все твое больное воображение.
Автор: VladD2
Дата: 06.06.11


Это у тебя больное воображение. Тебя просят показать код foreach. В прочем, вопрос риторический. Мы явно никогда его не увидим.

Кстати, что за хрень "Type = (key, key)"? Со здоровым воображением догадаться невозможно.

VD>>Если есть лучшее — я не буду не против. Но во-первых, оно должно быть действительно лучше, а во-вторых, не должно быть лишних телодвижений для случаев когда комлит идет не по ДСЛ-ю, а по подвыражениям которые являются базовым языком или синтаксическим сахаром над ним.

WH>Ты даже не пытаешься меня слушать.

Я то пытаюсь. Но ты повторяешь одно и тоже.

WH>В моем подходе вообще не будет телодвижений.


Оно и видно.

WH>Ни одного. Разработчику синтаксического расширения никогда не нужно будет знать про автокомплит.

WH>Все само заработает.

Да, да. 256 ведер и золотой ключик у нас в кармане. Не смешно.

VD>>А это не важно. Спецификации нужно тупо выполнять. Если дизайн твоего решения конфликтует с этим, то это проблемы твоего дизайна. С реалиями мира нужно считаться.

WH>Он конфликтует только с твоими фантазиями.

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

WH>>>Данный код срабатывает во время прарсинга, а пока все не разобрано список правил отдать нельзя.

VD>>Ты несешь несуразицу. Разберись в проблеме, тогда поговорим. Доказывать тебе очевидные вещи вроде того что код комплита, в этом случае, должен вызываться из кода макроса я не намерен.
WH>Ты прочитай, что я пишу.
WH>А то у меня иногда возникают сомнения в том, что ты читать умеешь.
WH>Попробую написать другими словами: Запустить автокомплит можно только после того как будет разобрана вся грамматика. Также не нужно забывать, что одна грамматика может ссылаться на другую и автокомплит по правилам другой грамматики тоже нужен, а порядок парсинга не определен.
WH>Так что твое решение это эпик фейл.

Что ты несешь? Еще раз по буквам "код комплита, в этом случае, должен вызываться из кода макроса". Макросы раскрываются не во время парсинга, а во время типизации. К этому моменту парсиг уже будет закончен.

WH>...И тебе уже раз сто сказал, что сейчас я работаю над обобщенным поиском имен.

WH>Так что работать все будет автоматом.

WH>Включи мозг для разнообразия.


Хамло.

VD>>Код не получится идентичным. Ты собрался делать лишнюю работу. Сообщений никаких новых ты тоже не сможешь породить.

WH>Ты умудряешься противоречить себе в одном сообщении:
WH>

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


Включай мозг (с) Тут нет противоречий. Одна проверка наличие метода (по имени, без деталей) не имеет ничего общего с типизацией всего выражения. Это даст только улучшение сообщений об ошибках.

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

VD>>Еще один аспект, который нужно продумать, это вычисление отладочной информации.

WH>Вот этому типизация SST уж точно никак не мешает.
WH>Скорее на оборот.

Отладочная информация должна протаскиваться до самых низов (до генерации MSIL, например). Соответственно ее надо как-то представлять переписанном представлении.

ЗЫ

В общем, перестаю тебе отвечать. Жду описания foreach и linq. А там видно будет.
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[20]: Типизатора Н2 – версия VladD2
От: VladD2 Российская Империя www.nemerle.org
Дата: 06.06.11 20:34
Оценка: 1 (1)
Здравствуйте, WolfHound, Вы писали:

S_S>>>def d=Dictionary();

S_S>>>d[4] = MyMacro(d);

S_S>>> В Н1 сейчас такое можно?

VD>>Можно.
WH>Нельзя. Ты на код посмотри.
WH>А тип не станет известен пока не сгенерируешь код.

Код макроса:
using Nemerle;
using Nemerle.Compiler;
using Nemerle.Compiler.Parsetree;

public macro MyMacro(expr)
{
  Impl.Transorm(Macros.ImplicitCTX(), expr)
}

module Impl
{
  public Transorm(typer : Typer, expr : PExpr) : PExpr
  {
    Macros.DefineCTX(typer);
    def dicType = <[ ttype: System.Collections.Generic.Dictionary[_, _] ]>;
    def typedExpr = typer.TypeExpr(expr);
    def errorMsg = "The expression mast have the Dictionary[int, _] or Dictionary[string, _].";
    
    
    def delayTyping(lastTry : bool) : option[PExpr]
    {
      match (typedExpr.Type.Hint)
      {
        | Some(FixedType.Class(_, [tKey, _]) as type) when tKey.Hint.IsSome => // когда тип и его первый параметр вывелся
          if (type.Require(dicType))
            unless (dicType.args.Head.Unify(dicType.args.Tail.Head))
              Message.Error(expr.Location, "The TKey and TValue of Dictionary type parameters must be same type.");
          else
            Message.Error(expr.Location, errorMsg);
            
          unless (tKey.TryUnify(typer.InternalType.String) || tKey.TryUnify(typer.InternalType.Int32))
            Message.Error(expr.Location, errorMsg);
            
          Some(if (tKey.Fix().IsValueType) <[ 3 ]> else <[ "a" ]>)
          
        | Some(_) | None => 
          when (lastTry)
            Message.Error(expr.Location, errorMsg);

          None()
      }
    }
    typer.DelayMacro(delayTyping, typer.FreshTypeVar())
  }
}

Тест:
using System.Collections.Generic;
using System.Console;

module Program
{
  Main() : void
  {
    def d1 = Dictionary();
    d1[4] = MyMacro(d1);
    WriteLine(d1.GetType());
    
    def d2 = Dictionary();
    d2["x"] = MyMacro(d2);
    WriteLine(d2.GetType());
  }
}

Консольный вывод:
System.Collections.Generic.Dictionary`2[System.Int32,System.Int32]
System.Collections.Generic.Dictionary`2[System.String,System.String]
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[18]: Типизатора Н2 – версия VladD2
От: VladD2 Российская Империя www.nemerle.org
Дата: 06.06.11 20:36
Оценка:
Здравствуйте, Silver_S, Вы писали:

S_S> Тогда можно поскипать. Т.к. я и сам не до конца понимаю как там все работает и сейчас и как будет, и о чем конкретно спросил.

S_S>А имел ввиду, что-то типа такого непрактичного этюда.

S_S>def d=Dictionary();

S_S>d[4] = MyMacro(d);

S_S>Допустим макросу зачем-то надо знать тип ключа у d (а тип значения тут естейственно неопределен т.к. зависит от самого макроса). Т.е. макросу надо наполовину типизированный Dictionary.

S_S>Макрос смотрит какого типа ключ у этого Dictionary, и в зависимости от этого возвращает значения разных типов либо int либо string (допустим если ключ типа byValue тогда вернуть 3, если тип reference то вернуть "a").

S_S> В Н1 сейчас такое можно?


http://rsdn.ru/forum/nemerle/4301122.1.aspx
Автор: VladD2
Дата: 07.06.11
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[25]: Типизатора Н2 – версия VladD2
От: WolfHound  
Дата: 07.06.11 07:53
Оценка:
Здравствуйте, VladD2, Вы писали:

VD>Кто такие все? Область видимости нужна только для body.

Вот тут
Автор: VladD2
Дата: 03.06.11
ты начал разговор про фор.

VD>Я описался. Смысл говорить про for нет. Там все просто. Речь конечно же про foreach.

См выше.
Очень даже есть.
Ибо если в init была объявлена переменная то она должна быть видна не только в body но и в cond и в change.
syntax ("for", "(", Optional(init), ";", Optional(cond), ";", Optional(change), ")", body)


VD>Это у тебя больное воображение. Тебя просят показать код foreach. В прочем, вопрос риторический. Мы явно никогда его не увидим.

Я сразу сказал и еще наверное уже раз 100 повторил что мне нужно еще коечто додумать.
А ты все гы-гыкаешь и тролишь.

VD>Как ты будешь решать эту проблему ты не показываешь.

Я тебе уже раз 100 сказал что мне нужно еще подумать.
Так нет же.
Вместо того чтобы на время заткнуться и дать спокойно подумать ты только и делаешь что тролишь.

VD>Остаются только фантазии. Ну, а слова твои не стотят ни цента. Какой раз ловлю себя на том что по посту трачу время на чтение очередной порции твоих заявлений.

Это я трачу время на разговоры с тобой.

VD>Что ты несешь? Еще раз по буквам "код комплита, в этом случае, должен вызываться из кода макроса". Макросы раскрываются не во время парсинга, а во время типизации. К этому моменту парсиг уже будет закончен.

Это ты ту несешь полный бред даже не попытавшись понять о чем разговор.
Вот это парсер грамматики.
До того как этот код полностью отработает ни о каком автокомплите и речи быть не может.
А ты предлагаешь из его потрохов бросать исключение.

WH>>Включи мозг для разнообразия.

VD>Хамло.
На себя посмотри.

VD>Тут нет противоречий. Одна проверка наличие метода (по имени, без деталей) не имеет ничего общего с типизацией всего выражения. Это даст только улучшение сообщений об ошибках.

Трепло!(С)
И как ты собрался это делать без полной типизации?
from x in xs
where x...
select x...

Как ты собрался проверить начилие метода Select без полной типизации?

VD>Отладочная информация должна протаскиваться до самых низов (до генерации MSIL, например). Соответственно ее надо как-то представлять переписанном представлении.

Это совсем отдельный разговор.

VD>В общем, перестаю тебе отвечать. Жду описания foreach и linq. А там видно будет.

Та уже раз 10 это обещал
... << RSDN@Home 1.2.0 alpha 4 rev. 1472>>
Пусть это будет просто:
просто, как только можно,
но не проще.
(C) А. Эйнштейн
Re[21]: Типизатора Н2 – версия VladD2
От: WolfHound  
Дата: 07.06.11 07:53
Оценка:
Здравствуйте, VladD2, Вы писали:

VD>Код макроса:

И после этого ты еще говоришь что у меня много кода
... << RSDN@Home 1.2.0 alpha 4 rev. 1472>>
Пусть это будет просто:
просто, как только можно,
но не проще.
(C) А. Эйнштейн
Re[22]: Типизатора Н2 – версия VladD2
От: VladD2 Российская Империя www.nemerle.org
Дата: 07.06.11 14:30
Оценка:
Здравствуйте, WolfHound, Вы писали:

VD>>Код макроса:

WH>И после этого ты еще говоришь что у меня много кода

У те6я пока что только одни мечты. Причем совершенно фантастические, в том смысле, что не учитывающие кучи важных деталей.

А это реальный код макроса который работает здесь и сейчас.

Что до его объема, никто не говорит, что нельзя сделать лучше. Даже в Н1 можно обернуть все это дело макросами и сделать код раза в два короче и понятнее. А в Н2 такой код вообще должен писаться очень просто и дегларативно. Я вижу это дело примерно так:
macro MyMacro(expr)
  def types: keyType, valTape;
  require: expr :> #Dictionary[keyType, valTape] else Error("The expression mast have the Dictionary[int, _] or Dictionary[string, _].")
  require: keyType unify #int || keyType unify #string;
  require: keyType unify valTape else Error("The TKey and TValue of Dictionary type parameters must be same type.")
{
  if (tKey.IsValueType) <[ 3 ]> else <[ "a" ]>
}

Уверен, что у тебя проще не получится.

Кстати, сообщения об ошибках для подобных случаев скорее всего получится формировать автоматически. Ведь оп сути они описывают выражение внутри require.

ЗЫ

Ты лучше бы признай что был не прав (в Н1 этот пример реализуется).
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[23]: Типизатора Н2 – версия VladD2
От: WolfHound  
Дата: 07.06.11 14:46
Оценка:
Здравствуйте, VladD2, Вы писали:

VD>У те6я пока что только одни мечты. Причем совершенно фантастические, в том смысле, что не учитывающие кучи важных деталей.

Учитываю я все. Просто тебе очень хочется верить в то, что не учитываю.

VD>Уверен, что у тебя проще не получится

Ну да. Ты скопировал мои идеи.
1 в 1. Только синтаксис изменил.
Пройдет еще немного времени, и ты начнёшь на всех углах орать, что ты всегда говорил что так и надо.
... << RSDN@Home 1.2.0 alpha 4 rev. 1472>>
Пусть это будет просто:
просто, как только можно,
но не проще.
(C) А. Эйнштейн
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.