Динамическая компиляция
Народ, есть среди вас те кто занимался этим вопросом ?
Смотря на чём. Если C++ .net или C#, то есть кода дом и лямбды.
Цитата: Ander Skirnir
Смотря на чём. Если C++ .net или C#, то есть кода дом и лямбды.
В Nemerle есть Nemerle.Evaluation.Evaluator, который вообще компилятор подгружает - аналог eval() в динамических языках.
http://habrahabr.ru/blogs/nemerle/48945/
Цитата: hardcase
В Nemerle есть Nemerle.Evaluation.Evaluator, который вообще компилятор подгружает - аналог eval() в динамических языках.
http://habrahabr.ru/blogs/nemerle/48945/
http://habrahabr.ru/blogs/nemerle/48945/
Только сейчас прочитал, что такое Nemerle и описание очень впечатлило. Но не совсем понятно, зачем в этом примере используют всякие eval'ы - разве, будь код близок к следующему, оно бы не скомпилило в ф-цию ?:
Код:
def function = x => x + 1.0 :> double->double;
Спрашиваю, потому что в лямбдах .net оно выглядит так:
Код:
Func<double,double> func = x => x + 1.0;
Цитата: Ander Skirnir
не совсем понятно, зачем в этом примере используют всякие eval'ы - разве, будь код близок к следующему, оно бы не скомпилило в ф-цию ?
Потому что это типичный пример динамической компиляции.
На месте строки, определяющей функцию можно поставить любой исполнимый код (для многострочных строк - какой каламбур - использую нотацию шаблонизатора <# #> ):
Код:
using System;
using System.Console;
using Nemerle.Utility;
using Nemerle.Evaluation.Evaluator;
module Program {
Main() : void {
def text = EvaluateExpression(
<#
def s = System.Text.StringBuilder();
foreach(n in [1 .. 5])
_ = s.Append($"$n : '$(System.Console.ReadLine())' ");
s.ToString()
#>) :> string;
WriteLine(text);
_ = ReadLine();
}
}
using System.Console;
using Nemerle.Utility;
using Nemerle.Evaluation.Evaluator;
module Program {
Main() : void {
def text = EvaluateExpression(
<#
def s = System.Text.StringBuilder();
foreach(n in [1 .. 5])
_ = s.Append($"$n : '$(System.Console.ReadLine())' ");
s.ToString()
#>) :> string;
WriteLine(text);
_ = ReadLine();
}
}
З.Ы. Класс скомпилировать Evaluator'ом вродебы нельзя... хотя теоретически там возможно всё - какнибудь покопаюсь в его кишках, там интересные вещи есть. :)
Цитата: Ander Skirnir
в лямбдах .net оно выглядит так:
Код:
Func<double,double> func = x => x + 1.0;
В Nemerle тоже самое вяглядит несколько лаконичнее:
Код:
def func(x) { x + 1.0 }
Помимо честной динамической компиляции, вроде bltookit, существует также пост-процессинг сборок на уровне MSIL, осуществляемый в PostSharp - это практический потолок метапрограммирования средствами C#. С позиции макросов Nemerle эта "технология" уныла чуть более чем полностью.