2016-12-19 12 views
1

Я не говорю о динамическом программировании. Мое желание работать во время компиляции с постройками, как:Возможно ли работать с AST внутри D-кода?

obj.where(x => x.some_val >= 14); // <-- LINQ-style :D 

Чтобы иметь возможность работать непосредственно с AST одностенного выражением функции-аргумент:

(>=) 
    |--(14) 
    +--(.) 
     |--(x) 
     +--(some_val) 

Теперь я получил только идея использовать какой-то специальный класс для x-объектов со всеми операторами (например, /-/*/./...), сильно переопределенный каким-то сумасшедшим грязным способом для сбора информации об анонимной функции AST-структуры (если и только если этот класс является единственным классом, используемым в этой функции с одним выражением).

Как крошечный АСТ для одиночного значения r.

Технически это возможно?

+2

Не то, что вы просите просто фильтр, используя лямбда ?? – DejanLekic

+0

Вы настаиваете на решении на основе D для управления АСТ для кода D, или вас интересует решение, которое может работать с исходным кодом D, но не внедрено в D? –

+0

@DejanLekic Фильтрация с lambda - довольно простой инструмент из стандартной библиотеки (нет, это было не то, что я искал). Жаль, вы делаете такие предположения, это значит, что мой вопрос кажется не очень умным :) –

ответ

2

Если вы хотите сгенерировать код во время компиляции, вы можете использовать строки со строками mixins. например

string foo(string name, int value) 
{ 
    return format("auto %s = %s;", name, value); 
} 

void bar() 
{ 
    mixin(foo("i", 42)); 
    assert(i == 42); 
} 

Это не особенно интересный пример, но до тех пор, как вы можете манипулировать строками в код, который вы хотите, то вы можете смешать их, что позволяет все виды возможностей генерации кода (как полезных и оскорбительных) ,

Однако, нет никакого способа фактически управлять АСТ в D. Как упоминалось в ответе Ричарда, а также в комментариях, Уолтер категорически против добавления таких возможностей к языку. Таким образом, маловероятно, чтобы D их когда-либо получал. Но учитывая, сколько вы можете сделать со строковыми миксинами, многое из того, что кто-то может захотеть сделать с макросами AST, может быть сделано со строковыми миксинами. Они позволяют создавать практически любой код, который вы, возможно, захотите. Они просто не позволяют вам манипулировать существующим кодом.

2

Нет, и Уолтер был против этого в прошлом, например, AST макросы.