вопрос по метапрограммированию
От: _Claus_  
Дата: 24.11.11 12:29
Оценка:
В параметрах макроса есть тип ParsedField

[MacroUsage(MacroPhase.BeforeInheritance, MacroTargets.Field)]\
  macro Ref(typeBuilder : TypeBuilder, fld : ParsedField)
  
    registration(typeBuilder, fld, true)




когда я пытаюсь определить метод registration, компилятор в упор не знает ParsedField (все на Parsed..), что удивляет меня безмерно.
еще удивило, когда в исходниках компилятора я нахожу к нему отсылки, но не объявление.


 module Helpers

    public registration(typeBuilder :TypeBuilder, fld : ParsedField, control :bool) : void //ошибка unbound type name ParsedField
    
      mutable block = typeBuilder.UserData["data"] :> TypeBuilder
      ..
Re: вопрос по метапрограммированию
От: _Claus_  
Дата: 24.11.11 12:31
Оценка:
Добавление:
Nemerle, Nemerle.Compiler в Reference-ах имеются
в заголовке файла тоже все как по библии

using Nemerle;
using Nemerle.Collections
using Nemerle.Compiler
using Nemerle.Text
using Nemerle.Utility
using Nemerle.Compiler.Parsetree
using Nemerle.Compiler.Typedtree

using System;
using System.Collections.Generic;
using System.Linq;
Re: вопрос по метапрограммированию
От: CodingUnit Россия  
Дата: 24.11.11 12:46
Оценка:
Здравствуйте, _Claus_, Вы писали:

_C_>В параметрах макроса есть тип ParsedField


_C_>
_C_>[MacroUsage(MacroPhase.BeforeInheritance, MacroTargets.Field)]\
_C_>  macro Ref(typeBuilder : TypeBuilder, fld : ParsedField)
  
_C_>    registration(typeBuilder, fld, true)

_C_>




_C_>когда я пытаюсь определить метод registration, компилятор в упор не знает ParsedField (все на Parsed..), что удивляет меня безмерно.

_C_>еще удивило, когда в исходниках компилятора я нахожу к нему отсылки, но не объявление.


Это фокус компилятора при парсинге макросов, он может знать эти сокращения и подставляет на их место соответствующие им типы АСТ, в макросах это возможно но в хелпер методах нет, такого типа не существует. Можно задавать типы явно например ClassMember.Field который является аналогом ParsedField.
Re[2]: вопрос по метапрограммированию
От: _Claus_  
Дата: 24.11.11 13:00
Оценка:
CU>Это фокус компилятора при парсинге макросов, он может знать эти сокращения и подставляет на их место соответствующие им типы АСТ, в макросах это возможно но в хелпер методах нет, такого типа не существует. Можно задавать типы явно например ClassMember.Field который является аналогом ParsedField.
Это я понял из анализа других исходников, но как и где объявлены эти сокращения и почему они не работают вне контекста макроса — загадка.
и какой смысл в этой мистике? почему тупо не объявить ClassMember.Field вместо ParsedField? это ж кипятит мозк при попытке найти хвосты..
Re[3]: вопрос по метапрограммированию
От: CodingUnit Россия  
Дата: 24.11.11 13:11
Оценка:
Здравствуйте, _Claus_, Вы писали:

_C_>Это я понял из анализа других исходников, но как и где объявлены эти сокращения и почему они не работают вне контекста макроса — загадка.

_C_>и какой смысл в этой мистике? почему тупо не объявить ClassMember.Field вместо ParsedField? это ж кипятит мозк при попытке найти хвосты..

Честно говоря не знаю истории появления этого синтаксиса, кажется это идет от экспериментов польских ребят в области создания макросистемы. Эти сокращения нигде и не объявлены, если поискать текст в исходниках компилятора, то работа с ними находится в hierarchy\MacroClassGen.n где производится генерация класса макроса и подобие лифтинга его параметров, где он и обрабатывается. Я давно уже забил на такого рода объявления, и все пишу обычными типами ClassMember или PExpr.
Re[4]: вопрос по метапрограммированию
От: Ziaw Россия  
Дата: 24.11.11 13:20
Оценка: +3
Здравствуйте, CodingUnit, Вы писали:

