Алгоритм выбора перегрузок (OverloadPossibility)
От: hardcase Пират http://nemerle.org
Дата: 30.05.10 10:21
Оценка:
Попытался было исправить баг 1229 а также попробовать решить проблему с выбором констроктора атрибутов (сейчас например нельзя навесить атрибут System.ComponentModel.DefaultValueAttribute).
В обоих случаях проблемный код не использует стандартный алгоритм выбора перегрузок (тот что сворачивает список экземпляорв OverloadPossibility).
В случае с выбором op_Implicit сворачивается список IMethod-ов (GetBestOverloads1) и не контролируются ограничения на генерики, а в случае конструктора атрибутов вообще написан какой-то костыль непонятный.

Внимание, вопрос: как связаны между собой Solver и OverloadPossibility?
/* иЗвиНите зА неРовнЫй поЧерК */
Re: Алгоритм выбора перегрузок (OverloadPossibility)
От: VladD2 Российская Империя www.nemerle.org
Дата: 31.05.10 13:09
Оценка:
Здравствуйте, hardcase, Вы писали:

H>Попытался было исправить баг 1229 а также попробовать решить проблему с выбором констроктора атрибутов (сейчас например нельзя навесить атрибут System.ComponentModel.DefaultValueAttribute).

H>В обоих случаях проблемный код не использует стандартный алгоритм выбора перегрузок (тот что сворачивает список экземпляорв OverloadPossibility).
H>В случае с выбором op_Implicit сворачивается список IMethod-ов (GetBestOverloads1) и не контролируются ограничения на генерики, а в случае конструктора атрибутов вообще написан какой-то костыль непонятный.

H>Внимание, вопрос: как связаны между собой Solver и OverloadPossibility?


Как-то из предисловия не следует вопрос. Да и ответить на этот вопрос не очень просто. Это все равно как задать вопрос "Как связан класс string и Form?".

Solver — это класс который отвечает за хранение графа выводимых типов и его версионность. OverloadPossibility — это класс описывающий список перегрузок методов.

Сказать, что они как-то связаны трудно. Хотя несомненно используются совместно.

Тут уж скорее нужно говорить об описании самомого процесса разрешения перегрузок, отложенной типизации и вывода типов. Это весьма связанные вопросы. Но их в двух словах не опишешь.
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[2]: Алгоритм выбора перегрузок (OverloadPossibility)
От: hardcase Пират http://nemerle.org
Дата: 31.05.10 15:12
Оценка:
Здравствуйте, VladD2, Вы писали:

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


Я так понял, что список возможных перегрузок фильтруется в рамках текущей версии в Solver-е (я не понял как это вообще происходит). Я не понял что нужно сделать с рашетелем, чтобы решить означенные проблемы. Как Solver определяет какая перегрузка — лучшая?
/* иЗвиНите зА неРовнЫй поЧерК */
Re[3]: Алгоритм выбора перегрузок (OverloadPossibility)
От: VladD2 Российская Империя www.nemerle.org
Дата: 31.05.10 15:51
Оценка:
Здравствуйте, hardcase, Вы писали:

H>Я так понял, что список возможных перегрузок фильтруется в рамках текущей версии в Solver-е (я не понял как это вообще происходит). Я не понял что нужно сделать с рашетелем, чтобы решить означенные проблемы. Как Solver определяет какая перегрузка — лучшая?


Солвер не работает с перегрузками. Он работает с грфом типов. Он обеспечивает вресионный механизм его изменения.

Перегрузками заведует тайпер (Typer) и DelayedTyping (что является частью тайпера).

Солвер используется тайпером для управления этим графом.
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[4]: Алгоритм выбора перегрузок (OverloadPossibility)
От: hardcase Пират http://nemerle.org
Дата: 31.05.10 20:37
Оценка:
Здравствуйте, VladD2, Вы писали:

VD>Перегрузками заведует тайпер (Typer) и DelayedTyping (что является частью тайпера).


Ага, уже понял. Спасибо за r8894 — странно, что я не нашел этот метод (ResolveOverload) раньше
/* иЗвиНите зА неРовнЫй поЧерК */
Re[5]: Алгоритм выбора перегрузок (OverloadPossibility)
От: VladD2 Российская Империя www.nemerle.org
Дата: 01.06.10 13:13
Оценка:
Здравствуйте, hardcase, Вы писали:

H>Ага, уже понял. Спасибо за r8894 — странно, что я не нашел этот метод (ResolveOverload) раньше


Вот только применять его нельзя. Проблема в том, что получится неконтролируемая рекурсия, так как приведение типа используется внутри ResolveOverload.
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[6]: Алгоритм выбора перегрузок (OverloadPossibility)
От: hardcase Пират http://nemerle.org
Дата: 01.06.10 13:21
Оценка:
Здравствуйте, VladD2, Вы писали:

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


H>>Ага, уже понял. Спасибо за r8894 — странно, что я не нашел этот метод (ResolveOverload) раньше


VD>Вот только применять его нельзя. Проблема в том, что получится неконтролируемая рекурсия, так как приведение типа используется внутри ResolveOverload.


Угу. Уже сообразил, сейчас вот играюсь.
/* иЗвиНите зА неРовнЫй поЧерК */
Re[7]: Алгоритм выбора перегрузок (OverloadPossibility)
От: VladD2 Российская Империя www.nemerle.org
Дата: 01.06.10 13:42
Оценка:
Здравствуйте, hardcase, Вы писали:

H>Угу. Уже сообразил, сейчас вот играюсь.


