Re[3]: Как определить принадлежность генерику?
От: VladD2 Российская Империя www.nemerle.org
Дата: 20.04.10 13:51
Оценка:
Здравствуйте, dsorokin, Вы писали:

D>Наверное, забыл упомянуть, что A — параметр типа. Поэтому int должен соответствовать. Но я так понял, что int- означает, что здесь может вывестись int, а может и нет.


Параметров типов в конкретных типах быть не может. Они заменяются свободными переменными типов (VarType).

D>Никаких гарантий еще нет. Как сложатся звезды. Поэтому int- не будет ни TryRequire, не TryUnify для A. (я правильно понимаю?)


int- — это int или его базовые классы (интерфейсы в данном случае).

Проблема может быть в том, что ты получаешь не тип со свободной переменной, а используешь не подставленный (так что ли его назвать?) тип.

D>Первоначально мне нужно было хотя бы гипотетическое соответствие. То есть, может ли выражение иметь такой-то тип. В общем, взял код FixedType.Unify и просто переписал под себя. Работает. Но теперь я понял, что и это мне не нужно.


Ну, ты уж разберись, что нужно.

А вообще, если код не закрыт, то лучше дал бы ссылку на него или прислал бы мне преокт, а я бы поглядел и подправил.

D>Я все пекусь о тех самых вычислительных выражениях. Еще раз перечитал спеки F# и понял, что "монадность" выражения можно целиком определить по синтаксическому разбору без привлечения вывода типов и без Typer.DelayMacro.


Это хорошо, так как макро будет проще, а чем проще код тем он надежнее.
В прочем знание типов может расширить возможности или сделать код гибче.

D> Эта монадность возникает только в выражениях let!, do! и use! Все.


Вот и мне так показалось. По этому я был довольно удивлен услышив от тебя о необходимости анализа типов.

D>Кстати, мне не удалось ввести синтаксическую конструкцию def!. Когда делаю так


D>
D>  public macro @bind (_expr)
D>  syntax ("def", "!", _expr) { <[ () ]> }
D>


D>то компилятор уже в другой сборке начинает ругаться при разборе обычных def.


Жаль. Надо будет посмотреть, может можно что-то в компиляторе подправить, чтобы он пропускал такой синтаксис.

D> Он начинает ожидать "!". Сейчас думаю использовать такие ключевые слова с добавкой comp: defcomp, usingcomp, docomp, returncomp и yieldcomp. Но с восклицательным знаком выглядело бы идиоматичнее и красивее.


Можно сделать так:
  public macro @bind (_expr)
  syntax ("!!", "def", _expr) { <[ () ]> }

и соответственно использование:
!!def a = ...;
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.