CU>Честно говоря не знаю истории появления этого синтаксиса, кажется это идет от экспериментов польских ребят в области создания макросистемы. Эти сокращения нигде и не объявлены, если поискать текст в исходниках компилятора, то работа с ними находится в hierarchy\MacroClassGen.n где производится генерация класса макроса и подобие лифтинга его параметров, где он и обрабатывается. Я давно уже забил на такого рода объявления, и все пишу обычными типами ClassMember или PExpr.


Имхо, надо объявить этот синтаксис deprecated и вычистить исходники.
Re[4]: вопрос по метапрограммированию
От: _Claus_  
Дата: 24.11.11 13:25
Оценка:
Здравствуйте, CodingUnit, Вы писали:

CU>Здравствуйте, _Claus_, Вы писали:


_C_>>Это я понял из анализа других исходников, но как и где объявлены эти сокращения и почему они не работают вне контекста макроса — загадка.

_C_>>и какой смысл в этой мистике? почему тупо не объявить ClassMember.Field вместо ParsedField? это ж кипятит мозк при попытке найти хвосты..

CU>Честно говоря не знаю истории появления этого синтаксиса, кажется это идет от экспериментов польских ребят в области создания макросистемы. Эти сокращения нигде и не объявлены, если поискать текст в исходниках компилятора, то работа с ними находится в hierarchy\MacroClassGen.n где производится генерация класса макроса и подобие лифтинга его параметров, где он и обрабатывается. Я давно уже забил на такого рода объявления, и все пишу обычными типами ClassMember или PExpr.


Понял. спасибо. это и похоже на какой-то аппендикс. тогда и в учебниках имеет смысл убрать на них ссылки, если никакой смысловой нагрузки не несут,
а в ступор ввести могут. необъяснимое в поведении компилятора — всегда не к добру.
Re[3]: вопрос по метапрограммированию
От: VladD2 Российская Империя www.nemerle.org
Дата: 24.11.11 15:42
Оценка:
Здравствуйте, _Claus_, Вы писали:

CU>>Это фокус компилятора при парсинге макросов, он может знать эти сокращения и подставляет на их место соответствующие им типы АСТ, в макросах это возможно но в хелпер методах нет, такого типа не существует. Можно задавать типы явно например ClassMember.Field который является аналогом ParsedField.

_C_>Это я понял из анализа других исходников, но как и где объявлены эти сокращения и почему они не работают вне контекста макроса — загадка.
_C_>и какой смысл в этой мистике? почему тупо не объявить ClassMember.Field вместо ParsedField? это ж кипятит мозк при попытке найти хвосты..

Это старая история. На самом деле — это косяк который поляки привнесли в самом начале развития языка.

Изначально типизация макросов была сделана из рук вон плохо. Там была масса хардкодинга.
Видимо, чтобы "облегчить" людям восприятие поляки решили дать "простые" имена для типов. Но вместо того чтобы завести псевдонимы (через декларацию type) они тупо захардкодили имена в типизаторе макросов и расплодили их по статьям и примерам.

Когда мы занялись причесыванием этого дела, то сделали поддержку настоящих типов (ранее они не поддерживались). Ну, а эти ParsedField пришлось оставить для совместимости. Новый визард генерирует заглушки с реальными типами. Так что советую просто забыть про ParsedField и т.п.
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[5]: вопрос по метапрограммированию
От: VladD2 Российская Империя www.nemerle.org
Дата: 24.11.11 15:45
Оценка:
Здравствуйте, Ziaw, Вы писали:

CU>>Честно говоря не знаю истории появления этого синтаксиса, кажется это идет от экспериментов польских ребят в области создания макросистемы. Эти сокращения нигде и не объявлены, если поискать текст в исходниках компилятора, то работа с ними находится в hierarchy\MacroClassGen.n где производится генерация класса макроса и подобие лифтинга его параметров, где он и обрабатывается. Я давно уже забил на такого рода объявления, и все пишу обычными типами ClassMember или PExpr.


Z>Имхо, надо объявить этот синтаксис deprecated и вычистить исходники.