Давай я там сам все поправлю. Там нужно поменять код чтобы он использовал штатный вариант GetBestOverloads(). Не уверен, но возможно еще и OverloadPossibility.OnlyPossible().
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[8]: Алгоритм выбора перегрузок (OverloadPossibility)
От: hardcase Пират http://nemerle.org
Дата: 01.06.10 15:08
Оценка:
Здравствуйте, VladD2, Вы писали:

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


H>>Угу. Уже сообразил, сейчас вот играюсь.


VD>Давай я там сам все поправлю. Там нужно поменять код чтобы он использовал штатный вариант GetBestOverloads(). Не уверен, но возможно еще и OverloadPossibility.OnlyPossible().


Ок (попробовал — не вышло). Тогда я поковыряюсь с атрибутами.
/* иЗвиНите зА неРовнЫй поЧерК */
Re: Алгоритм выбора перегрузок (OverloadPossibility)
От: VladD2 Российская Империя www.nemerle.org
Дата: 01.06.10 15:51
Оценка:
Здравствуйте, hardcase, Вы писали:

H>Попытался было исправить баг 1229


Баг исправил, но не так как хотел ты. Общий алгоритм разрешения перегрузки там не применим, так как он в том числе учитывает неявные приведение типов, так что если применить этот алгоритм, то происходит зацикливание.

Я просто поправил метод GetBestOverloads1 добавив в него правило отбрасывания дженерик-методов, если есть хотя бы один не дженерик. Кроме того я переименовал его в GetBestOverloadsWithoutImplicitConversions, чтобы была ясна его суть.
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[9]: Алгоритм выбора перегрузок (OverloadPossibility)
От: VladD2 Российская Империя www.nemerle.org
Дата: 01.06.10 15:52
Оценка:
Здравствуйте, hardcase, Вы писали:

H>Ок (попробовал — не вышло). Тогда я поковыряюсь с атрибутами.


Давай. Вот там как раз нужно попробовать использовать стандартную перегрузку.
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[10]: Алгоритм выбора перегрузок (OverloadPossibility)
От: hardcase Пират http://nemerle.org
Дата: 03.06.10 09:33
Оценка: 135 (1)
Здравствуйте, VladD2, Вы писали:

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


H>>Ок (попробовал — не вышло). Тогда я поковыряюсь с атрибутами.


VD>Давай. Вот там как раз нужно попробовать использовать стандартную перегрузку.


Сломал мозги и борду , но таки кое-что сделал.
Просьба произвести код-ревью, так как пришлось добавить дополнительный конструктор для Typer-а.
/* иЗвиНите зА неРовнЫй поЧерК */
Re[11]: Алгоритм выбора перегрузок (OverloadPossibility)
От: catbert  
Дата: 03.06.10 14:03
Оценка:
Здравствуйте, hardcase, Вы писали:

H>Просьба произвести код-ревью, так как пришлось добавить дополнительный конструктор для Typer-а.


Насколько я понял, урезанный Тайпер (ну, сконструированный новым конструктором) можно использовать вне контекста метода?

*шёпотом* Ну, например, чтобы выводить типы приватных полей классов.
Re[11]: Алгоритм выбора перегрузок (OverloadPossibility)
От: VladD2 Российская Империя www.nemerle.org
Дата: 03.06.10 14:26
Оценка:
Здравствуйте, hardcase, Вы писали:

H>Сломал мозги и борду , но таки кое-что сделал.

H>Просьба произвести код-ревью, так как пришлось добавить дополнительный конструктор для Typer-а.

Из того что беглым взглядом выхватил — можно вместо формирования TExpr.DefaultValue(ty) использовать реальное выражение полученное раньше. Только при этом его нужно не в object складывать.

В остальном на глаз все более менее корректно. Но такие вещи на глаз проверять очень сложно. В общем, раз тесты проходят и компилятор сам себя собирает, значит пока все ОК. Ну, а появятся проблемы — будем решать.
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[12]: Алгоритм выбора перегрузок (OverloadPossibility)
От: Аноним  
Дата: 03.06.10 15:21
Оценка:
Здравствуйте, VladD2, Вы писали:

VD>Из того что беглым взглядом выхватил — можно вместо формирования TExpr.DefaultValue(ty) использовать реальное выражение полученное раньше. Только при этом его нужно не в object складывать.


Я так и хотел сперва, да только существующий код не изготавливает TExpr , а переписывать еще и его как-то не хотелось.
Re[12]: Алгоритм выбора перегрузок (OverloadPossibility)
От: hardcase Пират http://nemerle.org
Дата: 03.06.10 15:36
Оценка:
Здравствуйте, catbert, Вы писали:

C>Насколько я понял, урезанный Тайпер (ну, сконструированный новым конструктором) можно использовать вне контекста метода?


Боюсь что этот конструктор граничит с хаком, так как я не ручаюсь за функционал такого тайпера окромя выбора перегрузок.
/* иЗвиНите зА неРовнЫй поЧерК */
Re[13]: Алгоритм выбора перегрузок (OverloadPossibility)
От: VladD2 Российская Империя www.nemerle.org
Дата: 03.06.10 17:22
Оценка:
Здравствуйте, Аноним, Вы писали:

А>Я так и хотел сперва, да только существующий код не изготавливает TExpr , а переписывать еще и его как-то не хотелось.


Ладно. Работает, и ладно. Если есть время лучше займись типизацией при разборе макросов. Там тоже хардкодинга хватате. Народ не раз нарывался на проблемы связанные с этим.
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.