Мой вариант типизации макросов (не проходите мимо)
От: Аноним  
Дата: 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: Мой вариант типизации макросов (не проходите мимо)
От: Аноним  
Дата: 01.06.11 05:06
Оценка:
[nemerle]
macro ForEach(pattern,collection,collection )
syntax: "foreach" "(" pattern "in" collection ")" collection
<[ comon{
ForEach($pattern , $collection:array , $body )
{
def loop(i : int, ary) : void
{
when (i < ary.Lenght)
{
def $x = ary[i];
$body;
loop(i + 1, ary)
}
loop(0,$collection)
]>
// остальные варианты опущены

}

}
[\nemerle]
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: Мой вариант типизации макросов (не проходите мимо)
От: hardcase Пират http://nemerle.org
Дата: 01.06.11 07:17
Оценка:
Здравствуйте, Аноним, Вы писали:

А>какие расширения типов потребуются — ref(получаемый элемент ссылка), val(получаемый элемент значение), const (получаемый элемент константа) — данные возможности почти аналогичны возможностям С++


Т.е. "вывод типов" сводится вот этой цитате? И при чем тут C++ — у него совершенно иная система типов.
/* иЗвиНите зА неРовнЫй поЧерК */
Re[2]: Мой вариант типизации макросов (не проходите мимо)
От: Аноним  
Дата: 01.06.11 07:34
Оценка:
Здравствуйте, hardcase, Вы писали:

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


А>>какие расширения типов потребуются — ref(получаемый элемент ссылка), val(получаемый элемент значение), const (получаемый элемент константа) — данные возможности почти аналогичны возможностям С++


H>Т.е. "вывод типов" сводится вот этой цитате? И при чем тут C++ — у него совершенно иная система типов.


нет. посмотри на код например foreach...
Re[3]: Мой вариант типизации макросов (не проходите мимо)
От: hardcase Пират http://nemerle.org
Дата: 01.06.11 07:45
Оценка:
Здравствуйте, Аноним, Вы писали:

А>Здравствуйте, 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>Все что я вижу (помимо плохо отформатированного кода который трудно читать) — это просто уточненния типов в квазицитатах. Т.е. форму задания типов, но не саму идею их вывода.


понял о чем ты.
В данном случае просто генерируются перекрытия функций. Что позволяет генерировать АСТ в сборках.

Сама типизация вообще идет в виде стандартной пролог конструкции.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.