Re[5]: Как добраться до реального типа PExpr?
От: Иванков Дмитрий Россия  
Дата: 23.06.07 17:34
Оценка:
Здравствуйте, Константин Л., Вы писали:


КЛ>Кароче, вот что у меня получилось после изучения lockMacro:



КЛ>
[skipped]

КЛ>                def startType = ts.Type.Hint.Value.TypeInfo.SystemType;
КЛ>                def endType = te.Type.Hint.Value.TypeInfo.SystemType;                            
                        
КЛ>                when( startType.Equals(typeof(int)) && endType.Equals(typeof(int)) )                
[skipped]

КЛ>        def    func() { 10; };
        
КЛ>            from 1 to func //internal compiler error: got some unknown exception of type System.NullReferenceException
КЛ>        {
КЛ>            WriteLine("Hi!");
КЛ>        }
[skipped]

КЛ>


"ICE" вылезает потому что te.Type.Hint.Value.TypeInfo == null (знать не хочу почему )
В то время как te.Type.Hint.Value.SystemType содержит адекватное значение, а также кажется есть и повыше в иерархии такая информация.

Подумалось что в такие кишки залезать не стоит, а стоит лишь потребовать совпадения типов, во как

using Nemerle.Utility;
using Nemerle.Compiler;
namespace MacroLibrary1
{
  public macro MyTestMacro(start, end, body)
  syntax ("from", start, "to", end, body)
  {                
    def typer = Nemerle.Macros.ImplicitCTX() : Nemerle.Compiler.Typer;        
    def ts = typer.TypeExpr(start);        
    def te = typer.TypeExpr(end);        
    when (!ts.Type.Unify (Nemerle.Macros.Manager ().InternalType.Int32))
     Message.Error ("Need int for start");
    when (!te.Type.Unify (Nemerle.Macros.Manager ().InternalType.Int32))
     Message.Error ("Need int for end");
    <[
      when( $start >= $end ) 
        throw System.ArgumentException();
    
      for (mutable var = $start; var <= $end; var++) {
        $body
      }        
    ]>;
  }
}
Re[6]: Как добраться до реального типа PExpr?
От: Константин Л. Франция  
Дата: 23.06.07 21:42
Оценка:
Здравствуйте, Иванков Дмитрий, Вы писали:

[]

а как их можно отлаживать, кроме как аттачиться к ncc в процессе компиляции macro assembly?
Re[7]: Как добраться до реального типа PExpr?
От: Иванков Дмитрий Россия  
Дата: 23.06.07 22:29
Оценка:
Здравствуйте, Константин Л., Вы писали:

КЛ>а как их можно отлаживать, кроме как аттачиться к ncc в процессе компиляции macro assembly?


Компиляция сборки макроса как раз не при чем, разве что стоит с ключиком -g собирать макрос.
А дальше собственно надо аттачится к ncc в процессе компиляции основного приложения, иначе никак, макросы с компилятором взаимодействую очень тесно.
Ну и там как-то добавить в референсы сборку с макросом чтоли, в общем если все сложится, то можно и брейкпойнты в макросе ставить и в watch что-то будет видно

А вот как лучше всего подцеплятся к ncc не знаю, в форуме интеграции все еще не ответили, точно описать шаманства с которыми работаю не смогу
(сейчас есть симлинк папки с библиотеками компилера в другую, к параметрам ncc добавлен -nostdmacros -r symlink\Nemerle.Macros.dll, как-то так выглядит мой винегрет)
Re[7]: Как добраться до реального типа PExpr?
От: VladD2 Российская Империя www.nemerle.org
Дата: 25.06.07 13:49
Оценка:
Здравствуйте, Константин Л., Вы писали:

КЛ>а как их можно отлаживать, кроме как аттачиться к ncc в процессе компиляции macro assembly?


1. Прописать в качестве отлаживаемого ехе-шника ncc.exe, задать ему в качестве параметров файл (*.n) использующий макрос и подключить сборку с макросом. Все это подробно описано в Макросы Nemerle – расширенный курс (Часть 1)
Автор(ы): Чистяков Влад (VladD2)
Дата: 24.04.2007
Статься задумана как углубленное описание самой малоосвещенной части языка программирования Nemerle – его макросистемы. В первой части статьи будет описан процесс компиляции и освещены его особенности. Рассказано о том, что же такое макросы, каких типов они бывают, и как с ними бороться.
Во второй части будут даны примеры каждого из видов макросов и советы, где и как их применять.
.
2. Тупо поставить Trace.Assert(false) в нужной строке программы и нажать Retry кгда откроется диалог (во время компиляции).
... << RSDN@Home 1.2.0 alpha rev. 637>>
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[5]: Как добраться до реального типа PExpr?
От: VladD2 Российская Империя www.nemerle.org
Дата: 25.06.07 13:49
Оценка:
Здравствуйте, WolfHound, Вы писали:

WH>А конструкция

WH>
WH>                    def gt1 = gt1;
WH>                    def gt2 = gt2;
WH>

WH>Для меня совсем загадка.

Это в отладочных целях. Такой прием позволяет видеть значения переменных в отладчике. Дело в том, что там появляется замыкание и переменные альфа-переименовываются, а такой прием позволяет создать локальные перменные с исходными именами. Джит в релизе из выкидывает.
... << RSDN@Home 1.2.0 alpha rev. 637>>
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[2]: Как добраться до реального типа PExpr?
От: IT Россия linq2db.com
Дата: 22.08.07 21:31
Оценка: 35 (1)
Здравствуйте, VladD2, Вы писали:

VD>PExpr.TypedObject заполняется при типизации. Причем типизация процесс итеративный. Она может откладыватся и в PExpr.TypedObject значения не будет.


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