Просьба к тем у кого есть свободное время заняться простенькой но нужной задачей...
Нужно сделать удобную и простую в использовании обертку над ManagerClass позволяющую в 2-3 строчки создать компилятор как объект в памяти и скомпилировать им некоторые исходники.
Этот компонент должен иметь внятный и компактный интерфейс, а так же скрывать все детали вроде увеличения размера стека.
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Здравствуйте, VladD2, Вы писали:
VD>Нужно сделать удобную и простую в использовании обертку над ManagerClass позволяющую в 2-3 строчки создать компилятор как объект в памяти и скомпилировать им некоторые исходники.
VD>Этот компонент должен иметь внятный и компактный интерфейс, а так же скрывать все детали вроде увеличения размера стека.
Я бы попросил добавить контракты для компиляции PExpr.
Здравствуйте, Ziaw, Вы писали:
Z>Я бы попросил добавить контракты для компиляции PExpr.
Компиляция не может происходить в астрале. Нужен конкретный контекст: метод, проект и т.п. Так что просто компилировать PExpr нельзя. Можно сделать возможность получать тайпер верхнего уровня, а уже у него есть методы TypeExpr(). Но при компиляции в рамках некоторого макроса нужно использовать текущий тайпер.
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Здравствуйте, VladD2, Вы писали:
Z>>Я бы попросил добавить контракты для компиляции PExpr.
VD>Компиляция не может происходить в астрале. Нужен конкретный контекст: метод, проект и т.п. Так что просто компилировать PExpr нельзя. Можно сделать возможность получать тайпер верхнего уровня, а уже у него есть методы TypeExpr(). Но при компиляции в рамках некоторого макроса нужно использовать текущий тайпер.
Да нет, смысл в том, чтобы получить аналог LamdaExpression.Compile(), даем экспрешен, получаем функцию. Контекст для этого компонент компилятора должен сделать самостоятельно.
Здравствуйте, VladD2, Вы писали: VD>Этот компонент должен иметь внятный и компактный интерфейс, а так же скрывать все детали вроде увеличения размера стека.
Нужно что-то типа такого?
Скрытый текст
public class CompilerManager
{
_options : CompilationOptions;
public ManagerClass : ManagerClass;
Run():void
{
def thread = System.Threading.Thread(
fun()
{
unless(this.ManagerClass==null) this.ManagerClass.Run()
},
10*1024*1024*System.IntPtr.Size);
thread.Start();
thread.Join();
}
public this()
{
_options = CompilationOptions();
_options.LibraryPaths = [Environment.GetEnvironmentVariable("Nemerle")];
this.ManagerClass = ManagerClass(_options);
}
public MacrosToLoad : list[string]
{
get { _options.MacrosToLoad }
set { _options.MacrosToLoad = value}
}
public LibraryPaths : list[string]
{
get { _options.LibraryPaths }
set { _options.LibraryPaths = value }
}
public ReferencedLibraries : list[string]
{
get { _options.ReferencedLibraries }
set { _options.ReferencedLibraries = value }
}
public Compile(sources : list[string],targetIsExe:bool=false) : Assembly
{
Compile(sources,null,targetIsExe);
}
public Compile(sources : list[string],outputFile : string) : Assembly
{
Compile(sources,outputFile,if(System.IO.Path.GetExtension(outputFile) == "exe") true else false);
}
public Compile(sources : list[string],outputFile : string,targetIsExe : bool) : Assembly
{
_options.Sources = sources;
_options.TargetIsWinexe= targetIsExe;
_options.TargetIsLibrary = !targetIsExe;
if(!string.IsNullOrEmpty(outputFile))
{
_options.CompileToMemory = false;
_options.OutputFileName = outputFile;
}
else
{
_options.CompileToMemory = true;
}
Run();
this.ManagerClass.GeneratedAssembly
}
}
Здравствуйте, Ziaw, Вы писали:
Z>Да нет, смысл в том, чтобы получить аналог LamdaExpression.Compile(), даем экспрешен, получаем функцию. Контекст для этого компонент компилятора должен сделать самостоятельно.
Т.е. на выходе лямбду делать? Это можно.
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.