सी # में .NET 3.5 के साथ, आप इसके लिए Expression
का उपयोग कर सकते हैं; आप एक पैरामीटरयुक्त अभिव्यक्ति बना सकते हैं और उसके बाद इसे एक प्रतिनिधि को संकलित कर सकते हैं। यह वही है जो मैंने Finguistics के गणित पहलू के लिए किया था। मेरे पास अभी भी पार्सिंग कोड है जिसका उपयोग मैंने किया था ...
मैं जिस मुख्य चाल का उपयोग करता था वह था कि प्रतिनिधि प्रकार को ज्ञात रखने के लिए, मैंने इनपुट प्रकार के रूप में एक सरणी का उपयोग किया - विभिन्न तर्कों को एआर [0] , एआर 1, एआर [2] इत्यादि। इसका मतलब है कि मैं संकलित कर सकता हूं (उदाहरण के लिए) Func<decimal[], decimal>
(decimal
एस की एक सरणी लेता है, decimal
देता है)।
एक बार जब आप Compile()
कहलाते हैं, तो यह बहुत अधिक है कि आपके पास सीधे ऐसा करने के लिए कोड था।
(संपादित करें)
इस तरह से Expression
का उपयोग करने (हार्ड-कोडेड समारोह के साथ) का एक संक्षिप्त उदाहरण के रूप में, नीचे देखें। पार्सर मैंने पहले से ही लिखा है चेकर के रूप में काम करता है - यानी यह जांचने के लिए "? + (2 *? -?) = 22 +?" - लेकिन परिणाम को वापस करने के लिए इसे बदलना मुश्किल नहीं होगा (और sin
/pow
/आदि जैसे अधिक संचालन शुरू करें - संभावित रूप से उन्हें एक सहायक ऑब्जेक्ट पर सार्वजनिक तरीकों से मैप करके (Expression.Call
के माध्यम से) मैप करके)।
using System;
using System.Linq.Expressions;
static class Program
{
static void Main()
{
var args = Expression.Parameter(typeof(float[]), "args");
var x = Expression.ArrayIndex(args, Expression.Constant(0));
var y = Expression.ArrayIndex(args, Expression.Constant(1));
var add = Expression.Add(x, y);
var lambda = Expression.Lambda<Func<float[], float>>(add, args);
Func<float[], float> func = lambda.Compile();
Console.WriteLine(func.Call(1, 2));
Console.WriteLine(func.Call(3, 4));
Console.WriteLine(func.Call(5, 6));
}
static T Call<T>(this Func<T[], T> func, params T[] args)
{ // just allows "params" usage...
return func(args);
}
}
स्रोत
2009-02-21 10:59:16
कितनी जटिल अभिव्यक्ति? चार कार्य अंकगणित, या बहुत सामान्य तक सीमित? – Richard
कई पैरामीटर के साथ कार्यों सहित काफी जटिल हो सकता है। – Steve