لغة البرمجة Scheme
لغة Scheme هي لهجة من عائلة لغات البرمجة Lisp . طُوّرت Scheme خلال سبعينيات القرن العشرين في مختبر علوم الحاسوب والذكاء الاصطناعي التابع لمعهد ماساتشوستس للتكنولوجيا (MIT CSAIL)، وأصدرها مطوروها، جاي إل. ستيل وجيرالد جاي سوسمان ، عبر سلسلة من المذكرات تُعرف الآن باسم أوراق لامدا . كانت Scheme أول لهجة من Lisp تختار النطاق المعجمي ، والأولى التي تشترط على التطبيقات إجراء تحسين استدعاء الذيل ، مما وفّر دعمًا أقوى للبرمجة الوظيفية والتقنيات المرتبطة بها، مثل الخوارزميات التكرارية. كما كانت من أوائل لغات البرمجة التي تدعم الاستمراريات من الدرجة الأولى . كان لها تأثير كبير على الجهود التي أدت إلى تطوير Common Lisp . [ 2 ]
لغة Scheme موحدة في معيار معهد مهندسي الكهرباء والإلكترونيات (IEEE) الرسمي [ 3 ] ، وفي معيار فعلي يُعرف باسم التقرير المنقح للغة Scheme الخوارزمية ( RnRS ). يُعدّ R5RS (1998) معيارًا واسع الانتشار. [ 4 ] أما أحدث معيار مُعتمد للغة Scheme فهو "R7RS-small" (2013). [ 5 ] بينما اعتُمد معيار R6RS الأكثر شمولًا ووحداتية في عام 2007. [ 6 ] ويعود أصل كلا المعيارين إلى R5RS؛ ويعكس الجدول الزمني أدناه الترتيب الزمني للاعتماد.
تاريخ
الأصول
بدأت لغة Scheme في سبعينيات القرن العشرين كمحاولة لفهم نموذج الممثل لكارل هيويت ، ولهذا الغرض كتب ستيل وسوسمان "مترجمًا مصغرًا للغة Lisp" باستخدام Maclisp ، ثم أضافا "آليات لإنشاء الممثلين وإرسال الرسائل". [ 7 ] سُميت Scheme في الأصل "Schemer"، على غرار لغات أخرى مشتقة من Lisp مثل Planner و Conniver . نتج الاسم الحالي عن استخدام المؤلفين لنظام التشغيل ITS ، الذي كان يقيد أسماء الملفات بمكونين لا يتجاوز كل منهما ستة أحرف. يُستخدم مصطلح "Schemer" حاليًا للإشارة إلى مبرمج Scheme.
R6RS
بدأت عملية توحيد اللغة الجديدة في ورشة عمل Scheme لعام 2003، بهدف إنتاج معيار R6RS في عام 2006. وقد انفصلت هذه العملية عن نهج R n RS السابق القائم على الإجماع.
يتميز معيار R6RS بنظام وحدات نمطية قياسي، مما يسمح بفصل اللغة الأساسية عن المكتبات . وقد صدرت عدة مسودات لمواصفات R6RS، وكانت النسخة النهائية هي R5.97RS. وأسفر تصويت ناجح عن المصادقة على المعيار الجديد، الذي أُعلن عنه في 28 أغسطس 2007. [ 6 ]
تدعم أحدث إصدارات تطبيقات Scheme المختلفة حاليًا [ 8 ] معيار R6RS. يوجد تطبيق مرجعي محمول للمكتبات المقترحة ذات المراحل الضمنية لـ R6RS، يُسمى psyntax، والذي يتم تحميله وتهيئته بشكل صحيح على العديد من تطبيقات Scheme القديمة. [ 9 ]
من ميزات R6RS مُعرِّف نوع السجل (RTD). عند إنشاء RTD واستخدامه، يُمكن لتمثيل نوع السجل إظهار تخطيط الذاكرة. كما يقوم بحساب قناع بت حقل الكائن وأقنعة بت حقل كائن Scheme القابلة للتغيير، ويُساعد جامع البيانات المهملة على معرفة كيفية التعامل مع الحقول دون الحاجة إلى استعراض قائمة الحقول الكاملة المحفوظة في RTD. يُتيح RTD للمستخدمين توسيع RTD الأساسي لإنشاء نظام سجلات جديد. [ 10 ]
يُدخل R6RS العديد من التغييرات الهامة على اللغة. [ 11 ] أصبح رمز المصدر مُحددًا الآن باستخدام Unicode ، ويمكن الآن ظهور مجموعة فرعية كبيرة من أحرف Unicode في رموز ومعرفات Scheme ، بالإضافة إلى تغييرات طفيفة أخرى على القواعد المعجمية. كما أصبحت بيانات الأحرف مُحددة الآن باستخدام Unicode. نُقلت العديد من الإجراءات القياسية إلى المكتبات القياسية الجديدة، والتي تُشكل بدورها توسعًا كبيرًا للمعيار، حيث تحتوي على إجراءات وأشكال نحوية لم تكن جزءًا من المعيار سابقًا. تم تقديم نظام وحدات جديد، وأصبحت أنظمة معالجة الاستثناءات موحدة. استُبدلت قواعد بناء الجملة بمرفق تجريد نحوي أكثر تعبيرًا (syntax-case) يسمح باستخدام Scheme بالكامل عند توسيع وحدات الماكرو. يُشترط الآن على التطبيقات المتوافقة دعم برج Scheme العددي الكامل ، وتم توسيع دلالات الأرقام، لا سيما في اتجاه دعم معيار IEEE 754 للتمثيل العددي ذي الفاصلة العائمة.
R7RS
أثار معيار R6RS جدلاً واسعاً، إذ يراه البعض خروجاً عن فلسفة التبسيط. [ 12 ] [ 13 ] في أغسطس/آب 2009، أعلنت اللجنة التوجيهية للغة Scheme، المشرفة على عملية التقييس، عن نيتها التوصية بتقسيم Scheme إلى لغتين: لغة برمجة حديثة واسعة النطاق للمبرمجين؛ ونسخة مصغرة، وهي مجموعة فرعية من النسخة الكبيرة، تحافظ على التبسيط الذي يُشيد به التربويون والمستخدمون العاديون. [ 14 ] شُكِّل فريقا عمل لتطوير هاتين النسختين الجديدتين من Scheme. يحتوي موقع "عملية تقارير Scheme" على روابط لمواثيق فريقي العمل، والمناقشات العامة، ونظام تتبع المشكلات.
أُتيحت المسودة التاسعة من R7RS (بصيغتها المختصرة) في 15 أبريل 2013. [ 15 ] واختُتم التصويت على المصادقة على هذه المسودة في 20 مايو 2013، [ 16 ] وأصبح التقرير النهائي متاحًا منذ 6 أغسطس 2013، ويصف "الصيغة المختصرة" لهذا الجهد: لذلك لا يمكن اعتباره بمعزل عن غيره خليفةً لـ R6RS". [ 5 ]
| 1958 | 1960 | 1965 | 1970 | 1975 | 1980 | 1985 | 1990 | 1995 | 2000 | 2005 | 2010 | 2015 | 2020 | ||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| LISP 1، 1.5، LISP 2 (مهجورة) | |||||||||||||||
| ماكليس | |||||||||||||||
| تداخل | |||||||||||||||
| MDL | |||||||||||||||
| آلة التأتأة | |||||||||||||||
| مخطط | R5RS | R6RS | R7RS صغير | ||||||||||||
| لا شيء | |||||||||||||||
| ZIL (لغة تنفيذ Zork) | |||||||||||||||
| فرانز ليسب | |||||||||||||||
| muLisp | |||||||||||||||
| لغة الشفرة الشائعة | معيار ANSI | ||||||||||||||
| لي لِسْب | |||||||||||||||
| مخطط معهد ماساتشوستس للتكنولوجيا | |||||||||||||||
| XLISP | |||||||||||||||
| تي | |||||||||||||||
| شيز سكيم | |||||||||||||||
| إيماكس ليسب | |||||||||||||||
| أوتو ليسب | |||||||||||||||
| PicoLi sp | |||||||||||||||
| غامبيت | |||||||||||||||
| EuLisp | |||||||||||||||
| لغة ISLISP | |||||||||||||||
| أوبن ليسب | |||||||||||||||
| مخطط PLT | مضرب | ||||||||||||||
| لغة نيو ليسب | |||||||||||||||
| جنو غايل | |||||||||||||||
| لغة ليسب المرئية | |||||||||||||||
| كلوجر | |||||||||||||||
| قوس | |||||||||||||||
| LFE | |||||||||||||||
| هي | |||||||||||||||
السمات المميزة
لغة Scheme هي في الأساس لغة برمجة وظيفية . تشترك في العديد من الخصائص مع لغات أخرى من عائلة Lisp. يعتمد تركيب Scheme البسيط للغاية على تعابير s ، وهي قوائم بين قوسين حيث يتبع عامل التشغيل وسيطاته. وبالتالي، تتكون برامج Scheme من سلاسل من القوائم المتداخلة. تُعد القوائم أيضًا بنية البيانات الرئيسية في Scheme، مما يؤدي إلى تكافؤ وثيق بين تنسيقات الشيفرة المصدرية والبيانات ( التماثل ). يمكن لبرامج Scheme إنشاء أجزاء من شيفرة Scheme وتقييمها ديناميكيًا بسهولة.
تعتمد جميع لهجات لغة ليسب على القوائم كبنية بيانات. ترث لغة سكيم مجموعة غنية من أدوات معالجة القوائم، مثل cons` list` carو`cdr list` ، من لغات ليسب الأصلية. تستخدم سكيم متغيرات ذات أنواع محددة بدقة ولكن بديناميكية ، وتدعم الإجراءات من الدرجة الأولى . بالتالي، يمكن إسناد قيم للمتغيرات إلى الإجراءات أو تمريرها كوسائط إليها.
يركز هذا القسم بشكل أساسي على الميزات المبتكرة للغة، بما في ذلك تلك التي تميز Scheme عن لغات Lisp الأخرى. ما لم يُذكر خلاف ذلك، فإن أوصاف الميزات تتعلق بمعيار R5RS. في الأمثلة الواردة في هذا القسم، يُستخدم الرمز "===> result" للإشارة إلى نتيجة تقييم التعبير في السطر السابق مباشرةً. وهذا هو نفس الاصطلاح المُستخدم في R5RS.
تقليلية
لغة Scheme بسيطة للغاية، وأسهل بكثير في التنفيذ من العديد من اللغات الأخرى ذات القدرة التعبيرية المماثلة . [ 17 ] تُعزى هذه السهولة إلى استخدام حساب لامدا لاشتقاق جزء كبير من بنية اللغة من أشكال أكثر بدائية. على سبيل المثال، من بين 23 بنية نحوية قائمة على تعبيرات s والمحددة في معيار R5RS Scheme، تُصنف 14 بنية على أنها أشكال مشتقة أو مكتبية، والتي يمكن كتابتها كوحدات ماكرو تتضمن أشكالًا أكثر أساسية، ولا سيما تعبيرات لامدا. وكما ينص معيار R5RS (الفقرة 3.1): "إن أبسط بنى ربط المتغيرات هي تعبير لامدا، لأنه يمكن شرح جميع بنى ربط المتغيرات الأخرى باستخدام تعبيرات لامدا." [ 4 ]
- الأشكال الأساسية : define، lambda، quote، if، define-syntax، let-syntax، letrec-syntax، syntax-rules، set!
- الأشكال المشتقة : do، let، let*، letrec، cond، case، و، أو، begin، named let، delay، unquote، unquote-splicing، quasiquote
مثال: ماكرو يتم تنفيذه letكتعبير باستخدام lambdaلإجراء ربط المتغيرات.
( define-syntax let ( syntax-rules () (( let (( var expr ) ... ) body ... ) (( lambda ( var ... ) body ... ) expr ... ))))وبالتالي، فإن استخدام letتطبيق Scheme كما هو محدد أعلاه سيعيد كتابة " (let ((a 1)(b 2)) (+ b a))" كـ " ((lambda (a b) (+ b a)) 1 2)"، مما يقلل مهمة التنفيذ إلى مجرد كتابة التعليمات البرمجية لإنشاء الإجراءات.
في عام ١٩٩٨، لاحظ سوسمان وستيل أن بساطة لغة سكيم لم تكن هدفًا تصميميًا مقصودًا، بل كانت نتيجة غير متوقعة لعملية التصميم. "كنا نحاول في الواقع بناء شيء معقد، واكتشفنا، مصادفةً، أننا صممنا بالصدفة شيئًا يحقق جميع أهدافنا ولكنه أبسط بكثير مما كنا نعتزم... أدركنا أن حساب لامدا - وهو شكل بسيط وصغير - يمكن أن يكون بمثابة جوهر لغة برمجة قوية ومعبرة." [ ٧ ]
النطاق المعجمي
على غرار معظم لغات البرمجة الحديثة، وعلى عكس لغات ليسب السابقة مثل ماك ليسب ، فإن لغة سكيم تعتمد على النطاق المعجمي: إذ يمكن تحليل جميع روابط المتغيرات الممكنة في وحدة البرنامج بقراءة نص الوحدة دون النظر إلى السياقات التي قد تُستدعى فيها. وهذا يتناقض مع النطاق الديناميكي الذي كان سمة مميزة لهجات ليسب المبكرة، نظرًا لتكاليف المعالجة المرتبطة بأساليب الاستبدال النصي البدائية المستخدمة لتنفيذ خوارزميات النطاق المعجمي في المترجمات والمفسرات آنذاك. في تلك اللغات، كان من الممكن تمامًا أن يشير مرجع إلى متغير حر داخل إجراء إلى روابط مختلفة تمامًا خارج ذلك الإجراء، وذلك تبعًا لسياق الاستدعاء.
كان الدافع وراء دمج النطاق المعجمي، الذي كان نموذج نطاق غير مألوف في أوائل سبعينيات القرن العشرين، في نسختهم الجديدة من لغة ليسب، نابعًا من دراسات سوسمان للغة ألغول . فقد اقترح أن آليات النطاق المعجمي الشبيهة بلغة ألغول ستساعد في تحقيق هدفهم الأولي المتمثل في تطبيق نموذج الممثل لكارل هيويت في لغة ليسب. [ 7 ]
تم نشر الأفكار الرئيسية حول كيفية إدخال النطاق المعجمي في لهجة لغة Lisp في ورقة ساسمان وستيل لعام 1975 بعنوان "Scheme: مترجم لحساب لامدا الموسع"، [ 18 ] حيث تبنوا مفهوم الإغلاق المعجمي (في الصفحة 21)، والذي تم وصفه في مذكرة الذكاء الاصطناعي في عام 1970 بواسطة جويل موسى ، الذي نسب الفكرة إلى بيتر جيه لاندين . [ 19 ]
حساب التفاضل والتكامل لامدا
استلهمت لغة ليسب استخدام كلمة "لامدا" ككلمة مفتاحية لتقديم إجراء من الترميز الرياضي الذي وضعه ألونزو تشيرش ، كما أثرت هذه الترميز على تطوير تقنيات البرمجة الوظيفية التي تتضمن استخدام الدوال ذات الرتبة العليا في ليسب. إلا أن إصدارات ليسب المبكرة لم تكن تعبيرات مناسبة لحساب لامدا بسبب طريقة تعاملها مع المتغيرات الحرة . [ 7 ]
يحتوي نظام لامدا الرسمي على بديهيات وقاعدة حسابية كاملة. وهو مفيد للتحليل باستخدام المنطق والأدوات الرياضية. في هذا النظام، يمكن اعتبار الحساب استنتاجًا اتجاهيًا. يتبع بناء جملة حساب لامدا التعبيرات التكرارية من x، y، z، ...، والأقواس، والمسافات، والنقطة، والرمز λ. [ 20 ] تشمل وظائف حساب لامدا ما يلي: أولًا، أن يكون نقطة انطلاق لمنطق رياضي قوي. ثانيًا، يمكنه تقليل حاجة المبرمجين إلى مراعاة تفاصيل التنفيذ، لأنه يمكن استخدامه لمحاكاة التقييم الآلي. أخيرًا، أنشأ حساب لامدا نظرية فوقية جوهرية. [ 21 ]
أدى إدخال النطاق المعجمي إلى حل المشكلة من خلال إيجاد تكافؤ بين بعض أشكال تدوين لامدا وتعبيرها العملي في لغة برمجة عاملة. بيّن سوسمان وستيل أن اللغة الجديدة يمكن استخدامها لاستنتاج جميع الدلالات الإجرائية والتصريحية للغات برمجة أخرى، بما في ذلك ALGOL و Fortran ، والنطاق الديناميكي للغات Lisp الأخرى، وذلك باستخدام تعابير لامدا ليس كإنشاءات بسيطة للإجراءات، بل كـ"هياكل تحكم ومعدلات للبيئة". [ 22 ] قدّما أسلوب تمرير الاستمرارية مع أول وصف لهما للغة Scheme في أولى أوراق لامدا، وفي أوراق لاحقة، واصلا إظهار القوة الكامنة لهذا الاستخدام العملي لحساب لامدا.
بنية الكتل
تستمد لغة Scheme بنيتها الكتلية من لغات البرمجة السابقة ذات البنية الكتلية، وخاصةً لغة ALGOL . في Scheme، تُنفَّذ الكتل بثلاثة بنيات ربط : letو let*و letrec. على سبيل المثال، تُنشئ البنية التالية كتلةً يُربط فيها رمزٌ يُسمى varبالرقم 10:
( define var "goose" ) ;; أي إشارة إلى المتغير هنا ستُربط بالمتغير "goose". ( let (( var 10 )) ;; تُكتب العبارات هنا. أي إشارة إلى المتغير هنا ستُربط بالمتغير 10. ) ;; أي إشارة إلى المتغير هنا ستُربط بالمتغير "goose".يمكن تداخل الكتل البرمجية لإنشاء هياكل كتل معقدة حسب حاجة المبرمج. ويُقلل استخدام بنية الكتل لإنشاء روابط محلية من خطر تضارب مساحات الأسماء الذي قد يحدث لولا ذلك.
يسمح أحد أشكال let، let*، للروابط بالإشارة إلى المتغيرات التي تم تعريفها مسبقًا في نفس البنية، على النحو التالي:
( let* (( var1 10 ) ( var2 ( + var1 12 ))) ;; لكن تعريف var1 لا يمكن أن يشير إلى var2 )أما المتغير الآخر، letrecفقد صُمم لتمكين ربط الإجراءات المتكررة المتبادلة ببعضها البعض.
حساب تسلسلات هوفستاتر للذكور والإناث كقائمة من الأزواج( define ( hofstadter- male -female n ) ( letrec (( female ( lambda ( n ) ( if ( = n 0 ) 1 ( -n ( male ( female ( -n 1 ) ))))))) ( male ( lambda ( n ) ( if ( = n 0 ) 0 ( -n ( female ( male ( -n 1 ) ))))))) ( let loop (( i 0 )) ( if ( > i n ) ' () ( cons ( cons ( female i ) ( male i )) ( loop ( + i 1 ))))) ) ))( hofstadter-male-female 8 )===> (( 1 . 0 ) ( 1 . 0 ) ( 2 . 1 ) ( 2 . 2 ) ( 3 . 2 ) ( 3 . 3 ) ( 4 . 4 ) ( 5 . 4 ) ( 5 . 5 ))(انظر إلى تسلسلات هوفستاتر للذكور والإناث للاطلاع على التعريفات المستخدمة في هذا المثال.)
يمكن لجميع الإجراءات المرتبطة في إجراء واحد letrecأن تشير إلى بعضها البعض بالاسم، وكذلك إلى قيم المتغيرات التي تم تعريفها سابقًا في نفس الإجراء letrec، ولكن لا يجوز لها أن تشير إلى القيم التي تم تعريفها لاحقًا في نفس الإجراء letrec.
يحتوي أحد أشكال letlet، وهو شكل "let المُسمى"، على مُعرِّف بعد الكلمة letالمفتاحية. يربط هذا المُعرِّف متغيرات let بوسيط إجراء يحمل اسم المُعرِّف المُعطى، ويكون جسمه هو جسم شكل let. يمكن تكرار الجسم حسب الرغبة عن طريق استدعاء الإجراء. يُستخدم let المُسمى على نطاق واسع لتنفيذ التكرار.
مثال: عداد بسيط
( let loop (( n 1 )) ( if ( > n 10 ) ' () ( cons n ( loop ( + n 1 )))))===> ( 1 2 3 4 5 6 7 8 9 10 )مثل أي إجراء في لغة Scheme، فإن الإجراء الذي تم إنشاؤه في let المسمى هو كائن من الدرجة الأولى.
التكرار الذيل الصحيح
تحتوي لغة Scheme على بنية تكرارية، doولكن من الأنسب في Scheme استخدام الاستدعاء الذيل للتعبير عن التكرار . تتطلب تطبيقات Scheme المتوافقة مع المعايير تحسين استدعاءات الذيل لدعم عدد غير محدود من استدعاءات الذيل النشطة (R5RS القسم 3.5) [ 4 ] - وهي خاصية يصفها تقرير Scheme بأنها استدعاء ذيل صحيح - مما يجعل من الآمن لمبرمجي Scheme كتابة خوارزميات تكرارية باستخدام هياكل تكرارية، والتي تكون أحيانًا أكثر سهولة في الفهم. توفر الإجراءات ذات الاستدعاء الذيل والصيغة المسماةlet دعمًا للتكرار باستخدام الاستدعاء الذيل.
;; إنشاء قائمة بالمربعات من 0 إلى 9: ;; ملاحظة: كلمة loop هي مجرد رمز عشوائي يُستخدم كعلامة. أي رمز سيفي بالغرض.( define ( list- of -squares n ) ( let loop (( i n ) ( res ' ())) ( if ( < i 0 ) res ( loop ( -i 1 ) ( cons ( * ii ) res ) ))))( قائمة المربعات 9 ) ===> ( 0 1 4 9 16 25 36 49 64 81 )استمرارات من الدرجة الأولى
تُعتبر الاستمراريات في لغة Scheme كائنات من الدرجة الأولى . توفر Scheme الإجراء call-with-current-continuation(المعروف أيضًا باسم call/cc) لالتقاط الاستمرارية الحالية عن طريق تجميعها كإجراء هروب مرتبط بوسيط رسمي في إجراء يوفره المبرمج. (R5RS القسم 6.4) [ 4 ] تُمكّن الاستمراريات من الدرجة الأولى المبرمج من إنشاء بنيات تحكم غير محلية مثل المُكرِّرات ، والروتينات الفرعية ، والتراجع .
يمكن استخدام الاستمراريات لمحاكاة سلوك عبارات الإرجاع في لغات البرمجة الإجرائية. الدالة التالية find-first، عند إعطائها دالة وقائمة ، تُرجع العنصر الأول في funcالقائمة بحيث تُرجع الدالة القيمة true.lstxlst(func x)
( define ( find-first func lst ) ( call-with-current-continuation ( lambda ( return-immediately ) ( for-each ( lambda ( x ) ( if ( func x ) ( return-immediately x ))) lst ) #f )))( ابحث عن أول عدد صحيح؟ ' ( 1/2 3/4 5.6 7 8/9 10 11 )) ===> 7 ( ابحث عن أول صفر؟ ' ( 1 2 3 4 )) ===> #fيوضح المثال التالي، وهو لغز تقليدي للمبرمجين، أن لغة Scheme يمكنها التعامل مع الاستمراريات ككائنات من الدرجة الأولى، وربطها بالمتغيرات وتمريرها كوسائط للإجراءات.
( let* (( yin (( lambda ( cc ) ( display "@" ) cc ) ( call-with-current-continuation ( lambda ( c ) c )))) ( yang (( lambda ( cc ) ( display "*" ) cc ) ( call-with-current-continuation ( lambda ( c ) c ))))) ( yin yang ))عند تنفيذ هذا الكود، يتم عرض تسلسل العد:@*@**@***@****@*****@******@*******@********...
مساحة اسم مشتركة للإجراءات والمتغيرات
على عكس لغة Common Lisp، تشترك جميع البيانات والإجراءات في لغة Scheme في مساحة اسم مشتركة، بينما في Common Lisp، تمتلك الدوال والبيانات مساحات أسماء منفصلة، مما يسمح للدالة والمتغير بأن يحملا الاسم نفسه، ويتطلب ذلك استخدام ترميز خاص للإشارة إلى دالة كقيمة. يُعرف هذا أحيانًا بالتمييز بين " Lisp-1 وLisp-2 "، في إشارة إلى مساحة الاسم الموحدة في Scheme ومساحات الأسماء المنفصلة في Common Lisp. [ 23 ]
في لغة Scheme، يمكن استخدام نفس العناصر الأساسية المستخدمة لمعالجة البيانات وربطها لربط الإجراءات. لا يوجد ما يعادل العناصر الأساسية في لغة Common defunLisp #'.
;; ربط متغير برقم: ( define f 10 ) f ===> 10 ;; تغيير (تعديل القيمة المرتبطة) ( set! f ( + f f 6 )) f ===> 26 ;; إسناد إجراء إلى نفس المتغير: ( set! f ( lambda ( n ) ( + n 12 ))) ( f 6 ) ===> 18 ;; إسناد نتيجة تعبير إلى نفس المتغير: ( set! f ( f 1 )) f ===> 13 ;; البرمجة الوظيفية: ( apply + ' ( 1 2 3 4 5 6 )) ===> 21 ( set! f ( lambda ( n ) ( + n 100 ))) ( map f ' ( 1 2 3 )) ===> ( 101 102 103 )معايير التنفيذ
يوثق هذا القسم الفرعي قرارات التصميم التي تم اتخاذها على مر السنين والتي أعطت المخطط طابعًا خاصًا، ولكنها ليست النتائج المباشرة للتصميم الأصلي.
برج الأرقام
تحدد لغة Scheme مجموعة كاملة نسبياً من أنواع البيانات العددية، بما في ذلك الأنواع المركبة والنسبية ، والتي تُعرف في Scheme باسم البرج العددي (R5RS القسم 6.2 [ 4 ] ). ويتعامل المعيار مع هذه الأنواع على أنها تجريدات، ولا يُلزم المُنفذ بأي تمثيلات داخلية محددة.
قد تتمتع الأرقام بخاصية الدقة. ولا يمكن إنتاج رقم دقيق إلا من خلال سلسلة من العمليات الدقيقة التي تتضمن أرقامًا دقيقة أخرى، وبالتالي فإن عدم الدقة مُعدٍ. وينص المعيار على أن أي تطبيقين يجب أن ينتجا نتائج متكافئة لجميع العمليات التي تؤدي إلى أرقام دقيقة.
يحدد معيار R5RS إجراءات exact->inexactيمكن inexact->exactاستخدامها لتغيير دقة رقم ما. inexact->exactينتج أحدها "الرقم الدقيق الأقرب عدديًا إلى القيمة المُدخلة". بينما exact->inexactينتج الآخر "الرقم التقريبي الأقرب عدديًا إلى القيمة المُدخلة". أما معيار R6RS، فيُغفل هذه الإجراءات من التقرير الرئيسي، ولكنه يُحددها كإجراءات توافق مع R5RS في المكتبة القياسية (rnrs r5rs (6)).
في معيار R5RS، لا يُشترط على تطبيقات Scheme تنفيذ كامل نطاق العمليات العددية، ولكن يجب عليها تنفيذ "مجموعة فرعية متماسكة تتوافق مع أغراض التنفيذ وروح لغة Scheme" (R5RS القسم 6.2.3). [ 4 ] أما معيار R6RS الجديد فيشترط تنفيذ كامل نطاق العمليات العددية، و"كائنات أعداد صحيحة دقيقة وكائنات أعداد نسبية دقيقة ذات حجم ودقة غير محدودين عمليًا، وتنفيذ إجراءات معينة... بحيث تُعيد دائمًا نتائج دقيقة عند إعطائها وسائط دقيقة" (R6RS القسم 3.4، القسم 11.7.1). [ 6 ]
مثال 1: العمليات الحسابية الدقيقة في تطبيق يدعم الأعداد المركبة النسبية الدقيقة.
مجموع ثلاثة أعداد حقيقية نسبية وعددين مركبين نسبيين ( عرّف x = ( 1/3 + 1/4 + -1/5 + -1/3i ) 405/50 + 2/3i )) x ===> 509/60 + 1/3i ; تحقق من الدقة. ( دقيق؟ x ) ===> #tالمثال 2: نفس العمليات الحسابية في تطبيق لا يدعم الأعداد النسبية الدقيقة ولا الأعداد المركبة ولكنه يقبل الأعداد الحقيقية في الترميز النسبي.
;; مجموع أربعة أعداد حقيقية نسبية ( عرّف xr ( + 1/3 1/4 -1/5 405/50 )) ;; مجموع عددين حقيقيين نسبيين ( عرّف xi ( + -1/3 2/3 )) xr ===> 8.48333333333333 xi ===> 0.3333333333333333 ;; التحقق من الدقة. ( دقيق؟ xr ) ===> #f ( دقيق؟ xi ) ===> #fيتوافق كلا التطبيقين مع معيار R5RS، لكن التطبيق الثاني لا يتوافق مع معيار R6RS لأنه لا ينفذ البرج العددي الكامل.
التقييم المتأخر
يدعم هذا المخطط التقييم المؤجل من خلال delayالنموذج والإجراءات force.
( عرّف a بقيمة 10 ) ( عرّف eval-aplus2 ( تأخير ( + a 2 ))) ( عيّن! a بقيمة 20 ) ( فرض eval-aplus2 ) ===> 22 ( عرّف eval-aplus50 ( تأخير ( + a 50 ))) ( دع (( a 8 )) ( فرض eval-aplus50 )) ===> 70 ( عيّن! a بقيمة 100 ) ( فرض eval-aplus2 ) ===> 22يُحفظ السياق المعجمي للتعريف الأصلي للوعد، كما تُحفظ قيمته بعد الاستخدام الأول force. ولا يتم تقييم الوعد إلا مرة واحدة.
يمكن استخدام هذه العناصر الأولية، التي تنتج أو تتعامل مع القيم المعروفة باسم الوعود ، لتنفيذ بنيات التقييم الكسول المتقدمة مثل التدفقات . [ 24 ]
في معيار R6RS، لم تعد هذه بدائيات، ولكن بدلاً من ذلك، يتم توفيرها كجزء من مكتبة التوافق R5RS (rnrs r5rs (6)).
في R5RS، تم تقديم تطبيق مقترح لـ delay، forceحيث يتم تنفيذ الوعد كإجراء بدون وسائط ( thunk ) واستخدام التخزين المؤقت لضمان تقييمه مرة واحدة فقط، بغض النظر عن عدد مرات forceاستدعائه (R5RS القسم 6.4). [ 4 ]
يُمكّن معيار SRFI 41 من التعبير عن المتتاليات المنتهية وغير المنتهية بكفاءة عالية. على سبيل المثال، هذا تعريف لمتتالية فيبوناتشي باستخدام الدوال المُعرّفة في معيار SRFI 41: [ 24 ]
;; تعريف متتالية فيبوناتشي: ( define fibs ( stream-cons 0 ( stream-cons 1 ( stream-map + fibs ( stream-cdr fibs ))))) ;; حساب العدد المئة في المتتالية: ( stream-ref fibs 99 ) ===> 218922995834555169026ترتيب تقييم حجج الإجراء
تُحدد معظم لغات ليسب ترتيبًا لتقييم وسائط الإجراءات. أما لغة سكيم فلا تُحدد ذلك. يُمكن للتنفيذ اختيار ترتيب التقييم - بما في ذلك ترتيب تقييم التعبير الموجود في موضع المعامل - على أساس كل استدعاء على حدة، والقيد الوحيد هو أن "يكون تأثير أي تقييم متزامن لتعبيرات المعامل والمعامل متوافقًا مع ترتيب تقييم تسلسلي معين." (R5RS القسم 4.1.3) [ 4 ]
( let (( ev ( lambda ( n ) ( display "Evaluating " ) ( display ( if ( procedure? n ) "procedure" n )) ( newline ) n ))) (( ev + ) ( ev 1 ) ( ev 2 ))) ===> 3التقييم 1 التقييم 2 إجراء التقييمev عبارة عن إجراء يصف الوسيط المُمرر إليه، ثم يُعيد قيمة هذا الوسيط. على عكس لغات Lisp الأخرى، يُعدّ ظهور تعبير في موضع المُعامل (العنصر الأول) لتعبير Scheme أمرًا جائزًا تمامًا، طالما أن نتيجة التعبير في موضع المُعامل هي إجراء.
عند استدعاء الإجراء " + " لجمع 1 و2، يمكن تقييم التعبيرات (ev +) و(ev 1) و (ev 2) بأي ترتيب، طالما أن النتيجة لا تُشابه تقييمها بالتوازي. وبالتالي، يمكن عرض الأسطر الثلاثة التالية بأي ترتيب في لغة Scheme القياسية عند تنفيذ مثال الكود أعلاه، مع العلم أنه لا يجوز تداخل نص سطر مع آخر لأن ذلك يُخالف قيد التقييم التسلسلي.
العناصر الغذائية الأساسية الصحية
في معيار R5RS والتقارير اللاحقة، يمكن توسيع بنية لغة Scheme بسهولة عبر نظام الماكرو. وقد قدّم معيار R5RS نظام ماكرو قويًا يُتيح للمبرمج إضافة تراكيب نحوية جديدة إلى اللغة باستخدام لغة فرعية بسيطة لمطابقة الأنماط (R5RS القسم 4.3). [ 4 ] قبل ذلك، كان نظام الماكرو هذا مُلحقًا بمعيار R4RS، كنظام "عالي المستوى" إلى جانب نظام ماكرو "منخفض المستوى"، وكلاهما كان يُعتبر امتدادًا للغة Scheme وليس جزءًا أساسيًا منها. [ 25 ]
تتطلب تطبيقات نظام الماكرو الصحي، المعروف أيضًا باسم syntax-rules، مراعاة النطاق المعجمي لبقية اللغة. ويتم ضمان ذلك من خلال قواعد تسمية ونطاق خاصة لتوسيع الماكرو، مما يتجنب أخطاء البرمجة الشائعة التي قد تحدث في أنظمة الماكرو للغات البرمجة الأخرى. يحدد R6RS نظام تحويل أكثر تطورًا، ، syntax-caseوالذي كان متاحًا كامتداد لغوي لـ R5RS Scheme لبعض الوقت.
;; عرّف ماكرو لتنفيذ صيغة مختلفة من "if" مع فرع صحيح متعدد التعبيرات، وبدون فرع خاطئ. ( define-syntax when ( syntax-rules () (( when pred exp exps ... ) ( if pred ( begin exp exps ... )))))تتشابه استدعاءات وحدات الماكرو والإجراءات تشابهاً كبيراً - فكلاهما تعبيرات S - لكنهما يُعاملان بشكل مختلف. عندما يصادف المترجم تعبير S في البرنامج، يتحقق أولاً مما إذا كان الرمز مُعرَّفاً ككلمة مفتاحية نحوية ضمن النطاق المعجمي الحالي. إذا كان الأمر كذلك، فإنه يحاول توسيع الماكرو، مُعاملاً العناصر الموجودة في نهاية تعبير S كوسائط دون ترجمة التعليمات البرمجية لتقييمها، وتتكرر هذه العملية بشكل متكرر حتى لا يتبقى أي استدعاءات للماكرو. أما إذا لم يكن كلمة مفتاحية نحوية، فإن المترجم يُترجم التعليمات البرمجية لتقييم الوسائط الموجودة في نهاية تعبير S، ثم لتقييم المتغير الذي يُمثله الرمز الموجود في بداية تعبير S، واستدعائه كإجراء مع تمرير تعبيرات النهاية المُقَيَّمة كوسائط إليه.
توفر معظم تطبيقات لغة Scheme أيضًا أنظمة ماكرو إضافية. ومن بين الأنظمة الشائعة الإغلاقات التركيبية ، ووحدات الماكرو لإعادة التسمية الصريحة ، define-macroونظام ماكرو غير صحي مشابه defmacroللنظام المقدم في لغة Common Lisp .
يُعدّ عدم القدرة على تحديد ما إذا كان الماكرو سليمًا أم لا أحد أوجه القصور في نظام الماكرو. وتُقدّم نماذج التوسيع البديلة، مثل مجموعات النطاق، حلًا محتملًا. [ 26 ]
البيئات والتقييم
قبل R5RS، لم يكن لدى لغة Scheme معيار مكافئ للإجراء evalالمنتشر في لغات Lisp الأخرى، على الرغم من أن أول ورقة بحثية حول Lambda وصفته evaluateبأنه "مشابه لدالة EVAL في لغة LISP" [ 18 ] ، واستبدل التقرير المنقح الأول في عام 1978 هذا encloseالإجراء بدالة تأخذ وسيطين. أما التقارير المنقحة الثانية والثالثة والرابعة فقد أغفلت أي مكافئ لهذه الدالة eval.
يكمن سبب هذا الالتباس في أن نتيجة تقييم التعبير في لغة Scheme، ذات النطاق المعجمي، تعتمد على مكان تقييمه. على سبيل المثال، ليس من الواضح ما إذا كانت نتيجة تقييم التعبير التالي يجب أن تكون 5 أم 6: [ 27 ]
( let (( name '+ )) ( let (( + * )) ( evaluate ( list name 2 3 ))))إذا تم تقييمها في البيئة الخارجية، حيث nameتم تعريفها، فإن النتيجة هي مجموع المعاملات. أما إذا تم تقييمها في البيئة الداخلية، حيث تم ربط الرمز "+" بقيمة الإجراء "*"، فإن النتيجة هي حاصل ضرب المعاملين.
يُزيل معيار R5RS هذا الالتباس بتحديد ثلاثة إجراءات تُعيد بيئات، وتوفير إجراء evalيأخذ تعبيرًا من نوع s وبيئة، ويُقيّم التعبير في البيئة المُقدّمة. (R5RS القسم 6.5) [ 4 ] ويُوسّع معيار R6RS هذا من خلال توفير إجراء يُتيح environmentللمبرمج تحديد الكائنات التي سيتم استيرادها إلى بيئة التقييم بدقة.
باستخدام المخططات الحديثة (المتوافقة عادةً مع R5RS) لتقييم هذا التعبير، يحتاج المرء إلى تعريف دالة evaluateيمكن أن تبدو كالتالي:
( تعريف ( تقييم التعبير ) ( تقييم التعبير ( بيئة التفاعل )))interaction-environmentهي البيئة العالمية للمترجم الفوري.
معالجة القيم غير المنطقية في التعبيرات المنطقية
في معظم لهجات لغة ليسب، بما فيها كومون ليسب، تُقيّم القيمة NILإلى القيمة "خطأ" في التعبير المنطقي. أما في لغة سكيم، فمنذ معيار IEEE عام 1991، [ 3 ] تُقيّم جميع القيم، باستثناء #f، بما في ذلك NILما يُعادلها في سكيم والمكتوب كـ '()، إلى القيمة "صواب" في التعبير المنطقي. (R5RS القسم 6.3.1) [ 4 ]
في معظم لغات Lisp، يكون الثابت الذي يمثل القيمة المنطقية لـ true هو ، بينما Tفي لغة Scheme يكون #t.
انفصال أنواع البيانات الأولية
في لغة Scheme ، تكون أنواع البيانات الأولية منفصلة. لا يمكن أن يكون سوى واحد من الشروط التالية صحيحًا لأي كائن Scheme: boolean?, pair?, symbol?, number?, char?, string?, , . (R5RS القسم 3.2) [ 4 ]vector?port?procedure?
في المقابل، تتداخل القيم العددية ضمن نوع البيانات العددية. على سبيل المثال، تحقق القيمة الصحيحة جميع الشروط integer?و rational?و real?و complex?في number?الوقت نفسه. (R5RS القسم 6.2) [ 4 ]
محمولات التكافؤ
يحتوي المخطط على ثلاثة أنواع مختلفة من التكافؤ بين الكائنات العشوائية المشار إليها بثلاثة مسندات تكافؤ مختلفة ، وعوامل علائقية لاختبار المساواة eq?، eqv?و equal?:
eq?يتم تقييمها إلى#fما لم تمثل معاييرها نفس كائن البيانات في الذاكرة؛eqv?هو بشكل عام نفس الشيءeq?ولكنه يعامل الكائنات الأولية (مثل الأحرف والأرقام) بشكل خاص بحيث تكون الأرقام التي تمثل نفس القيمة متساويةeqv?حتى لو لم تشير إلى نفس الكائن؛equal?يقارن هياكل البيانات مثل القوائم والمتجهات والسلاسل لتحديد ما إذا كانت لها بنية ومحتويات متطابقةeqv?. (R5RS القسم 6.1) [ 4 ]
توجد أيضًا عمليات التكافؤ المعتمدة على النوع في لغة Scheme: string=?ومقارنة string-ci=?سلسلتين نصيتين (تجري الأخيرة مقارنة مستقلة عن حالة الأحرف)؛ char=?ومقارنة char-ci=?الأحرف؛ =ومقارنة الأرقام. [ 4 ]
تعليقات
حتى معيار R5RS، كان التعليق القياسي في لغة Scheme عبارة عن فاصلة منقوطة، مما يجعل باقي السطر غير مرئي للغة. وقد دعمت العديد من التطبيقات اصطلاحات بديلة تسمح بامتداد التعليقات لأكثر من سطر واحد، ويسمح معيار R6RS باثنتين منها: يمكن تحويل تعبير s كامل إلى تعليق (أو "تعليقه") عن طريق وضع فاصلة منقوطة قبله #;(كما هو مُقدم في SRFI 62 [ 28 ] )، ويمكن إنشاء تعليق متعدد الأسطر أو "تعليق كتلة" عن طريق وضع النص بين فاصلتين منقوطة #|و |#.
المدخلات/المخرجات
يعتمد إدخال وإخراج لغة Scheme على نوع بيانات المنفذ . (R5RS القسم 6.6) [ 4 ] يُعرّف معيار R5RS منفذين افتراضيين، يُمكن الوصول إليهما باستخدام الإجراءين `input` و`output` current-input-port، current-output-portواللذان يُقابلان مفهومي الإدخال والإخراج القياسيين في أنظمة Unix . كما تُوفّر معظم التطبيقات منفذًا آخر current-error-port. يدعم المعيار إعادة توجيهwith-input-from-file الإدخال والإخراج القياسيين، من خلال إجراءات قياسية مثل `input` و`output` with-output-to-file. تُوفّر معظم التطبيقات منافذ سلاسل نصية بقدرات إعادة توجيه مماثلة، مما يُتيح تنفيذ العديد من عمليات الإدخال والإخراج العادية على مخازن السلاسل النصية بدلاً من الملفات، باستخدام الإجراءات الموضحة في SRFI 6. [ 29 ] يُحدّد معيار R6RS إجراءات منافذ أكثر تطورًا وكفاءة، بالإضافة إلى العديد من أنواع المنافذ الجديدة.
الأمثلة التالية مكتوبة وفقًا لمخطط R5RS الصارم.
مثال 1: مع تعيين الإخراج افتراضيًا إلى (منفذ الإخراج الحالي):
( let (( hello0 ( lambda () ( display "Hello world" ) ( newline )))) ( hello0 ))المثال 2: كما في المثال 1، ولكن باستخدام وسيطة المنفذ الاختيارية لإخراج الإجراءات
( let (( hello1 ( lambda ( p ) ( display "Hello world" p ) ( newline p )))) ( hello1 ( current-output-port )))المثال 3: كما في المثال 1، ولكن يتم إعادة توجيه المخرجات إلى ملف تم إنشاؤه حديثًا
ملاحظة: يُعدّ الأمر with-output-to-file إجراءً اختياريًا في R5RS ( let (( hello0 ( lambda () ( display "Hello world" ) ( newline )))) ( with-output-to-file "helloworldoutputfile" hello0 ))المثال 4: كما في المثال 2، ولكن مع فتح ملف وإغلاق منفذ بشكل صريح لإرسال المخرجات إلى ملف
( let (( hello1 ( lambda ( p ) ( display "Hello world" p ) ( newline p ))) ( output-port ( open-output-file "helloworldoutputfile" ))) ( hello1 output-port ) ( close-output-port output-port ))المثال 5: كما في المثال 2، ولكن باستخدام call-with-output-file لإرسال المخرجات إلى ملف.
( let (( hello1 ( lambda ( p ) ( display "Hello world" p ) ( newline p )))) ( call-with-output-file "helloworldoutputfile" hello1 ))تُوفّر إجراءات مماثلة للإدخال. يُوفّر R5RS Scheme المُسندات input-port?و output-port?. بالنسبة لإدخال وإخراج الأحرف، write-charتُوفّر read-char، peek-charو char-ready?. لكتابة وقراءة تعبيرات Scheme، يُوفّر Scheme readو write. عند عملية القراءة، تكون النتيجة المُعادة هي كائن نهاية الملف إذا وصل منفذ الإدخال إلى نهاية الملف، ويمكن اختبار ذلك باستخدام المُسند eof-object?.
يحدد المعيار SRFI 28 أيضًا إجراءً أساسيًا للتنسيق يشبه formatوظيفة Common Lisp، والتي سميت على اسمها. [ 30 ]
إعادة تعريف الإجراءات القياسية
في لغة Scheme، ترتبط الإجراءات بالمتغيرات. في الإصدار R5RS، نصّ معيار اللغة رسميًا على أنه يجوز للبرامج تغيير ارتباطات المتغيرات للإجراءات المضمنة، ما يُعدّ إعادة تعريف لها. (R5RS "تغييرات اللغة") [ 4 ] على سبيل المثال، +يمكن توسيع الإجراء ليقبل السلاسل النصية بالإضافة إلى الأرقام عن طريق إعادة تعريفه.
( set! + ( let (( original+ + )) ( lambda args ( apply ( if ( or ( null? args ) ( string? ( car args ))) string-append original+ ) args )))) ( + 1 2 3 ) ===> 6 ( + "1" "2" "3" ) ===> "123"في R6RS، ينتمي كل ربط، بما في ذلك الربط القياسي، إلى مكتبة معينة، وجميع الربط المُصدَّر غير قابل للتغيير. (R6RS القسم 7.1) [ 6 ] ولهذا السبب، يُحظر إعادة تعريف الإجراءات القياسية عن طريق التعديل. بدلاً من ذلك، يُمكن استيراد إجراء مختلف باسم إجراء قياسي، وهو ما يُشبه في الواقع إعادة التعريف.
المصطلحات واتفاقيات التسمية
في لغة Scheme القياسية، تحتوي أسماء الإجراءات التي تحوّل من نوع بيانات إلى آخر على سلسلة الأحرف "->"، وتنتهي الشروط بعلامة استفهام "؟"، وتنتهي أسماء الإجراءات التي تُغيّر قيمة البيانات المُخصصة مسبقًا بعلامة تعجب "!". غالبًا ما يتبع مبرمجو Scheme هذه الاصطلاحات.
في السياقات الرسمية، مثل معايير لغة Scheme، يُفضّل استخدام مصطلح "إجراء" على مصطلح "دالة" للإشارة إلى تعبير لامدا أو إجراء أولي. أما في الاستخدام العادي، فيُستخدم مصطلحا "إجراء" و"دالة" بشكل متبادل. ويُشار أحيانًا إلى تطبيق الإجراء رسميًا باسم " دمج ".
كما هو الحال في لغات ليسب الأخرى، يُستخدم مصطلح " thunk " في لغة سكيم للإشارة إلى إجراء بدون وسائط. ويشير مصطلح "الاستدعاء الذيل الصحيح" إلى خاصية جميع تطبيقات سكيم، وهي أنها تُجري تحسينًا لاستدعاء الذيل لدعم عدد غير محدود من استدعاءات الذيل النشطة .
يُشير شكل عناوين وثائق المعايير منذ R3RS، "التقرير المنقح حول مخطط لغة الخوارزميات"، إلى عنوان وثيقة معيار ALGOL 60 ، "التقرير المنقح حول لغة الخوارزميات ALGOL 60". وتُحاكي صفحة الملخص في R3RS صفحة الملخص في تقرير ALGOL 60 بشكلٍ كبير. [ 31 ] [ 32 ]
مراجعة النماذج والإجراءات القياسية
تم تعريف اللغة رسميًا في المعايير R5RS (1998) [ 4 ] وR6RS (2007) [ 6 ] وR7RS (2013) [ 5 ] . وهي تصف "الأشكال" القياسية: الكلمات المفتاحية والنحو المصاحب لها، والتي توفر بنية التحكم في اللغة، والإجراءات القياسية التي تؤدي المهام الشائعة.
النماذج القياسية
يصف هذا الجدول الأشكال القياسية في لغة Scheme. تظهر بعض الأشكال في أكثر من صف واحد لأنه لا يمكن تصنيفها بسهولة ضمن دالة واحدة في اللغة.
تُصنف النماذج التي تحمل علامة "L" في هذا الجدول على أنها نماذج "مكتبة" مشتقة في المعيار، وغالبًا ما يتم تنفيذها كوحدات ماكرو باستخدام نماذج أكثر أساسية في الممارسة العملية، مما يجعل مهمة التنفيذ أسهل بكثير من اللغات الأخرى.
| غاية | النماذج |
|---|---|
| تعريف | يُعرِّف |
| بنيات الربط | lambda, do (L), let (L), let* (L), letrec (L) |
| التقييم المشروط | إذا، الشرط (L)، الحالة (L)، و(L)، أو (L) |
| التقييم التسلسلي | يبدأ (*) |
| التكرار | lambda, do (L), named let (L) |
| التوسع النحوي | define-syntax, let-syntax, letrec-syntax, syntax-rules (R5RS), syntax-case (R6RS) |
| نقلاً عن | اقتباس('), فك الاقتباس(,), شبه الاقتباس(`), دمج فك الاقتباس(,@) |
| تكليف | تعيين! |
| التقييم المتأخر | التأخير (L) |
بينما beginيُعرَّف هذا كصيغة مكتبة في R5RS، يجب أن يكون برنامج التوسيع على دراية به لتحقيق وظيفة الربط. أما في R6RS، فلم يعد صيغة مكتبة.
الإجراءات القياسية
يوضح الجدولان التاليان الإجراءات القياسية في مخطط R5RS. أما مخطط R6RS فهو أكثر شمولاً بكثير، ولن يكون من العملي تقديم ملخص من هذا النوع.
تظهر بعض الإجراءات في أكثر من صف واحد لأنه لا يمكن تصنيفها بسهولة ضمن وظيفة واحدة في اللغة.
| غاية | إجراءات |
|---|---|
| بناء | متجه، إنشاء متجه، إنشاء سلسلة نصية، قائمة |
| محمولات التكافؤ | هل يساوي؟، هل يساوي؟، هل يساوي؟، هل يساوي؟، هل يساوي؟، هل يساوي؟، هل يساوي؟، هل يساوي؟، هل يساوي؟، هل يساوي؟، هل يساوي؟ |
| تحويل النوع | vector->list, list->vector, number->string, string->number, symbol->string, string->symbol, char->integer, integer->char, string->list, list->string |
| أرقام | انظر الجدول المنفصل |
| الأوتار | سلسلة نصية؟، إنشاء سلسلة نصية، سلسلة نصية، طول السلسلة النصية، مرجع السلسلة النصية، تعيين السلسلة النصية!، سلسلة نصية=؟، سلسلة نصية-ci=؟، سلسلة نصية<؟ سلسلة نصية-ci<؟، سلسلة نصية<=؟ سلسلة نصية-ci<=؟، سلسلة نصية>؟ سلسلة نصية-ci>؟، سلسلة نصية>=؟ سلسلة نصية-ci>=؟، سلسلة نصية فرعية، إلحاق سلسلة نصية، سلسلة نصية->قائمة، قائمة->سلسلة نصية، نسخ سلسلة نصية، تعبئة سلسلة نصية! |
| الشخصيات | char?, char=?, char-ci=?, char<? char-ci<?, char<=? char-ci<=?, char>? char-ci>?, char>=? char-ci>=?, char-alphabetic?, char-numeric?, char-whitespace?, char-upper-case?, char-lower-case?, char->integer, integer->char, char-upcase, char-downcase |
| المتجهات | إنشاء متجه، متجه، متجه؟، طول المتجه، مرجع المتجه، مجموعة المتجهات!، تحويل المتجه إلى قائمة، تحويل القائمة إلى متجه، تعبئة المتجه! |
| الرموز | رمز-> سلسلة نصية، سلسلة نصية-> رمز، رمز؟ |
| الأزواج والقوائم | زوج؟، cons، car، cdr، set-car!، set-cdr!، فارغ؟، قائمة؟، قائمة، طول، إلحاق، عكس، list-tail، list-ref، memq، memv، عضو، assq، assv، assoc، قائمة->متجه، متجه->قائمة، قائمة->سلسلة نصية، سلسلة نصية->قائمة |
| محمولات الهوية | منطقي؟، زوج؟، رمز؟، رقم؟، حرف؟، سلسلة نصية؟، متجه؟، منفذ؟، إجراء؟ |
| متابعة | الاتصال مع استمرار التيار (call/cc)، القيم، الاتصال مع القيم، الرياح الديناميكية |
| البيئات | eval, scheme-report-environment, null-environment, interaction-environment (اختياري) |
| المدخلات/المخرجات | عرض، سطر جديد، قراءة، كتابة، قراءة حرف، كتابة حرف، معاينة حرف، هل الحرف جاهز؟، كائن نهاية الملف؟، فتح ملف إدخال، فتح ملف إخراج، إغلاق منفذ إدخال، إغلاق منفذ إخراج، منفذ إدخال؟، منفذ إخراج؟، منفذ الإدخال الحالي، منفذ الإخراج الحالي، استدعاء مع ملف إدخال، استدعاء مع ملف إخراج، مع إدخال من ملف (اختياري)، مع إخراج إلى ملف (اختياري) |
| واجهة النظام | تحميل (اختياري)، تشغيل النسخ (اختياري)، إيقاف النسخ (اختياري) |
| التقييم المتأخر | قوة |
| البرمجة الوظيفية | الإجراء؟، تطبيق، تعيين، لكل |
| القيم المنطقية | منطقي؟ لا |
تقوم إجراءات السلاسل والأحرف التي تحتوي على "-ci" في أسمائها بإجراء مقارنات مستقلة عن حالة الأحرف بين وسائطها: تعتبر الإصدارات ذات الأحرف الكبيرة والصغيرة من نفس الحرف متساوية.
| غاية | إجراءات |
|---|---|
| عوامل التشغيل الحسابية الأساسية | الجمع، الطرح، الضرب، القسمة، القيمة المطلقة، خارج القسمة، الباقي، باقي القسمة، القاسم المشترك الأكبر، المضاعف المشترك الأصغر، الأس، الجذر التربيعي |
| الأعداد النسبية | البسط، المقام، كسر نسبي؟، ترشيد |
| تقريب | أرضية، سقف، قطع، دائري |
| دقة | غير دقيق -> دقيق، دقيق -> غير دقيق، دقيق؟، غير دقيق؟ |
| عدم المساواة | <, <= , >, >=, = |
| مسندات متنوعة | صفر؟، سالب؟، موجب؟ فردي؟ زوجي؟ |
| الحد الأقصى والحد الأدنى | الحد الأقصى، الحد الأدنى |
| علم المثلثات | الخطيئة، كوس، تان، آسين، أكوس، أتان |
| الدوال الأسية | exp، Log |
| الأعداد المركبة | إنشاء مستطيل، إنشاء قطبي، الجزء الحقيقي، الجزء التخيلي، المقدار، الزاوية، مركب؟ |
| المدخلات والمخرجات | رقم -> سلسلة نصية، سلسلة نصية -> رقم |
| محددات النوع | عدد صحيح؟، عدد نسبي؟، عدد حقيقي؟، عدد مركب؟، عدد؟ |
تم تعريف تطبيقات - و / التي تأخذ أكثر من وسيطين ولكنها تُترك اختيارية في R5RS.
طلبات تنفيذ المخططات
بسبب بساطة لغة Scheme، فإن العديد من الإجراءات والصيغ النحوية الشائعة غير مُعرّفة في المعيار. وللحفاظ على صغر حجم اللغة الأساسية مع تسهيل توحيد الإضافات، يتبنى مجتمع Scheme عملية "طلب تنفيذ Scheme" (SRFI) التي يتم من خلالها تعريف مكتبات الإضافات عبر مناقشة متأنية لمقترحات الإضافات. وهذا يُعزز قابلية نقل الشيفرة. وتدعم جميع أو معظم تطبيقات Scheme العديد من طلبات التنفيذ هذه.
تشمل SRFIs التي تحظى بدعم واسع النطاق في مختلف التطبيقات ما يلي: [ 33 ]
- 0: بنية التوسيع الشرطي القائمة على الميزات
- 1: قائمة المكتبة
- 4: أنواع بيانات المتجهات العددية المتجانسة
- 6: منافذ السلسلة الأساسية
- 8: الاستلام، والربط بقيم متعددة
- 9: تحديد أنواع السجلات
- 13: مكتبة السلاسل النصية
- 14: مكتبة مجموعة الأحرف
- 16: صيغة الإجراءات ذات عدد المعاملات المتغير
- 17: مجموعة معممة!
- 18: دعم تعدد الخيوط
- 19: أنواع البيانات الزمنية والإجراءات
- 25: عناصر المصفوفات متعددة الأبعاد
- 26: تدوين لتخصيص المعاملات بدون تطبيق تقنية التخصيص الجزئي
- 27: مصادر البتات العشوائية
- 28: سلاسل التنسيق الأساسية
- 29: التوطين
- 30: التعليقات المتداخلة متعددة الأسطر
- 31: شكل خاص للتقييم التكراري
- 37: args-fold: معالج وسائط البرنامج
- 39: كائنات المعلمات
- 41: تيارات
- 42: فهم متلهف
- 43: مكتبة المتجهات
- 45: العناصر الأساسية للتعبير عن الخوارزميات الكسولة التكرارية
- 60: الأعداد الصحيحة كبتات
- 61: جملة شرطية أكثر عمومية
- 66: متجهات ثمانية
- 67: مقارنة الإجراءات
التطبيقات
بفضل تصميمها الأنيق والبسيط، أصبحت لغة Scheme خيارًا شائعًا لمصممي اللغات والهواة والمعلمين، ونظرًا لصغر حجمها، الذي يُضاهي حجم المفسرات النموذجية ، فهي أيضًا خيار شائع للأنظمة المدمجة وكتابة البرامج النصية . وقد نتج عن ذلك عشرات التطبيقات، [ 34 ] يختلف معظمها عن بعضها البعض اختلافًا كبيرًا لدرجة أن نقل البرامج من تطبيق إلى آخر أمر بالغ الصعوبة، كما أن صغر حجم اللغة القياسية يعني أن كتابة برنامج مفيد ذي تعقيد كبير بلغة Scheme القياسية القابلة للنقل يكاد يكون مستحيلاً. [ 14 ] يحدد معيار R6RS لغة أوسع نطاقًا، في محاولة لتوسيع جاذبيتها للمبرمجين.
تُوفّر معظم تطبيقات Scheme حلقة قراءة-تقييم-طباعة تقليدية على غرار لغة Lisp لأغراض التطوير والتصحيح. كما يُتيح العديد منها تحويل برامج Scheme إلى ملفات تنفيذية ثنائية. ويُعدّ دعم تضمين كود Scheme في برامج مكتوبة بلغات أخرى أمرًا شائعًا، نظرًا لبساطة تطبيقات Scheme نسبيًا، مما يجعلها خيارًا شائعًا لإضافة إمكانيات البرمجة النصية إلى الأنظمة الأكبر حجمًا المطوّرة بلغات مثل C. تُحوّل مُفسّرات Gambit و Chicken و Bigloo Scheme كود Scheme إلى C، مما يُسهّل عملية التضمين بشكل كبير. علاوة على ذلك، يُمكن تهيئة مُصرّف Bigloo لإنشاء رمز بايت لآلة جافا الافتراضية (JVM)، ويحتوي على مُولّد رمز بايت تجريبي لـ .NET .
تدعم بعض التطبيقات ميزات إضافية. على سبيل المثال، يوفر كل من Kawa و JScheme التكامل مع فئات Java ، وغالبًا ما تُسهّل مُترجمات Scheme إلى C استخدام المكتبات الخارجية المكتوبة بلغة C، وصولًا إلى إمكانية تضمين كود C في كود مصدر Scheme. مثال آخر هو Pvts، الذي يُقدّم مجموعة من الأدوات المرئية التي تدعم تعلّم Scheme.
الاستخدام
تُستخدم لغة Scheme على نطاق واسع في العديد من المدارس [ 35 ] ؛ وعلى وجه الخصوص، تستخدم العديد من دورات علوم الحاسوب التمهيدية لغة Scheme بالتزامن مع كتاب " بنية وتفسير برامج الحاسوب" (SICP). [ 36 ] على مدار الاثني عشر عامًا الماضية، أدارت PLT مشروع ProgramByDesign (المعروف سابقًا باسم TeachScheme!)، والذي عرّض ما يقرب من 600 معلم في المدارس الثانوية وآلاف الطلاب لبرمجة Scheme الأساسية. كانت دورة البرمجة التمهيدية القديمة 6.001 في معهد ماساتشوستس للتكنولوجيا تُدرّس بلغة Scheme، [ 37 ] على الرغم من استبدالها بدورات أحدث، إلا أن كتاب SICP لا يزال يُدرّس في معهد ماساتشوستس للتكنولوجيا. [ 38 ] وبالمثل، كانت الدورة التمهيدية في جامعة كاليفورنيا في بيركلي ، CS 61A، تُدرّس بالكامل بلغة Scheme حتى عام 2011، باستثناء بعض الاستثناءات البسيطة باستخدام لغة Logo لتوضيح النطاق الديناميكي. اليوم، كما هو الحال في معهد ماساتشوستس للتكنولوجيا، استبدلت جامعة بيركلي المنهج الدراسي بنسخة أكثر حداثة يتم تدريسها بشكل أساسي باستخدام لغة بايثون 3 ، ولكن المنهج الحالي لا يزال يعتمد على المنهج القديم، ولا تزال أجزاء من الفصل الدراسي تُدرّس باستخدام لغة سكيم. [ 39 ]
يُستخدم كتاب " كيفية تصميم البرامج" في بعض مؤسسات التعليم العالي لتدريس مقررات علوم الحاسوب التمهيدية. يستخدم معهد ورسستر للفنون التطبيقية لغة Scheme حصريًا في مقرره التمهيدي "مقدمة في تصميم البرامج" (CS1101). [ 40 ] ويستخدم معهد روز-هولمان للتكنولوجيا لغة Scheme في مقرره المتقدم "مفاهيم لغات البرمجة". [ 41 ] كما يُدرَّس المقرر الأساسي في جامعة برانديز ، "بنية وتفسيرات برامج الحاسوب" (COSI121b)، حصريًا بلغة Scheme على يد عالم الحاسوب النظري هاري ميرسون . [ 42 ] ويُدرَّس المقرر التمهيدي في جامعة إنديانا ، C211، بالكامل بلغة Scheme. ويستمر استخدام لغة Scheme في النسخة ذاتية التعلم من المقرر، CS 61AS. [ 43 ] كما تُدرَّس مقررات علوم الحاسوب التمهيدية في جامعة ييل وكلية غرينيل بلغة Scheme. [ 44 ] كان مقرر علوم الحاسوب التمهيدي السابق في جامعة مينيسوتا - توين سيتيز، CSCI 1901، يستخدم لغة Scheme كلغة أساسية، يليه مقرر يُعرّف الطلاب بلغة Java؛ [ 45 ] ومع ذلك، وباتباع مثال معهد ماساتشوستس للتكنولوجيا، استبدل القسم المقرر 1901 بمقرر CSCI 1133 القائم على لغة Python، [ 46 ] بينما تُغطى البرمجة الوظيفية بالتفصيل في مقرر الفصل الدراسي الثالث CSCI 2041. [ 47 ]
يُستخدم هذا المخطط أيضًا للأغراض التالية:
- تستخدم لغة دلالات ومواصفات نمط المستند ( DSSSL)، التي توفر طريقة لتحديد أوراق أنماط SGML ، مجموعة فرعية من Scheme. [ 48 ]
- يستخدم برنامج تحرير الرسومات النقطية مفتوح المصدر المعروف GIMP لغة TinyScheme كلغة برمجة نصية . [ 49 ]
- اعتمد مشروع جنو لغة البرمجة النصية "غايل" كلغة برمجة نصية رسمية، وتُدمج هذه النسخة من لغة "سكيم" في تطبيقات مثل "جنو ليلي بوند" و "جنو كاش" كلغة برمجة نصية للإضافات. كذلك، كانت "غايل" لغة البرمجة النصية لبيئة سطح المكتب "جنوم" [ 50 ] ، ولا يزال لدى "جنوم" مشروع يوفر روابط "غايل" لمجموعة مكتباتها [ 51 ] . وهناك مشروع لدمج "غايل" في "جنو إيماكس" ، البرنامج الرئيسي لجنو، ليحل محل مترجم "إيماكس ليسب" الحالي [ 52 ] .
- تستخدم شركة Synopsys لغة Elk Scheme كلغة برمجة نصية لأدوات التصميم بمساعدة الحاسوب (TCAD) الخاصة بها . [ 53 ]
- استخدم شيرو كاواي، كبير المبرمجين في فيلم فاينل فانتسي: ذا سبيريتس ويذين ، لغة البرمجة Scheme لإدارة محرك العرض في الوقت الحقيقي. [ 54 ]
- يستخدم Google App Inventor لنظام Android لغة Scheme، حيث يتم استخدام Kawa لتحويل كود Scheme إلى بايت كود لآلة Java الافتراضية التي تعمل على أجهزة Android. [ 55 ]
انظر أيضاً
- أساسيات لغات البرمجة ، كتاب مدرسي يستخدم لغة Scheme كأساس
مراجع
- ↑ "التأثيرات - مرجع الصدأ" . مرجع الصدأ . تم الاسترجاع في 18 أبريل 2023 .
- ↑ لغة ليسب الشائعة: اللغة، الطبعة الثانية، جاي إل. ستيل الابن، دار النشر الرقمية؛ 1981. رقم ISBN 978-1-55558-041-4"Common Lisp هي لهجة جديدة من لغة Lisp، وهي خليفة لغة MacLisp، وقد تأثرت بشدة بلغة ZetaLisp وإلى حد ما بلغة Scheme و InterLisp."
- 1 2 1178-1990 (Reaff 2008) معيار IEEE للغة برمجة Scheme. رقم جزء IEEE هو STDPD14209، وقد أُعيد تأكيده بالإجماع في اجتماع لجنة مراجعة المعايير التابعة لمجلس معايير IEEE-SA (RevCom)، بتاريخ 26 مارس 2008 (البند 6.3 في محضر الاجتماع)، وتم الاطلاع على محضر إعادة التأكيد في أكتوبر 2009. هذه الوثيقة متاحة للشراء من IEEE فقط، وليست متاحة عبر الإنترنت وقت كتابة هذا التقرير: 2009.
- 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 ريتشارد كيلسي؛ ويليام كلينجر؛ جوناثان ريس؛ وآخرون . (أغسطس 1998). "التقرير الخامس المنقح حول مخطط لغة الخوارزميات" . الحوسبة الرمزية والحسابية من الرتبة العليا . 11 (1): 7-105 . doi : 10.1023/A:1010051815785 . S2CID 14069423. تاريخ الاسترجاع: 9 أغسطس 2012 .
- 1 2 3 "R7RS النهائي متاح" (ملف PDF) . 2013-07-06.
- 1 2 3 4 5 سبيربر، مايكل؛ ديبفيج، آر. كينت؛ فلات، ماثيو؛ فان ستراتن، أنطون؛ وآخرون . (أغسطس 2007). "التقرير السادس المنقح حول مخطط لغة الخوارزميات (R6RS)" . لجنة توجيه المخطط . تم الاطلاع عليه بتاريخ 13 سبتمبر 2011 .
- 1 2 3 4 سوسمان، جيرالد جاي؛ ستيل، جاي إل. (1 ديسمبر 1998). "التقرير الأول عن إعادة النظر في لغة سكيم". الحوسبة الرمزية والحسابية من الرتبة العليا . 11 (4): 399-404 . doi : 10.1023/A:1010079421970 . S2CID 7704398 .
- ↑ "تطبيقات R6RS" . r6rs.org . تم الاطلاع عليه بتاريخ 24-11-2017 .
- ↑ عبد العزيز غلوم (27-10-2007). "مكتبات R6RS ونظام بناء الجملة وحالة الأحرف (psyntax)" . Ikarus Scheme . تم الاسترجاع في 20-10-2009 .
- ↑ كيب، أندرو دبليو؛ ديبفيج، آر. كينت (نوفمبر 2014). "تمثيل وقت التشغيل لأنواع سجلات المخطط" . مجلة البرمجة الوظيفية . 24 (6): 675-716 . doi : 10.1017/S0956796814000203 . S2CID 40001845 .
- ↑ «التقرير المنقح رقم 6 حول لغة Scheme الخوارزمية، الملحق هـ: تغييرات اللغة» . لجنة توجيه Scheme. 26-09-2007 . تاريخ الاسترجاع: 20-10-2009 .
- ↑ "دائرة ناخبي R6RS" . لجنة توجيه المخطط. 2007. تم الاسترجاع في 9 أغسطس 2012 .
- ↑ مارك فيلي (مُجمّع) (26-10-2007). "نوايا المُنفّذين بشأن R6RS" . لجنة توجيه المخطط، القائمة البريدية r6rs-discuss. مؤرشف من الأصل بتاريخ 20-08-2008 . تم الاطلاع عليه بتاريخ 09-08-2012 .
- 1 2 ويل كلينجر، مارك فيلي، كريس هانسون، جوناثان ريس، وأولين شيفرز (20 أغسطس 2009). "بيان الموقف (مسودة) " . لجنة توجيه المخطط . تم الاطلاع عليه بتاريخ 9 أغسطس 2012 .
{{cite web}}: صيانة CS1: أسماء متعددة: قائمة المؤلفين ( رابط ) - ↑ "المسودة التاسعة من R7RS متاحة" (ملف PDF) . 2013-04-15.
- ↑ ويل كلينجر (10 مايو 2013). "تمديد فترة التصويت" . لجنة توجيه لغة المخطط، قائمة بريد تقارير المخطط. مؤرشف من الأصل بتاريخ 21 يوليو 2013. تم الاطلاع عليه بتاريخ 7 يوليو 2013 .
- ↑ سُمّي تطبيق Scheme 48 بهذا الاسم لأن المفسر كُتب بواسطة ريتشارد كيلسي وجوناثان ريس في غضون 48 ساعة (6-7 أغسطس 1986 ). انظر: ريتشارد كيلسي؛ جوناثان ريس؛ مايك سبيربر (10 يناير 2008). "دليل Scheme 48 المرجعي غير المكتمل للإصدار 1.8" . جوناثان ريس، s48.org . تم الاطلاع عليه في 9 أغسطس 2012 .
- 1 2 جيرالد جاي سوسمان وجاي لويس ستيل الابن (ديسمبر 1975). "سكيم: مترجم لحساب لامدا الموسع" (ملف PDF) . مذكرات الذكاء الاصطناعي . AIM-349. مختبر الذكاء الاصطناعي بمعهد ماساتشوستس للتكنولوجيا . hdl : 1721.1/5794 . تم الاطلاع عليه بتاريخ 23 ديسمبر 2021 .
- ↑ جويل موسى (يونيو 1970)، وظيفة الدالة في لغة ليسب، أو لماذا يجب تسمية مشكلة FUNARG بمشكلة البيئة ، hdl : 1721.1/5854 ، مذكرة الذكاء الاصطناعي 199.
يُعدّ تشبيه الفرق بين الدالة FUNCTION وكلمة QUOTE في لغة ليسب مفيدًا، حيث يمكن اعتبار كلمة QUOTE غطاءً مفتوحًا أو مساميًا للدالة، نظرًا لأن المتغيرات الحرة تنتقل إلى البيئة الحالية. أما الدالة FUNCTION فتعمل كغطاء مغلق أو غير مسامي (ومن هنا جاء مصطلح "الإغلاق" الذي استخدمه لاندين). لذا نتحدث عن تعبيرات لامدا "المفتوحة" (عادةً ما تكون الدوال في لغة ليسب تعبيرات لامدا) وتعبيرات لامدا "المغلقة". [...] بدأ اهتمامي بمشكلة البيئة عندما زار لاندين، الذي كان لديه فهم عميق للمشكلة، معهد ماساتشوستس للتكنولوجيا خلال الفترة 1966-1967. ثم أدركت التطابق بين قوائم FUNARG التي هي نتائج تقييم تعبيرات Lambda "المغلقة" في
LISP
و
Lambda Closures في
ISWIM .
- ↑ فان توندر، أندريه (1 يناير 2004). "حساب لامدا للحوسبة الكمومية". مجلة SIAM للحوسبة . 33 (5): 1109-1135 . arXiv : quant-ph/0307150 . doi : 10.1137/S0097539703432165 . S2CID 613571 .
- ↑ نيهرن، ج.؛ شوينغهامر، ج.؛ سمولكا، ج. (نوفمبر 2006). "حساب لامدا متزامن مع المستقبلات" (ملف PDF) . علوم الحاسوب النظرية . 364 (3): 338-356 . doi : 10.1016/j.tcs.2006.08.016 .
- ↑ جيرالد جاي سوسمان وجاي لويس ستيل الابن (مارس 1976). "لامدا: الضرورة القصوى" (ملحق أو ملف PDF) . مذكرات الذكاء الاصطناعي . AIM-353. مختبر الذكاء الاصطناعي بمعهد ماساتشوستس للتكنولوجيا . hdl : 1721.1/5790 ."لامدا: الضرورة القصوى (نص مكتوب)" . scheme.org .
- ↑ غابرييل، ريتشارد ب .؛ بيتمان، كينت (1988). "قضايا تقنية تتعلق بالفصل في خلايا الدوال وخلايا القيم" . لغة ليسب والحساب الرمزي . المجلد 1، العدد 1 (نُشر في يونيو 1988). الصفحات 81-101 . doi : 10.1007/BF01806178 . تاريخ الاسترجاع : 9 أغسطس 2012 .
- 1 2 فيليب ل. بيويغ (24 يناير 2008). "SRFI 41: التدفقات" . محررو SRFI، schemers.org . تم الاطلاع عليه بتاريخ 9 أغسطس 2012 .
- ↑ ويليام كلينجر وجوناثان ريس، محرران (1991). "التقرير الرابع المنقح حول لغة Scheme الخوارزمية" . ACM Lisp Pointers . 4 (3): 1– 55. تاريخ الاسترجاع: 9 أغسطس 2012 .
- ↑ فلات، ماثيو (2016). "الربط كمجموعات من النطاقات". وقائع الندوة السنوية الثالثة والأربعين لجمعية ACM SIGPLAN-SIGACT حول مبادئ لغات البرمجة . الصفحات 705-717 . doi : 10.1145/2837614.2837620 . ISBN 978-1-4503-3549-2. S2CID 15401805 .
- ↑ جوناثان ريس، مخطط الأشياء: اجتماع يونيو 1992. مؤرشف في 16 يوليو 2011 على موقع Wayback Machine (ملاحظة لاحقة)، في Lisp Pointers، المجلد 4، أكتوبر - ديسمبر 1992. تم الاطلاع عليه في 9 أغسطس 2012.
- ↑ تايلور كامبل (21 يوليو 2005). "SRFI 62: تعليقات على تعابير S" . محررو SRFI، schemers.org . تم الاطلاع عليه بتاريخ 9 أغسطس 2012 .
- ↑ ويليام د. كلينجر (1999-07-01). "SRFI 6: منافذ السلاسل الأساسية" . محررو SRFI، schemers.org . تم الاطلاع عليه بتاريخ 2012-08-09 .
- ↑ سكوت ج. ميلر (25-06-2002). "SRFI 28: سلاسل التنسيق الأساسية" . محررو SRFI، schemers.org . تم الاطلاع عليه بتاريخ 09-08-2012 .
- ↑ جيه دبليو باكوس؛ إف إل باور؛ جيه غرين؛ سي كاتز؛ جيه مكارثي؛ بي نور؛ وآخرون (يناير - أبريل 1960). "تقرير منقح عن لغة الخوارزميات Algol 60" . مجلة الرياضيات العددية، واتصالات جمعية آلات الحوسبة، ومجلة الجمعية البريطانية للحاسبات . تاريخ الاسترجاع: 9 أغسطس 2012 .
- ↑ جوناثان ريس؛ ويليام كلينجر، محرران. (ديسمبر 1986). "تقرير منقح (3) حول مخطط لغة الخوارزميات (مُهدى إلى ذكرى ALGOL 60)" . إشعارات ACM SIGPLAN . 21 (12): 37-79 . CiteSeerX 10.1.1.29.3015 . doi : 10.1145/15042.15043 . hdl : 1721.1/6424 . S2CID 43884422. تاريخ الاسترجاع : 9 أغسطس 2012 .
- ↑ "أنظمة المخططات الداعمة لمؤسسات التمويل الذاتي المهيكلة" . محررو مؤسسة التمويل الذاتي المهيكلة، schemers.org. 30 أغسطس 2009. مؤرشف من الأصل في 20 يونيو 2021. تم الاطلاع عليه في 9 أغسطس 2012 .
- ↑ تم إدراج 75 تطبيقًا معروفًا للغة Scheme في "scheme-faq-standards" . ويكي Scheme المجتمعي. 25-06-2009 . تم الاطلاع عليه بتاريخ 20-10-2009 .
- ↑ إد مارتن (20 يوليو 2009). "قائمة المدارس التي تستخدم أساليب الاحتيال" . شركة المحتالين. مؤرشف من الأصل بتاريخ 30 مارس 2009. تم الاطلاع عليه بتاريخ 20 أكتوبر 2009 .
- ↑ "قائمة المدارس التي تستخدم برنامج SICP" . مطبعة معهد ماساتشوستس للتكنولوجيا. 26 يناير 1999. مؤرشف من الأصل في 15 يونيو 2008. تم الاطلاع عليه في 20 أكتوبر 2009 .
- ↑ إريك غريمسون (ربيع 2005). "6.001 بنية وتفسير برامج الحاسوب" . MIT Open Courseware . تم الاطلاع عليه بتاريخ 20 أكتوبر 2009 .
- ↑ أليكس فانديفر؛ نيلسون الحاج؛ وآخرون . (يناير 2009). "6.184 - الزومبي يشربون مشروبات تحتوي على الكافيين 6.001" . مختبر علوم الحاسوب والذكاء الاصطناعي بمعهد ماساتشوستس للتكنولوجيا. مؤرشف من الأصل بتاريخ 28 أغسطس 2009. تم الاطلاع عليه بتاريخ 20 أكتوبر 2009 .
- ↑ جون دينيرو (خريف 2019). "علوم الحاسوب 61أ، بيركلي" . قسم الهندسة الكهربائية وعلوم الحاسوب، بيركلي. مؤرشف من الأصل بتاريخ 11 نوفمبر 2020. تم الاطلاع عليه بتاريخ 17 ديسمبر 2019 .
- ↑ CS 1101: مقدمة في تصميم البرامج (A05): برمجيات المقرر الدراسي ، معهد ورسستر للفنون التطبيقية
- ↑ "CSSE 304: مفاهيم لغات البرمجة" . معهد روز-هولمان للتكنولوجيا .
- ↑ "منهج CS121b لفصل الربيع 2021" (ملف PDF) . جامعة برانديز .
- ↑ "الصفحة الرئيسية" . berkeley-cs61as.github.io .
- ↑ دانا أنجلوين (خريف 2009). "مقدمة في علوم الحاسوب (CPSC 201)" . ذا زو، قسم علوم الحاسوب، جامعة ييل . تاريخ الاسترجاع: 20 أكتوبر 2009 .
- ↑ هيكل برمجة الحاسوب I مؤرشف في 2010-06-19 في Wayback Machine ، قسم علوم الحاسوب، جامعة مينيسوتا، ربيع 2010 (تم الوصول إليه في 2010-01-30).
- ↑ وصف المقررات الدراسية المطلوبة لطلاب علوم الحاسوب ومعلومات أخرى مؤرشفة بتاريخ 25-10-2019 في Wayback Machine ، قسم علوم الحاسوب، جامعة مينيسوتا (تم الاطلاع بتاريخ 25-10-2019)
- ↑ CSCI 2041—مقرر جديد لجنة مناهج علوم وهندسة الحاسوب، جامعة مينيسوتا (تم الاطلاع عليه في 25-10-2019)
- ↑ روبن كوفر (25 فبراير 2002). "لغة دلالات ومواصفات نمط المستند DSSSL. ISO/IEC 10179:1996" . صفحات الغلاف . تم الاطلاع عليه بتاريخ 9 أغسطس 2012 .
- ↑ « لغة البرمجة النصية الرئيسية لبرنامج GIMP المرفقة به اليوم هي Scheme. » من دوف جروبجيلد (2002). «دليل GIMP الأساسي للغة Scheme» . فريق GIMP . تم الاطلاع عليه بتاريخ 9 أغسطس 2012 .
- ↑ تود غراهام لويس؛ ديفيد زول؛ جوليان ميسيج (2002). "أسئلة وأجوبة حول جنوم من أرشيف الإنترنت" . فريق جنوم، gnome.org. مؤرشف من الأصل بتاريخ 22 مايو 2000. تم الاطلاع عليه بتاريخ 9 أغسطس 2012 .
- ↑ "guile-gnome" . مؤسسة البرمجيات الحرة . تم الاطلاع عليه بتاريخ 9 أغسطس 2012 .
- ↑ "Guile in Emacs" . EmacsConf . تم الاطلاع عليه بتاريخ 2025-12-05 .
- ↑ لورانس بريفارد (9 نوفمبر 2006). "تحديث برنامج Synopsys MAP-in SM : منتدى مطوري قابلية التشغيل البيني لبرامج التصميم الإلكتروني" (ملف PDF) . شركة Synopsis . تاريخ الاسترجاع: 9 أغسطس 2012 .
- ↑ كاواي، شيرو (أكتوبر 2002). "ربط الأشياء معًا - لغة Scheme في إنتاج محتوى الرسوميات الحاسوبية في الوقت الحقيقي" . وقائع المؤتمر الدولي الأول للغة Lisp، سان فرانسيسكو : 342-348 . تاريخ الاسترجاع : 9 أغسطس 2012 .
- ↑ بيل ماغنوسون؛ هال أبيلسون ومارك فريدمان (11 أغسطس 2009). "نظرة معمقة على App Inventor لنظام Android" . شركة جوجل، مدونة جوجل للأبحاث الرسمية . تم الاطلاع عليه بتاريخ 9 أغسطس 2012 .
للمزيد من القراءة
- مقدمة إلى المخطط وتطبيقه ( نسخة طبق الأصل )
- كريستوفر تي. هاينز (22-06-1999). "تجربة توحيد لغة برمجة Scheme" .
- جاي إل. ستيل الابن ، ريتشارد ب. غابرييل . "تطور لغة ليسب" (ملف PDF) . مؤرشف من النسخة الأصلية (ملف PDF) بتاريخ 11-06-2016.
- جيرالد جاي سوسمان وجاي لويس ستيل الابن (ديسمبر 1975). . المجلد 349 من مذكرات الذكاء الاصطناعي . مختبر الذكاء الاصطناعي بمعهد ماساتشوستس للتكنولوجيا . CiteSeerX 10.1.1.128.80 – عبر ويكي مصدر .
روابط خارجية
- يوفر موقع scheme.org روابط للعديد من موارد Scheme، بما في ذلك المواصفات.
برمجة Scheme في ويكي بوكس- مقدمة عن المخطط
اكتب مخططك بنفسك في 48 ساعة على موقع ويكي بوكس
الوسائط المتعلقة بلغة البرمجة Scheme على ويكيميديا كومنز- مخطط أسبوعي
- إضافة للمتصفح تُضيف ميزة التفاعلية REPL إلى أي موقع ويب
- لغة البرمجة Scheme
- لغات البرمجة الأكاديمية
- لغات البرمجة ذات الكتابة الديناميكية
- لغات برمجة ذات بنية قابلة للتوسيع
- عائلة لغات البرمجة ليسب
- لغات البرمجة متعددة الأنماط
- لغات البرمجة التي تم إنشاؤها عام 1975
