2012-02-14 47 views
5

Tôi đang triển khai trình thông dịch ngôn ngữ trong C# bằng cách sử dụng DLR và tôi đang gặp một số vấn đề với toán tử bậc ba. Tại thời điểm này, tôi có tờ khai chức năng cơ bản/cuộc gọi được thực hiện, như vậy:Cách triển khai toán tử Ternary trong DLR

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

tôi đã không có một vấn đề với một cơ quan chức năng là một chuỗi các biểu thức - giá trị của biểu thức cuối cùng luôn được trả về , và tôi đã đảm bảo tất cả các trường hợp trong thông dịch viên trả lại ít nhất một cái gì đó là một tác dụng phụ. Tôi đang cố gắng để thực hiện các nhà điều hành ternary (? :). Cây Biểu thức tôi vẽ trông giống như sau:

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

trong đó trueExp và falseExp là cả hai biểu thức hợp lệ.

Vấn đề có vẻ là biểu thức IfThenElse không trả về giá trị, vì vậy về cơ bản mặc dù trueExp và falseExp đang xây dựng cây biểu thức, kết quả cuối cùng của biểu thức IfThenElse luôn là rỗng. Ngắn của việc thực hiện một chức năng Runtime và rõ ràng gọi nó, là có một cách để thực hiện các nhà điều hành ternary bằng cách sử dụng DLR? (Ví dụ:.? Một Expression mà không được IfThenElse và trả về giá trị thực tế trong các điều khoản đúng và sai)

Những gì tôi hy vọng để phân tích là một cái gì đó như:

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

Nhưng ngay bây giờ này luôn trả về null khi được biên dịch thành một chương trình, vì vấn đề được nêu ở trên.

Tôi đánh giá cao bất kỳ trợ giúp nào, điều này khá là bực bội!

Trả lời

14

Expression.IfThenElse là cấu trúc if (...) ... else ...;, không phải là toán tử bậc ba.

Toán tử bậc ba là Expression.Condition

+0

Hoàn hảo! Cảm ơn bạn – Gakidou

+0

Có thể mô phỏng Expression.Condition with Expression.IfThenElse? tức là thay vì 'trả lại a? b: c' làm 'if (as) return b else return c;'? –

+0

@zespri: Nếu tất cả những gì bạn muốn làm là trả về một giá trị, chắc chắn. Trong trường hợp đó, chúng giống nhau. Rõ ràng là bạn không thể sử dụng IfThenElse * bên trong * một biểu thức khác, vì đó là một câu lệnh. Cá nhân tôi tìm thấy 'return a? b: c; 'dễ hiểu hơn. –

Các vấn đề liên quan