Здравствуйте, 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 = ...;