Мой вариант типизации макросов (не проходите мимо)
От:
Аноним
Дата:
01.06.11 04:55
Оценка:
macro if(condition, trueExpression, falseExpression)
syntax"if "condition" then "trueExpression" else "falseExpression
{
<[ comon
{
def if($condition:bool, $trueExpression, $falseExpression)
{
match ($condition)
{
| true => $trueExpression;
| false => $falseExpression;
}
}
def if($condition, $trueExpression, $falseExpression) error("тип должен быть bool"); //если не возможно специализировать, то выдается следующее сообщение
} // часть comon генерируется 1 раз в сборке в принципе от этого можно отказаться автоматически определяя подобную частьif(condition, trueExpression, falseExpression);}> //непосредственно вставляется в код, в принципе этот кусок наверно можно формировать автоматом!!!! т.е. эта строка не нужна
}
расширение макроса
expand if(condition, trueExpression, falseExpression)
{
<[ comon
{
def if($condition:string,$trueExpression, $falseExpression)
{
match($condition=="true")
| $trueExpression
| $falseExpression
}
def if($condition, $trueExpression, $falseExpression) error("тип должен быть bool или string"); //если не возможно
} // в случае если в секции comon уже была аналогичная функция то код заменяется (как в случае без специализации ) иначе происходит добавление, можно добавить сахару
]>
}
какие расширения типов потребуются — ref(получаемый элемент ссылка), val(получаемый элемент значение), const (получаемый элемент константа) — данные возможности почти аналогичны возможностям С++
macro lock(lockOnExpr, body)
syntax"lock" "(" lockOnExpr ")" body
{
<[ comon
{
def lock(ref lockOnExpr, body) //требует что бы первый тип был ссылкой
{
System.Threading.Monitor.Enter(lockOnExpr);
try { $body }
finally { System.Threading.Monitor.Exit(lockOnExpr); }
}
def lock(val lockOnExpr, body) error("Блокируемый объект должен быть ссылкой")
}
lock(ref lockOnExpr, body);
]>
}
Re: Мой вариант типизации макросов (не проходите мимо)
Re[2]: Мой вариант типизации макросов (не проходите мимо)
От:
Аноним
Дата:
01.06.11 05:36
Оценка:
macro "if "condition" then "trueExpression" else "falseExpression
{
// функции вставляются один раз модуле макросов, за место макроса вставляется только вызов функции
<[
def if(condition:bool, trueExpression, falseExpression)
{
match (condition)
{
| true => trueExpression;
| false => falseExpression;
}
}
def if(condition, trueExpression, falseExpression) error("тип должен быть bool"); //если не возможно специализировать, то выдается следующее сообщение
// здесь вставляется вызов макроса автоматически if($condition, $trueExpression, $falseExpression)
}
Re[3]: Мой вариант типизации макросов (не проходите мимо)
От:
Аноним
Дата:
01.06.11 05:43
Оценка:
macro "lock" "(" lockOnExpr ")" body
{
<[
def lock(ref lockOnExpr, body) //требует что бы первый тип был ссылкой
{
System.Threading.Monitor.Enter(lockOnExpr);
try { $body }
finally { System.Threading.Monitor.Exit(lockOnExpr); }
}
def lock(val lockOnExpr, body) error("Блокируемый объект должен быть ссылкой")
}
Re: Мой вариант типизации макросов (не проходите мимо)
Здравствуйте, Аноним, Вы писали:
А>какие расширения типов потребуются — ref(получаемый элемент ссылка), val(получаемый элемент значение), const (получаемый элемент константа) — данные возможности почти аналогичны возможностям С++
Т.е. "вывод типов" сводится вот этой цитате? И при чем тут C++ — у него совершенно иная система типов.
/* иЗвиНите зА неРовнЫй поЧерК */
Re[2]: Мой вариант типизации макросов (не проходите мимо)
От:
Аноним
Дата:
01.06.11 07:34
Оценка:
Здравствуйте, hardcase, Вы писали:
H>Здравствуйте, Аноним, Вы писали:
А>>какие расширения типов потребуются — ref(получаемый элемент ссылка), val(получаемый элемент значение), const (получаемый элемент константа) — данные возможности почти аналогичны возможностям С++
H>Т.е. "вывод типов" сводится вот этой цитате? И при чем тут C++ — у него совершенно иная система типов.
нет. посмотри на код например foreach...
Re[3]: Мой вариант типизации макросов (не проходите мимо)
Здравствуйте, Аноним, Вы писали:
А>Здравствуйте, hardcase, Вы писали:
H>>Здравствуйте, Аноним, Вы писали:
А>>>какие расширения типов потребуются — ref(получаемый элемент ссылка), val(получаемый элемент значение), const (получаемый элемент константа) — данные возможности почти аналогичны возможностям С++
H>>Т.е. "вывод типов" сводится вот этой цитате? И при чем тут C++ — у него совершенно иная система типов.
А>нет. посмотри на код например foreach...
Все что я вижу (помимо плохо отформатированного кода который трудно читать) — это просто уточненния типов в квазицитатах. Т.е. форму задания типов, но не саму идею их вывода.
/* иЗвиНите зА неРовнЫй поЧерК */
Re[4]: Мой вариант типизации макросов (не проходите мимо)
От:
Аноним
Дата:
01.06.11 08:03
Оценка:
Здравствуйте, hardcase, Вы писали:
H>Здравствуйте, Аноним, Вы писали:
А>>Здравствуйте, hardcase, Вы писали:
H>>>Здравствуйте, Аноним, Вы писали:
А>>>>какие расширения типов потребуются — ref(получаемый элемент ссылка), val(получаемый элемент значение), const (получаемый элемент константа) — данные возможности почти аналогичны возможностям С++
H>>>Т.е. "вывод типов" сводится вот этой цитате? И при чем тут C++ — у него совершенно иная система типов.
А>>нет. посмотри на код например foreach...
H>Все что я вижу (помимо плохо отформатированного кода который трудно читать) — это просто уточненния типов в квазицитатах. Т.е. форму задания типов, но не саму идею их вывода.
понял о чем ты.
В данном случае просто генерируются перекрытия функций. Что позволяет генерировать АСТ в сборках.
Сама типизация вообще идет в виде стандартной пролог конструкции.