Его тяжело объявить деприкетед, так как там полнеший хардкод (таких типов нет). Можно вручную ворнинги кидать. Только при этом придется еще кучу мест в стандартной библиотеке править.
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[5]: вопрос по метапрограммированию
От: VladD2 Российская Империя www.nemerle.org
Дата: 24.11.11 15:46
Оценка:
Здравствуйте, _Claus_, Вы писали:

_C_>Понял. спасибо. это и похоже на какой-то аппендикс. тогда и в учебниках имеет смысл убрать на них ссылки, если никакой смысловой нагрузки не несут,

_C_>а в ступор ввести могут. необъяснимое в поведении компилятора — всегда не к добру.

Их так расплодили, что теперь и не вычистишь вот так просто.

Можно создать псевдоним, чтобы эта хрень тоже типом будет.
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re: странное с цветом
От: _Claus_  
Дата: 25.11.11 07:25
Оценка:
проблема в изменении моего сгенерированного имени с обычного на _N_1_мое676.
делаю так.

public registration(typeBuilder :TypeBuilder, fld : ClassMember.Field, control :bool) : void
        def name_field_loaded = Macros.UseSiteSymbol(fld.name.ToString() + "_loaded")                                      
        def x = <[decl: mutable $(name_field_loaded : name) : bool ]>
        typeBuilder.Define (x)


name_field_loaded содержит то, что задумано — x_loaded, color == 1

fld.name имеет color == 1 но не меняется в итоговом коде.

что это значит и как сделать, что хочу?
Re[2]: странное с цветом
От: hardcase Пират http://nemerle.org
Дата: 25.11.11 07:36
Оценка:
Здравствуйте, _Claus_, Вы писали:

_C_>что это значит и как сделать, что хочу?


Ты usesite имя сделал, оно и не должно меняться

_C_>
_C_>public registration(typeBuilder :TypeBuilder, fld : ClassMember.Field, control :bool) : void
_C_>        def name_field_loaded = Macros.UseSiteSymbol(fld.name.ToString() + "_loaded")                                      
_C_>        def x = <[decl: mutable $(name_field_loaded : name) : bool ]>
_C_>        typeBuilder.Define (x)
_C_>


Так должно помочь:
public registration(typeBuilder :TypeBuilder, fld : ClassMember.Field, control :bool) : void
        def name_field_loaded = Macros.NewSymbol(fld.name.ToString() + "_loaded")                                      
        def x = <[decl: mutable $(name_field_loaded : name) : bool ]>
        typeBuilder.Define (x)
/* иЗвиНите зА неРовнЫй поЧерК */
Re[3]: странное с цветом
От: _Claus_  
Дата: 25.11.11 07:52
Оценка:
Здравствуйте, hardcase, Вы писали:

H>Здравствуйте, _Claus_, Вы писали:


_C_>>что это значит и как сделать, что хочу?


H>Ты usesite имя сделал, оно и не должно меняться


_C_>>
_C_>>public registration(typeBuilder :TypeBuilder, fld : ClassMember.Field, control :bool) : void
_C_>>        def name_field_loaded = Macros.UseSiteSymbol(fld.name.ToString() + "_loaded")                                      
_C_>>        def x = <[decl: mutable $(name_field_loaded : name) : bool ]>
_C_>>        typeBuilder.Define (x)
_C_>>


H>Так должно помочь:

H>
H>public registration(typeBuilder :TypeBuilder, fld : ClassMember.Field, control :bool) : void
H>        def name_field_loaded = Macros.NewSymbol(fld.name.ToString() + "_loaded")                                      
H>        def x = <[decl: mutable $(name_field_loaded : name) : bool ]>
H>        typeBuilder.Define (x)
H>


Ты не понял, оно меняется, а я не хочу. игры с контекстом и цветом не помогают — меняет хоть тресни. напр.
def ctx = Manager.MacroColors.UseContext;
def name_field_loaded = Name(fld.name.ToString() + "_loaded", 1, ctx)
def x = <[decl: mutable $(name_field_loaded : name) : bool ]>

