If you do not find what you're looking for, you can use more accurate words.
البرمجة تدعم لغة دي خمسة نماذج برمجة رئيسية وهي الأمرية والكائنية والبرمجة العلياوالوظيفية والتزامن.
إن البرمجة الأمرية في لغة دي هي الأكثر ارتباطا بلغة سي C. وتعمل الدوال والبيانات والإعلانات والتعبيرات بطريقة مشابهة تماما للغة سي، ويمكن الوصول لمكتبة وقت تشغيل سي مباشرة. وهناك بعض الاختلافات الملحوظة بين دي وسي في مجال البرمجة الأمرية بما فيها حلقة foreach، والذي يسمح بالالتفاف حول المجموعات، والدوال المتداخلة، وهي الدوال التي تعلن داخل دوال أخرى ويمكنها الوصول إلى الدالة المتضمنة للمتغيرات المحلية.
إن البرمجة القائمة على الكائن في دي تقوم على تراتبية موروثة واحدة، مع جميع الفئات المشتقة من فئة الكائن Object. ولا تدعم لغة دي الموروث المتعدد؛ وبدلا من ذلك فإنها تستخدم واجهات بأسلوب الجافا، والتي يمكن مقارنتها بالفئات المجردة الصرفة للغة C++، والفئات mixins، والتي تسمح بفصل الوظيفية المشتركة عن التراتبية الموروثة. إضافة إلى ذلك فإن دي 2.0 تسمح بإعلان الطرق الثابتة والنهائية (غير الظاهرية) في الواجهات.
تدعم البرمجة الأعلى مجموعة من القوالب، وتنفيذ وظيفة تصريف الوقت، التتابعات tuples، وسلسلة الفئات. وتظهر النماذج التالية بعضا من مميزات تصريف الوقت في لغة دي. ويمكن أن تكون القوالب في لغة دي مكتوبة في أسلوب أكثر شبها بالوظيفة مقارنة بما هو عليه الحال في سي++. وهذه وظيفة منتظمة تحسب مضروب رقم ما:
ulong factorial(ulong n) { if(n <2) return 1; else return n * factorial(n - 1); }
وهنا فإن استخدام إذا الثابتة، وهي البنية الشرطية لتصريف الوقت في لغة دي، يظهر لبناء قالب يقوم بنفس الحساب باستخدام الشفرة التي تشبه الوظيفة المذكورة عاليه:
template Factorial(ulong n) { static if(n <2) const Factorial = 1; else const Factorial = n * Factorial!(n - 1); }
وفي المثالين التاليين، فإن كلا من القالب والوظيفة المحددان عاليه يستخدمان لحساب المضاعفات. إن أنواع الثوابت ليست بحاجة إلى وضوح محدد كما هو حال المصرف في استنباط أنواعها من الجوانب اليمنى للواجبات:
const fact_7 = Factorial!(7);
وفيما يلي مثال على تنفيذ وظيف تصريف الوقت. يمكن استخدام الوظائف المعتادة في التعبيرات الثابتة والمصرفة زمنيا بشرط أن تلبي معايير معينة:
const fact_9 = factorial(9);
ويؤدي قالب std.metastrings.Formatمهمة تنسيق البيانات الذي يشبه طباعة إف printf، ويستعرض "msg" pragma النتيجة عند وقت التصرف:
import std.metastrings; pragma(msg, Format!("7! = %s", fact_7)); pragma(msg, Format!("9! = %s", fact_9));
إن سلسلة الفئات Mixins، بالترافق مع تنفيذ وظيفة تصريف الوقت، تسمح بتوليد شفرة دي باستخدام عمليات مسلسلة عند وقت التصرف. ويمكن أن يستخدم ذلك لتحليل اللغات محددة النطاق لشفرة دي، والتي سيتم التصرف فيها كجزء من البرنامج
import std.algorithm, std.range, std.stdio; int main() { int[] a1 = [0,1,2,3,4,5,6,7,8,9]; int[] a2 = [6,7,8,9]; immutable pivot = 5; // must be immutable to allow access from inside mysum int mysum(int a, int b) pure // pure function { if (b <= pivot) // ref to enclosing-scope return a + b; else return a; } auto result = reduce!(mysum)( chain(a1, a2) ); // passing a delegate (closure) writeln("Result: ", result); // output is "15" return 0; }
D 2.0 only.
import std.algorithm, std.range, std.stdio; int main() { int[] a1 = [0,1,2,3,4,5,6,7,8,9]; int[] a2 = [6,7,8,9]; immutable pivot = 5; // must be immutable to allow access from inside mysum int mysum(int a, int b) pure // pure function { if (b <= pivot) // ref to enclosing-scope return a + b; else return a; } auto result = reduce!(mysum)( chain(a1, a2) ); // passing a delegate (closure) writeln("Result: ", result); // output is "15" return 0; }
D 2.0 only.
import std.concurrency, std.stdio, std.typecons; int main() { auto tid = spawn(&foo); // create an actor object foreach(i; 0 .. 10) tid.send(i); // send some integers tid.send(1.0f); // send a float tid.send("hello"); // send a string tid.send(thisTid); // send an object (Tid) receive( (int x) { writeln("Main thread receives message: ", x); }); return 0; } void foo() { bool cont = true; while (cont) { receive( // pattern matching (int msg) { writeln("int receive: ", msg); }, // int type (Tid sender){ cont = false; sender.send(-1); }, // object type (Variant v) { writeln("huh?"); } // any type ); } }