Мой вариант типизации макросов (не проходите мимо)
От: Аноним  
Дата: 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);
  ]>
}
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.