2016-12-19 12 views
1

저는 동적 프로그래밍에 대해 말하는 것이 아닙니다.D 코드에서 AST로 작업 할 수 있습니까?

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

가 지금 만있어 :

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

단일 표현 기능 인수의 AST와 함께 직접 작업 할 수있는 가능성을 가지고 : 내 소원은 같은 구조와 컴파일 시간에 작업하는 것입니다 익명 함수 AST 구조에 대한 정보를 수집하는 일부 미친 더러운 방법으로 모든 연산자 (예 : +/-/*/./...)가있는 x 객체에 대한 특수 클래스를 사용하는 것이 좋습니다 (이 클래스 이 단일 표현식 함수에서 사용할 수있는 유일한 클래스입니다.).

단일 r 값에 대해 작은 AST와 유사합니다.

어떻게 든 기술적으로 가능합니까?

+2

람다를 사용하는 필터에 대한 간단한 질문이 아닙니까? – DejanLekic

+0

D 코드에 대해 AST를 조작하는 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

아니요, Walter는 과거에 상당히 반대했습니다. AST 매크로.