আমি ইমাসে সি # এর জন্য একটি সমাপ্তি (ইন্টেলিজেন্স) সুবিধা নিয়ে কাজ করছি।
ধারণাটিটি হ'ল, যদি কোনও ব্যবহারকারী কোনও খণ্ড টাইপ করেন, তবে নির্দিষ্ট কীস্ট্রোকের সংমিশ্রণের মাধ্যমে সমাপ্তির জন্য জিজ্ঞাসা করেন, সমাপ্তির সুযোগটি সম্ভাব্য পরিপূর্ণতা নির্ধারণের জন্য .NET প্রতিবিম্ব ব্যবহার করবে।
এটি করার জন্য প্রয়োজনীয় জিনিসটির ধরণটি সমাপ্ত হওয়া দরকার। যদি এটি একটি স্ট্রিং হয়, সম্ভাব্য পদ্ধতি এবং বৈশিষ্ট্যগুলির একটি পরিচিত সেট রয়েছে; যদি এটি কোনও ইন্টার 32 থাকে তবে এটির একটি পৃথক সেট রয়েছে, ইত্যাদি।
শব্দার্থক ব্যবহার করে, ইমাসে উপলব্ধ একটি কোড লেক্সার / পার্সার প্যাকেজ, আমি পরিবর্তনশীল ঘোষণা এবং তাদের প্রকারগুলি সনাক্ত করতে পারি। প্রদত্ত পদ্ধতিতে এবং ধরণের বৈশিষ্ট্যগুলি পেতে প্রতিবিম্বটি ব্যবহার করা সহজ, এবং তারপরে ব্যবহারকারীদের কাছে বিকল্পগুলির তালিকা উপস্থাপন করুন। (ঠিক আছে, পুরোপুরি সহজবোধ্য করতে মধ্যে Emacs কিন্তু ব্যবহার Emacs ভিতরে PowerShell প্রক্রিয়া চালানোর জন্য ক্ষমতা , এটা অনেক সহজ হয়ে যায়। আমি একটি কাস্টম .NET সমাবেশ elisp লিখতে প্রতিফলন করতে হবে, PowerShell সেটিকে লোড, এবং তারপর মধ্যে চলমান ইমাকস কমেন্টের মাধ্যমে পাওয়ারশেলগুলিতে কমান্ড পাঠাতে এবং প্রতিক্রিয়াগুলি পড়তে পারে। ফলস্বরূপ ইমাসগুলি প্রতিবিম্বের ফলাফলগুলি দ্রুত পেতে পারে get)
কোডটি যখন var
জিনিসটি সম্পন্ন হচ্ছে ঘোষণায় ব্যবহার করে তখন সমস্যাটি উপস্থিত হয় । তার মানে ধরণটি স্পষ্টভাবে নির্দিষ্ট করা হয়নি, এবং সমাপ্তি কাজ করবে না।
var
কীওয়ার্ডের সাথে ভেরিয়েবল ঘোষিত হলে আমি কীভাবে নির্ভরযোগ্যভাবে ব্যবহৃত প্রকৃত প্রকারটি নির্ধারণ করতে পারি ? কেবল পরিষ্কার করে বলার জন্য, রানটাইমে এটি নির্ধারণ করার দরকার নেই। আমি এটি "ডিজাইনের সময়" এ নির্ধারণ করতে চাই।
এখন পর্যন্ত আমার এই ধারণাগুলি রয়েছে:
- সংকলন এবং প্রার্থনা:
- ঘোষণাপত্রের বিবৃতিটি বের করুন, যেমন eg var foo = "একটি স্ট্রিংয়ের মান"; ``
- statement foo.GetType (); `একটি বিবৃতি যুক্ত করুন`
- পরিবর্তনশীল ফলাফল # সি খণ্ড এটি নতুন সমাবেশে কম্পাইল করুন
- অ্যাসেমব্লিকে নতুন অ্যাপডোমেনে লোড করুন, ফ্রেমমেন্টটি চালান এবং রিটার্নের ধরণটি পান।
- সমাবেশ আনলোড এবং বাতিল
আমি জানি কীভাবে এই সব করা যায়। তবে সম্পাদকীয়তে প্রতিটি সমাপ্তির অনুরোধের জন্য এটি দুর্দান্তভাবে ভারী ওজনের বলে মনে হচ্ছে।
আমি মনে করি প্রতিবার নতুন অ্যাপডোমেনের দরকার নেই। আমি একাধিক অস্থায়ী সমাবেশগুলির জন্য একটি একক অ্যাপডোমেন পুনরায় ব্যবহার করতে পারি এবং একাধিক সমাপ্তির অনুরোধগুলি জুড়ে এটি স্থাপন এবং ছিঁড়ে ফেলার ব্যয়কে আমরাইজ করতে পারি। এটি মৌলিক ধারণাটির আরও একটি টুইট।
- সংকলন এবং IL পরিদর্শন
সংকলক দ্বারা অনুমান করা হয়েছে এমন প্রকৃত ধরণটি নির্ধারণ করতে কেবল ঘোষণাটিকে একটি মডিউলে সংকলন করুন এবং তারপরে আইএল পরিদর্শন করুন। এটি কীভাবে সম্ভব হবে? আইএল পরীক্ষা করতে আমি কী ব্যবহার করব?
এখানে আরও ভাল ধারণা আছে? মন্তব্য? পরামর্শ?
সম্পাদনা - আরও এই সম্পর্কে চিন্তা করা, সংকলন এবং আহবান গ্রহণযোগ্য নয়, কারণ আহ্বানের পার্শ্ব প্রতিক্রিয়া হতে পারে। সুতরাং প্রথম বিকল্পটি বাতিল হতে হবে।
এছাড়াও, আমি মনে করি যে আমি .NET 4.0 এর উপস্থিতি ধরে নিতে পারি না।
আপডেট - সঠিক উত্তর, উপরে বর্ণিত নিঃশব্দে, তবে এরিক লিপার্ট আলতো করে নির্দেশ করেছেন, একটি পূর্ণ বিশ্বস্ততার ধরণের অনুক্রম সিস্টেম প্রয়োগ করা। ডিজাইনের সময় নির্ভরযোগ্যভাবে কোনও ভেরির ধরন নির্ধারণ করার একমাত্র উপায়। তবে এটি করাও সহজ নয়। যেহেতু আমি কোনও বিভ্রান্তি ভোগ করছি না যে আমি এই জাতীয় জিনিস তৈরির চেষ্টা করতে চাই, তাই আমি বিকল্প 2-এর শর্টকাট নিয়েছি - প্রাসঙ্গিক ঘোষণা কোডটি বের করুন এবং এটি সংকলন করুন, তারপরে ফলাফল আইএল পরিদর্শন করুন।
এটি সম্পূর্ণরূপে দৃশ্যের সুষ্ঠু উপসেটের জন্য কাজ করে।
উদাহরণস্বরূপ, ধরুন নীচের কোড টুকরা,? ব্যবহারকারী সেই অবস্থান যেখানে সমাপ্তির জন্য বলে। এইটা কাজ করে:
var x = "hello there";
x.?
সমাপ্তিটি বুঝতে পারে যে এক্স একটি স্ট্রিং, এবং উপযুক্ত বিকল্পগুলি সরবরাহ করে। এটি নিম্নলিখিত উত্স কোডটি উত্পন্ন ও সংকলন করে এটি করে:
namespace N1 {
static class dmriiann5he { // randomly-generated class name
static void M1 () {
var x = "hello there";
}
}
}
... এবং তারপরে সাধারণ প্রতিবিম্ব সহ IL পরিদর্শন করা।
এটিও কাজ করে:
var x = new XmlDocument();
x.?
ইঞ্জিনটি উত্পন্ন উত্স কোডে উপযুক্ত ক্লজগুলি যুক্ত করে যুক্ত করে, যাতে এটি সঠিকভাবে সংকলিত হয় এবং তারপরে আইএল পরিদর্শন একই হয়।
এটিও কাজ করে:
var x = "hello";
var y = x.ToCharArray();
var z = y.?
এর অর্থ হ'ল আইএল পরিদর্শনটিকে প্রথমটির পরিবর্তে তৃতীয় স্থানীয় পরিবর্তনশীলের ধরণটি খুঁজে পেতে হবে।
এবং এই:
var foo = "Tra la la";
var fred = new System.Collections.Generic.List<String>
{
foo,
foo.Length.ToString()
};
var z = fred.Count;
var x = z.?
... যা পূর্বের উদাহরণ মাত্র এক স্তর গভীর।
তবে, যা কাজ করে না তা কোনও স্থানীয় ভেরিয়েবলের সমাপ্তি যাঁর সূচনাটি কোনও উদাহরণের সদস্য বা স্থানীয় পদ্ধতির আর্গুমেন্টের যে কোনও সময়ে নির্ভর করে। ভালো লেগেছে:
var foo = this.InstanceMethod();
foo.?
বা লিনকিউ সিনট্যাক্স নয়।
এই জিনিসগুলি কতটা মূল্যবান তা নিয়ে আমি ভাবতে হবে আগে সম্পূর্ণ হওয়ার জন্য অবশ্যই এটি একটি "সীমিত নকশা" (হ্যাকের জন্য ভদ্র শব্দ) কী via
পদ্ধতির আর্গুমেন্ট বা উদাহরণ পদ্ধতিগুলির উপর নির্ভরতার সাথে ইস্যুটি মোকাবিলার একটি পদ্ধতিকে হ'ল কোডের টুকরোটিতে যে উত্পন্ন, সংকলন করা হয় এবং তারপরে আইএল বিশ্লেষণ করা হয়, একই ধরণের "সিন্থেটিক" স্থানীয় যুদ্ধগুলির সাথে সেগুলির উল্লেখ।
অন্য আপডেট - উদাহরণস্বরূপ সদস্যদের উপর নির্ভর করে ভারগুলির উপর সমাপ্তি এখন কাজ করে।
আমি যা করেছি তা টাইপটিকে (শব্দার্থ মাধ্যমে) জিজ্ঞাসাবাদ করা হয়েছিল এবং তারপরে সমস্ত বিদ্যমান সদস্যের জন্য সিন্থেটিক স্ট্যান্ড-ইন সদস্য তৈরি করা হয়েছিল। এই জাতীয় সি # বাফারের জন্য:
public class CsharpCompletion
{
private static int PrivateStaticField1 = 17;
string InstanceMethod1(int index)
{
...lots of code here...
return result;
}
public void Run(int count)
{
var foo = "this is a string";
var fred = new System.Collections.Generic.List<String>
{
foo,
foo.Length.ToString()
};
var z = fred.Count;
var mmm = count + z + CsharpCompletion.PrivateStaticField1;
var nnn = this.InstanceMethod1(mmm);
var fff = nnn.?
...more code here...
... উত্পন্ন কোড যা সংকলিত হয়, যাতে আমি আউটপুট থেকে শিখতে পারি স্থানীয় var nnn এর ধরণটি এরকম দেখাচ্ছে:
namespace Nsbwhi0rdami {
class CsharpCompletion {
private static int PrivateStaticField1 = default(int);
string InstanceMethod1(int index) { return default(string); }
void M0zpstti30f4 (int count) {
var foo = "this is a string";
var fred = new System.Collections.Generic.List<String> { foo, foo.Length.ToString() };
var z = fred.Count;
var mmm = count + z + CsharpCompletion.PrivateStaticField1;
var nnn = this.InstanceMethod1(mmm);
}
}
}
উদাহরণস্বরূপ এবং স্ট্যাটিক ধরণের সমস্ত সদস্য কঙ্কাল কোডে উপলব্ধ। এটি সফলভাবে সংকলন করে। এই মুহুর্তে, স্থানীয় বর্ণের প্রকারটি নির্ধারণ করা প্রতিবিম্বের মাধ্যমে সোজা।
এটি কী সম্ভব করে তোলে:
- ইমাসে পাওয়ারশেল চালনার ক্ষমতা
- সি # সংকলকটি সত্যিই দ্রুত। আমার মেশিনে, ইন-মেমরি অ্যাসেমবিলিটি সংকলন করতে প্রায় 0.5s লাগে। কী-স্ট্রোক বিশ্লেষণের জন্য পর্যাপ্ত দ্রুত নয়, তবে পর্যাপ্ত তালিকাগুলির অন-চাহিদা প্রজন্মকে সমর্থন করার জন্য এটি যথেষ্ট দ্রুত।
আমি এখনও লিনকিউতে দেখিনি।
এটি আরও অনেক বড় সমস্যা হয়ে উঠবে কারণ সিমেটিক লেক্সার / পার্সার ইম্যাকস সি # এর জন্য রয়েছে, লাইনকিউ করে না "