меняет тоже. а какие ему цвет, контекст дать, чтобы не менял?
Re: проблема с обновлением макро-библиотеки
От: _Claus_  
Дата: 25.11.11 10:06
Оценка:
Когда тестирую макрос в проекте из использующего экзешника и проекта макроса, при правильно выставленных зависимостях для
макробиблиотеки, каким-то образом при билде используется старая версия макросов, даже несмотря на ребилд макро-библиотеки (!).
Я добавлял референс двойным кликом через список в вкладке Проекты в Macro References. при переносе ссылки в References ошибка ушла.
Re[2]: странное с цветом
От: VladD2 Российская Империя www.nemerle.org
Дата: 25.11.11 10:18
Оценка:
Здравствуйте, _Claus_, Вы писали:

Офотоа: Умеешь ты сформулировать вопрос так, что понять не удается.

_C_>проблема в изменении моего сгенерированного имени с обычного на _N_1_мое676.

_C_>делаю так.

_C_>
_C_>public registration(typeBuilder :TypeBuilder, fld : ClassMember.Field, control :bool) : void
_C_>        def name_field_loaded = Macros.UseSiteSymbol(fld.name.ToString() + "_loaded")                                      
_C_>        def x = <[decl: mutable $(name_field_loaded : name) : bool ]>
_C_>        typeBuilder.Define (x)
_C_>

_C_>name_field_loaded содержит то, что задумано — x_loaded, color == 1
_C_>fld.name имеет color == 1 но не меняется в итоговом коде.

С виду все нормально. Ну, кроме того, что все можно делать несколько проще:
public registration(typeBuilder :TypeBuilder, fld : ClassMember.Field, control :bool) : void
        def name_field_loaded = $"$(fld.name)_loaded"
        def x = <[decl: mutable $(name_field_loaded : usesite) : bool ]>
        typeBuilder.Define(x)


_C_>что это значит и как сделать, что хочу?


Я не понял, что означает фраза "не меняется в итоговом коде"?

В итоге ты должен получить поле с именем "Prop2_loaded" (если имя поля было "Prop2").

В общем, объясни что ты понимаешь под "в итоговом коде" и что (по-твоему) должно меняться.
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[3]: странное с цветом
От: _Claus_  
Дата: 25.11.11 10:24
Оценка:
VD>Я не понял, что означает фраза "не меняется в итоговом коде"?

VD>В итоге ты должен получить поле с именем "Prop2_loaded" (если имя поля было "Prop2").


VD>В общем, объясни что ты понимаешь под "в итоговом коде" и что (по-твоему) должно меняться.


в итоговом коде — это код который я формирую. макрос должен добавить имя, которое хочу — Prop2_loaded.

и код мой должен принять вид
mutable Prop2_loaded : bool

он несмотря на все мои извороты имею вот это

mutable _N_Prop2_loaded983 : bool

а я его не хочу.
Re[3]: странное с цветом
От: _Claus_  
Дата: 25.11.11 10:32
Оценка:
VD>Офотоа: Умеешь ты сформулировать вопрос так, что понять не удается.

есть малеха.

_C_>>проблема в изменении моего сгенерированного имени с обычного на _N_1_мое676.

_C_>>делаю так.

_C_>>
_C_>>public registration(typeBuilder :TypeBuilder, fld : ClassMember.Field, control :bool) : void
_C_>>        def name_field_loaded = Macros.UseSiteSymbol(fld.name.ToString() + "_loaded")                                      
_C_>>        def x = <[decl: mutable $(name_field_loaded : name) : bool ]>
_C_>>        typeBuilder.Define (x)
_C_>>

_C_>>name_field_loaded содержит то, что задумано — x_loaded, color == 1
_C_>>fld.name имеет color == 1 но не меняется в итоговом коде.

VD>С виду все нормально. Ну, кроме того, что все можно делать несколько проще:

VD>
VD>public registration(typeBuilder :TypeBuilder, fld : ClassMember.Field, control :bool) : void
VD>        def name_field_loaded = $"$(fld.name)_loaded"
VD>        def x = <[decl: mutable $(name_field_loaded : usesite) : bool ]>
VD>        typeBuilder.Define(x)
VD>


