2012-02-14 8 views
5

DLR을 사용하는 C#에서 언어 인터프리터를 구현 중이며 삼항 연산자에 문제가 있습니다. 이 시점에서, 정말 같은 기본 함수 선언/통화 구현이 :DLR에 삼항 연산자를 구현하는 방법

F := (x) -> x + 1 
F(1) # returns 2 

내가 함수 몸이 표현의 순서 인 문제가 없었습니다 - 항상 반환 마지막 표현식의 값을 , 나는 통역사의 모든 사례가 적어도 뭔가를 반환했는지 확인했습니다. 부작용으로는입니다. 나는 이제 삼항 연산자 (? :)를 구현하려고합니다. 표현식 트리는 다음과 같이 보입니다.

work = Expression.IfThenElse(         
    Expression.IsTrue(Expression.Convert(work, typeof(Boolean))), 
    trueExp, 
    falseExp); 

여기서 trueExp와 falseExp는 모두 유효한 표현식입니다.

문제는 IfThenElse식이 값을 반환하지 않으므로 기본적으로 trueExp 및 falseExp가 식 트리를 작성하고 있지만 IfThenElse 식의 최종 결과는 항상 null입니다. 런타임 함수를 작성하고 명시 적으로 호출하는 것보다 짧은 방법으로 DLR을 사용하는 삼항 연산자를 구현할 수 있습니까?

F := (x) -> (x = 1) ? 4 : 5 
F(1) #4 
F(2) #5 

하지만 지금이 항상 null 반환합니다 (예 :.? 표현식 IfThenElse을 수행하고 참과 거짓 조항에 실제 값을 반환)

내가 구문 분석을 희망하는 것은 무엇인가이다 위에 설명 된 문제로 인해 프로그램으로 컴파일 될 때.

나는 어떤 도움을 주셔서 감사합니다.

답변

14

Expression.IfThenElse은 3 진수 연산자가 아니라 if (...) ... else ...; 구조체입니다.

세 연산자는 Expression.Condition

+0

입니다. 감사합니다 – Gakidou

+0

Expression.IfThenElse로 Expression.Condition을 에뮬레이트 할 수 있습니까? 즉'return a? b : c'''' (as)를 반환한다면 b'' else'' return c;'? –

+0

@ zespri : 원하는 것은 값을 반환하는 것뿐입니다. 이 경우 그들은 동일합니다. 당연히 IfThenElse *를 다른 표현식 내부에서 사용할 수는 없습니다. 개인적으로 나는'return a? b : c;'더 쉽게 이해할 수 있습니다. –

관련 문제