Re[15]: еще раз о типизации.
От: hardcase Пират http://nemerle.org
Дата: 11.04.11 14:16
Оценка:
Здравствуйте, Аноним, Вы писали:

А>не спорю, вот только раскрытие проверки типа переменной когда произойдет?

А>Учтите, что это может быть не только переменная, а например еще и функция с переданными параметрами...

Ничего не понял.
/* иЗвиНите зА неРовнЫй поЧерК */
Re[3]: еще раз о типизации.
От: VladD2 Российская Империя www.nemerle.org
Дата: 11.04.11 14:27
Оценка: 7 (2)
Здравствуйте, Аноним, Вы писали:

А>macro ttt (b)

А>{
А>match type(b)
А>| int => write('int');
А>| sring => write('string');
А>}

А>def b='1111';

А>ttt(b);
А>или
А>ттоже самое, но с функцией... или с более сложным типом...

Этот пример имеет мало общего с рабочим кодом. В этом примере даже строковые литералы указаны не верно. А уж о типах вообще говорить не приходится. То что передается в "match type" вообще не имеет типов на этапе раскрытия.

Работа с типами внутри макросов — это отдельная и очень не простая тема. Конечно, многое можно сделать проще. Но чтобы говорить предметно нужно, все же, разобраться в сути обсуждаемого вопроса.

Например, важно понимать, что типы вычисляются после раскрытия макросов, и то что, макрос может оперировать с типами которые еще не существуют в момент его компиляции. Так же следует понимать, что эквивалентность типов (которая, похоже, подразумевается в данном примере) имеет смысл только к узкому набору типов. Например, она не имеет смысла для дженерик-типов. При работе с типами используется механизм унификации. Причем даже более сложный нежели в Прологе, так как кроме просто унификации есть еще унификация с учетом подтипов/супертипов (в немерле функции для этого называются Require/Provide).

Возможно для них и можно придумать некий синтаксис, но тут есть много нюансов. Например, Require, Provide и Unify меняют состояние графа типов (т.е. имеют побочный эффект). Так что просто так их вызвать нельзя. Есть аналоги с префиксом Try которые выполняют эти операции в рамках транзакции. Но это влияет на эффективность. В общем, много нюансов.

Ну, и самое важное — чтобы работать с типами нужно сначала типизировать выражение. Получить типы из параметров макросов невозможно. Выражения, которые находятся внутри параметров — это нетипизированное AST. Его можно анализировать паттерн-матчингом, то только на предмет структуры.

В общем, чтобы получить реальный ответ на данный вопрос нужно сначала разобраться с имеющейся моделью (и реализацией). Иначе мои слова будут выглядеть непонятным набором терминов.
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[16]: еще раз о типизации.
От: Аноним  
Дата: 11.04.11 15:28
Оценка:
Здравствуйте, hardcase, Вы писали:

H>Здравствуйте, Аноним, Вы писали:


А>>не спорю, вот только раскрытие проверки типа переменной когда произойдет?

А>>Учтите, что это может быть не только переменная, а например еще и функция с переданными параметрами...

H>Ничего не понял.


наверно если покажу как реализовать станет понятнее

match type(a)
|type(int)=>write('int');
|type(string)=>write('string');


надо транслировать не так как вы сейчас, а следующем образом (компилятор вообще не затрагивается)

function ffr1111(a11111:int)
{
write('int');
}
function ffr1111(a11111:string)
{
write('string');
}


ffr1111(a);


теперь даже если a будет результатом функции, то код все равно оттранслируется.

Как я писал ранее это решит много проблем и достаточно вероятно серьезно ускорит компиляцию, так как большенство макросов могут быть оттранслированы изначально (если они чистые)
Re[7]: еще раз о типизации.
От: VladD2 Российская Империя www.nemerle.org
Дата: 11.04.11 16:43
Оценка:
Здравствуйте, Аноним, Вы писали:

H>>Вы понимаете как выводятся типы в Nemerle?


А>Да.


А>Строится система логических(ограничений) уравнений и решается.


Все сильно сложнее. Попробовал описать это и получилась мини-статья, так что решил отделить ее и пустить отдельной темой
Автор: VladD2
Дата: 11.04.11
.
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.