да это работает. а то что я написал — нет и ни за что. спасибо!
Re[4]: странное с цветом
От: VladD2 Российская Империя www.nemerle.org
Дата: 25.11.11 10:48
Оценка:
Здравствуйте, _Claus_, Вы писали:

_C_>Ты не понял, оно меняется, а я не хочу. игры с контекстом и цветом не помогают — меняет хоть тресни. напр.

_C_>def ctx = Manager.MacroColors.UseContext;
_C_>def name_field_loaded = Name(fld.name.ToString() + "_loaded", 1, ctx)
_C_>def x = <[decl: mutable $(name_field_loaded : name) : bool ]>

_C_>меняет тоже. а какие ему цвет, контекст дать, чтобы не менял?


Если твой код вызывается из макро-атрибута, то ничего меняться не должно.

Возможно у тебя рядом автосвойство размещено и оно дает это имя.

Как универсальное средство наплевать на гигиену можно вместо usesite или name указывать dyn, т.е.
<[ decl: mutable $("some_name" : dyn) : bool ]>
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[5]: странное с цветом
От: _Claus_  
Дата: 25.11.11 11:08
Оценка:
Здравствуйте, VladD2, Вы писали:

VD>Здравствуйте, _Claus_, Вы писали:


_C_>>Ты не понял, оно меняется, а я не хочу. игры с контекстом и цветом не помогают — меняет хоть тресни. напр.

_C_>>def ctx = Manager.MacroColors.UseContext;
_C_>>def name_field_loaded = Name(fld.name.ToString() + "_loaded", 1, ctx)
_C_>>def x = <[decl: mutable $(name_field_loaded : name) : bool ]>

_C_>>меняет тоже. а какие ему цвет, контекст дать, чтобы не менял?


VD>Если твой код вызывается из макро-атрибута, то ничего меняться не должно.

мамой клянусь меняет.

VD>Возможно у тебя рядом автосвойство размещено и оно дает это имя.

вообще не использую.

VD>Как универсальное средство наплевать на гигиену можно вместо usesite или name указывать dyn, т.е.

VD>
VD><[ decl: mutable $("some_name" : dyn) : bool ]>
VD>

очень мудреное с этими decl-ами , dyn-aми, .. чувствую что-то курили..
Re[4]: странное с цветом
От: VladD2 Российская Империя www.nemerle.org
Дата: 25.11.11 11:47
Оценка:
Здравствуйте, _Claus_, Вы писали:

_C_>и код мой должен принять вид

_C_>mutable Prop2_loaded : bool

Покажи весь код.

Я попытался воспроизвести твой код:
  Скрытый текст
using Nemerle;
using Nemerle.Collections;
using Nemerle.Compiler;
using Nemerle.Compiler.Parsetree;
using Nemerle.Compiler.Typedtree;
using Nemerle.Text;
using Nemerle.Utility;

using System;
using System.Collections.Generic;
using System.Linq;

namespace MacroLibrary
{
  [MacroUsage(MacroPhase.BeforeInheritance, MacroTargets.Property)]
  macro Ref(typeBuilder : TypeBuilder, property : ClassMember.Property)
  {
    RefImpl.DoTransform(Macros.ImplicitCTX(), typeBuilder, property)
  }
  
  module RefImpl
  {
    public DoTransform(typer : Typer, typeBuilder : TypeBuilder, property : ClassMember.Property) : void
    {
      Macros.DefineCTX(typer);
      def fieldsMap = Helpers.GetFieldsMap(typeBuilder);
      fieldsMap[property] = "REF";
      
      def name_field_loaded = Macros.UseSiteSymbol(property.name.ToString() + "_loaded");
      def x = <[decl: public mutable $(name_field_loaded : name) : bool ]>;
      typeBuilder.Define(x)
    }
  }
}

Проблем не обнаружил. Формируется поле с именем Prop2_loaded (у меня макрос на свойстве). Которое видно как в интеллисенсе (я специмально сделал его пабликом), так и ILSpy-ем.

И проверь, не используется ли у тебя старая версия. Замени Macro Reference на обычный Reference.

ЗЫ

Кстати, ты используешь бэту или релиз для 3.5-го фрэймворка?
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.