مخطط (لغة برمجة)
| النماذج | متعدد النماذج : وظيفي ، إلزامي ، ميتافيزيقي |
|---|---|
| عائلة | ليشبس |
| صمم بواسطة | جاي إل ستيل جيرالد جاي سوسمان |
| ظهرت لأول مرة | 1975 |
| إصدار مستقر | R7RS / 2013 |
| الانضباط في الطباعة | ديناميكي ، كامن ، قوي |
| نِطَاق | معجمي |
| ملحقات اسم الملف | .scm، .ss |
| موقع إلكتروني | www.scheme.org |
| التنفيذات الرئيسية | |
| العديد (انظر تنفيذات المخطط ) | |
| متأثر بـ | |
| ألغول ، ليسب ، MDL | |
| متأثر | |
| Clojure ، Common Lisp ، Dylan ، EuLisp ، Haskell ، Hop ، JavaScript ، Julia ، Lua ، MultiLisp ، Python ، R ، Racket ، Ruby ، Rust ، [1] S ، Scala ، T | |
Scheme هي لهجة من عائلة لغات البرمجة Lisp . تم إنشاء Scheme خلال سبعينيات القرن العشرين في مختبر علوم الكمبيوتر والذكاء الاصطناعي التابع لمعهد ماساتشوستس للتكنولوجيا (MIT CSAIL) وتم إصدارها من قبل مطوريها، جاي إل ستيل وجيرالد جاي سوسمان ، عبر سلسلة من المذكرات المعروفة الآن باسم أوراق لامدا . كانت أول لهجة من لغة Lisp تختار نطاقًا معجميًا وأول لهجة تتطلب من التطبيقات إجراء تحسين استدعاء الذيل ، مما يوفر دعمًا أقوى للبرمجة الوظيفية والتقنيات المرتبطة بها مثل الخوارزميات التكرارية. كانت أيضًا واحدة من أولى لغات البرمجة التي تدعم الاستمرارية من الدرجة الأولى . كان لها تأثير كبير على الجهود التي أدت إلى تطوير Common Lisp . [2]
لغة Scheme موحدة في المعيار الرسمي لمعهد مهندسي الكهرباء والإلكترونيات (IEEE) [3] ومعيار فعلي يسمى التقرير المنقح عن مخطط اللغة الخوارزمية (R n RS). المعيار المطبق على نطاق واسع هو R5RS (1998). [4] أحدث معيار تم التصديق عليه من Scheme هو "R7RS-small" (2013). [5] تم التصديق على R6RS الأكثر توسعًا وقابلية للتعديل في عام 2007. [6] يتتبع كلاهما أصلهما من R5RS؛ يعكس الجدول الزمني أدناه الترتيب الزمني للتصديق.
تاريخ
الأصول
بدأت Scheme في سبعينيات القرن العشرين كمحاولة لفهم نموذج Actor لكارل هيويت ، ولهذا الغرض كتب ستيل وسوسمان "مترجمًا صغيرًا للغة ليسب" باستخدام ماكليسب ثم "أضافا آليات لإنشاء الممثلين وإرسال الرسائل". [7] كان يُطلق على Scheme في الأصل اسم "Schemer"، على غرار لغات أخرى مشتقة من ليسب مثل Planner أو Conniver . نتج الاسم الحالي عن استخدام المؤلفين لنظام التشغيل ITS ، والذي حد من أسماء الملفات إلى مكونين لا يزيد كل منهما عن ستة أحرف. حاليًا، يُستخدم "Schemer" بشكل شائع للإشارة إلى مبرمج Scheme.
ر6 ار اس
بدأت عملية توحيد معايير اللغة الجديدة في ورشة عمل 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. تم نقل العديد من الإجراءات القياسية إلى مكتبات المعايير الجديدة، والتي تشكل بحد ذاتها توسعًا كبيرًا للمعيار، وتحتوي على إجراءات وأشكال نحوية لم تكن جزءًا من المعيار سابقًا. تم تقديم نظام وحدة جديد، وتم توحيد أنظمة معالجة الاستثناءات الآن. تم استبدال قواعد بناء الجملة بمرفق تجريد نحوي أكثر تعبيرًا (حالة بناء الجملة) والذي يسمح باستخدام Scheme بالكامل في وقت التوسع الكلي. هناك حاجة الآن إلى تنفيذات متوافقة لدعم برج Scheme الرقمي الكامل ، وتم توسيع دلالات الأرقام، بشكل أساسي في اتجاه دعم معيار IEEE 754 للتمثيل العددي للفاصلة العائمة.
آر7آر إس
تسبب معيار 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 (مهجورة) | |||||||||||||||
| ماكليسب | |||||||||||||||
| إنترليسب | |||||||||||||||
| مدل | |||||||||||||||
| آلة ليسب ليسب | |||||||||||||||
| مخطط | ر5 ار اس | ر6 ار اس | R7RS صغيرة | ||||||||||||
| لا شيء | |||||||||||||||
| ZIL (لغة تنفيذ Zork) | |||||||||||||||
| فرانز ليسب | |||||||||||||||
| اللغة الشائعة | معيار ANSI | ||||||||||||||
| اللغة الليسبية | |||||||||||||||
| مخطط معهد ماساتشوستس للتكنولوجيا | |||||||||||||||
| إكسليسب | |||||||||||||||
| ت | |||||||||||||||
| مخطط شيز | |||||||||||||||
| إيماكس ليسب | |||||||||||||||
| أوتوليسب | |||||||||||||||
| بيكوليسب | |||||||||||||||
| غامبيت | |||||||||||||||
| يوليسب | |||||||||||||||
| إيسليب | |||||||||||||||
| أوبن ليسب | |||||||||||||||
| مخطط PLT | مضرب | ||||||||||||||
| لغة ليسب الجديدة | |||||||||||||||
| جنو جايل | |||||||||||||||
| لغة ليسب المرئية | |||||||||||||||
| كلوجور | |||||||||||||||
| قوس | |||||||||||||||
| ل ف إ | |||||||||||||||
| هاى | |||||||||||||||
| شياليسب | |||||||||||||||
السمات المميزة
Scheme هي لغة برمجة وظيفية في المقام الأول . وهي تشترك في العديد من الخصائص مع أعضاء آخرين من عائلة لغات البرمجة Lisp. يعتمد بناء جملة Scheme البسيط للغاية على تعبيرات s ، وهي قوائم بين قوسين يتبع فيها عامل البادئة وسيطاتها. وبالتالي تتكون برامج Scheme من تسلسلات من القوائم المتداخلة. كما تعد القوائم هي بنية البيانات الرئيسية في Scheme، مما يؤدي إلى تكافؤ وثيق بين كود المصدر وتنسيقات البيانات ( التماثل ). يمكن لبرامج Scheme إنشاء وتقييم أجزاء من كود Scheme ديناميكيًا بسهولة.
تعتمد جميع لهجات Lisp على القوائم كهياكل بيانات. يرث Scheme مجموعة غنية من العناصر الأولية لمعالجة القوائم مثل consو من أسلاف Lisp. يستخدم Scheme متغيرات ذات أنواع صارمة ولكن ديناميكية ويدعم الإجراءات من الدرجة الأولى . وبالتالي، يمكن carتعيينcdr الإجراءات كقيم للمتغيرات أو تمريرها كحجج للإجراءات.
يركز هذا القسم بشكل أساسي على الميزات المبتكرة للغة، بما في ذلك الميزات التي تميز Scheme عن لغات Lisps الأخرى. ما لم يُذكر خلاف ذلك، فإن أوصاف الميزات تتعلق بمعيار R5RS. في الأمثلة المقدمة في هذا القسم، يتم استخدام الترميز "===> النتيجة" للإشارة إلى نتيجة تقييم التعبير في السطر السابق مباشرة. هذه هي نفس الاتفاقية المستخدمة في 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، and، or، begin، named let، delay، unquote، unquote-splicing، quasiquote
مثال: ماكرو يتم تنفيذه letكتعبير يستخدم lambdaلأداء عمليات ربط المتغيرات.
( define-syntax let ( syntax-rules () (( let (( var expr ) ... ) body ... ) (( lambda ( var ... ) body ... ) expr ... ))))
وبالتالي، فإن استخدام letتنفيذ مخطط كما هو محدد أعلاه من شأنه إعادة كتابة " (let ((a 1)(b 2)) (+ b a))" كـ " ((lambda (a b) (+ b a)) 1 2)"، مما يقلل مهمة التنفيذ إلى مجرد ترميز عمليات إنشاء الإجراءات.
في عام 1998، أشار سوسمان وستيل إلى أن البساطة في Scheme لم تكن هدفًا تصميميًا واعيًا، بل كانت النتيجة غير المقصودة لعملية التصميم. "كنا نحاول في الواقع بناء شيء معقد واكتشفنا، بالصدفة، أننا صممنا عن طريق الصدفة شيئًا يلبي جميع أهدافنا ولكنه كان أبسط كثيرًا مما كنا ننوي... وأدركنا أن حساب لامدا - وهو شكلية صغيرة وبسيطة - يمكن أن يكون بمثابة جوهر لغة برمجة قوية ومعبرة." [7]
النطاق المعجمي
مثل معظم لغات البرمجة الحديثة وعلى عكس لغات Lisp السابقة مثل Maclisp ، فإن لغة Scheme محددة النطاق معجميًا: يمكن تحليل جميع الارتباطات المتغيرة المحتملة في وحدة البرنامج من خلال قراءة نص وحدة البرنامج دون النظر في السياقات التي قد يتم استدعاؤها فيها. يتناقض هذا مع النطاق الديناميكي الذي كان سمة مميزة لهجات Lisp المبكرة، بسبب تكاليف المعالجة المرتبطة بأساليب الاستبدال النصية البدائية المستخدمة لتنفيذ خوارزميات النطاق المعجمي في المترجمين والمفسرين في ذلك الوقت. في تلك اللغات Lisp، كان من الممكن تمامًا أن يشير مرجع إلى متغير حر داخل إجراء إلى ارتباطات مميزة تمامًا خارج الإجراء، اعتمادًا على سياق الاستدعاء.
كان الدافع لدمج نطاق المعجم، والذي كان نموذج نطاق غير عادي في أوائل السبعينيات، في نسختهم الجديدة من Lisp، من دراسات سوسمان لـ ALGOL . اقترح أن آليات نطاق المعجم المشابهة لـ ALGOL ستساعد في تحقيق هدفهم الأولي المتمثل في تنفيذ نموذج Actor الخاص بـ Hewitt في Lisp. [7]
تم تعميم الأفكار الرئيسية حول كيفية تقديم النطاق المعجمي في لهجة ليسب في ورقة لامدا التي كتبها سوسمان وستيل عام 1975، "المخطط: مفسر لحساب لامدا الموسع"، [18] حيث تبنيا مفهوم الإغلاق المعجمي (على الصفحة 21)، والذي تم وصفه في مذكرة الذكاء الاصطناعي في عام 1970 بواسطة جويل موسيس ، الذي نسب الفكرة إلى بيتر جيه لاندين . [19]
حساب لامدا
لقد ألهمت طريقة ألونزو تشرش الرياضية، حساب لامدا، استخدام لغة ليسب لكلمة "لامدا" ككلمة أساسية لتقديم إجراء ما، كما أثرت على تطوير تقنيات البرمجة الوظيفية التي تنطوي على استخدام وظائف من الدرجة الأعلى في ليسب. ولكن لغات ليسب المبكرة لم تكن تعبيرات مناسبة لحساب لامدا بسبب معالجتها للمتغيرات الحرة . [7]
يحتوي نظام لامدا الرسمي على بديهيات وقاعدة حساب كاملة. وهو مفيد للتحليل باستخدام المنطق الرياضي والأدوات. في هذا النظام، يمكن اعتبار الحساب بمثابة استنتاج اتجاهي. يتبع بناء جملة حساب لامدا التعبيرات المتكررة من x وy وz و... والأقواس والمسافات والنقطة والرمز λ. [20] تتضمن وظيفة حساب لامدا: أولاً، العمل كنقطة بداية للمنطق الرياضي القوي. ثانيًا، يمكن أن يقلل من متطلبات المبرمجين للنظر في تفاصيل التنفيذ، لأنه يمكن استخدامه لتقليد تقييم الآلة. أخيرًا، أنشأ حساب لامدا نظرية ميتافيزيقية كبيرة. [21]
حل تقديم النطاق المعجمي المشكلة من خلال إيجاد تكافؤ بين بعض أشكال تدوين لامدا وتعبيرها العملي في لغة برمجة عاملة. أظهر سوسمان وستيل أنه يمكن استخدام اللغة الجديدة لاستنباط جميع الدلالات الإلزامية والتصريحية للغات البرمجة الأخرى بما في ذلك ALGOL و Fortran ، والنطاق الديناميكي للغات Lisps الأخرى، من خلال استخدام تعبيرات لامدا ليس كمثيلات إجراءات بسيطة ولكن كـ "هياكل تحكم ومعدلات بيئة". [22] لقد قدموا أسلوب الاستمرار والتمرير جنبًا إلى جنب مع وصفهم الأول لـ Scheme في أول أوراق لامدا، وفي الأوراق اللاحقة، شرعوا في إظهار القوة الخام لهذا الاستخدام العملي لحساب لامدا.
هيكل الكتلة
يرث Scheme بنية كتلته من لغات هيكلة الكتل السابقة، وخاصة ALGOL . في Scheme، يتم تنفيذ الكتل من خلال ثلاثة هياكل ربط : letو let*و letrec. على سبيل المثال، ينشئ البناء التالي كتلة حيث يتم varربط الرمز الذي تم استدعاؤه بالرقم 10:
( قم بتعريف var "goose" ) ;; أي إشارة إلى var هنا ستكون مرتبطة بـ "goose" ( دع (( var 10 )) ;; العبارات تذهب هنا. أي إشارة إلى var هنا ستكون مرتبطة بـ 10. ) ;; أي إشارة إلى var هنا ستكون مرتبطة بـ "goose"
يمكن تعشيش الكتل لإنشاء هياكل كتل معقدة بشكل عشوائي وفقًا لاحتياجات المبرمج. إن استخدام هيكلة الكتل لإنشاء روابط محلية يخفف من خطر حدوث تصادم بين أسماء المجالات والذي قد يحدث بخلاف ذلك.
يسمح أحد المتغيرات لـ let، let*، للارتباطات بالإشارة إلى المتغيرات المحددة سابقًا في نفس البناء، وبالتالي:
( let* (( var1 10 ) ( var2 ( + var1 12 ))) ;; ولكن تعريف var1 لا يمكن أن يشير إلى var2 )
تم تصميم المتغير الآخر letrec، لتمكين ربط الإجراءات المتكررة المتبادلة مع بعضها البعض.
;; حساب تسلسلات هوفستاتر للذكور والإناث كقائمة من الأزواج
( حدد ( هوفستاتر-ذكر-أنثى n ) ( دعنا نستنتج (( أنثى ( لامدا ( n ) ( إذا ( = n 0 ) 1 ( - n ( ذكر ( أنثى ( - n 1 )))))))) ( ذكر ( لامدا ( n ) ( إذا ( = n 0 ) 0 ( - n ( أنثى ( ذكر ( - n 1 )))))))) ( دعنا نكرر (( i 0 )) ( إذا ( > i n ) ' () ( cons ( cons ( أنثى i ) ( ذكر i )) ( حلقة ( + i 1 ))))))))
( هوفستاتر-ذكر-أنثى 8 )
===> (( 1 . 0 ) ( 1 . 0 ) ( 2 . 1 ) ( 2 . 2 ) ( 3 . 2 ) ( 3 . 3 ) ( 4 . 4 ) ( 5 . 4 ) ( 5 . 5 ) )
(انظر تسلسلات هوفستاتر الذكورية والأنثوية للتعرف على التعريفات المستخدمة في هذا المثال.)
يمكن لجميع الإجراءات المرتبطة في ملف واحد letrecأن تشير إلى بعضها البعض بالاسم، وكذلك إلى قيم المتغيرات المحددة سابقًا في نفس الملف letrec، ولكنها لا يمكن أن تشير إلى القيم المحددة لاحقًا في نفس الملف letrec.
يحتوي أحد letأشكال صيغة "named let" على معرف بعد letالكلمة الأساسية. ويربط هذا متغيرات let بحجة إجراء يكون اسمه هو المعرف المحدد ويكون نصه هو نص صيغة let. ويمكن تكرار النص حسب الرغبة عن طريق استدعاء الإجراء. ويُستخدم نموذج let المسمى على نطاق واسع لتنفيذ التكرار.
مثال: عداد بسيط
( دع الحلقة (( n 1 )) ( إذا ( > n 10 ) ' () ( cons n ( حلقة ( + n 1 )))))
===> ( 1 2 3 4 5 6 7 8 9 10 )
كما هو الحال مع أي إجراء في Scheme، فإن الإجراء الذي تم إنشاؤه في let المسمى هو كائن من الدرجة الأولى.
تكرار الذيل الصحيح
يحتوي Scheme على بنية تكرار do، ولكن من الأكثر اصطلاحًا في Scheme استخدام التكرار الذيلي للتعبير عن التكرار . يلزم تنفيذ Scheme المطابق للمعايير لتحسين استدعاءات الذيل بحيث يدعم عددًا غير محدود من استدعاءات الذيل النشطة (R5RS sec. 3.5) [4] - وهي خاصية يصفها تقرير Scheme بأنها تكرار ذيل مناسب - مما يجعل من الآمن لمبرمجي Scheme كتابة خوارزميات تكرارية باستخدام هياكل تكرارية، والتي تكون في بعض الأحيان أكثر بديهية. توفر إجراءات التكرار الذيلي والشكل المسمىlet الدعم للتكرار باستخدام التكرار الذيلي.
;; إنشاء قائمة من المربعات من 0 إلى 9:
;; ملاحظة: الحلقة هي ببساطة رمز عشوائي يستخدم كعلامة. أي رمز سيفي بالغرض.
( حدد ( قائمة المربعات n ) ( دع حلقة (( i n ) ( res ' ())) ( إذا ( < i 0 ) res ( حلقة ( - i 1 ) ( cons ( * i i ) res )))))
( قائمة المربعات 9 ) ===> ( 0 1 4 9 16 25 36 49 64 81 )
استمرارية من الدرجة الأولى
الاستمرارات في Scheme هي كائنات من الدرجة الأولى . يوفر Scheme الإجراء call-with-current-continuation(المعروف أيضًا باسم call/cc) لالتقاط الاستمرارية الحالية عن طريق حزمها كإجراء هروب مرتبط بحجة رسمية في إجراء يوفره المبرمج. (R5RS sec. 6.4) [4] تمكن الاستمرارات من الدرجة الأولى المبرمج من إنشاء بنيات تحكم غير محلية مثل المتكررات والبرامج الفرعية والتتبع الخلفي .
يمكن استخدام التكملة لمحاكاة سلوك عبارات الإرجاع في لغات البرمجة الإلزامية. الدالة التالية find-first، مع إعطاء الدالة funcوالقائمة lst، تعيد العنصر الأول xبحيث lstيعود (func x)صحيحًا.
( تعريف ( دالة البحث أولاً lst ) ( استدعاء مع الاستمرارية الحالية ( لامدا ( العودة فورًا ) ( لكل ( لامدا ( x ) ( إذا ( دالة x ) ( العودة فورًا x ))) lst ) #f )))
( أولاً إيجاد عدد صحيح؟ ' ( 1/2 3/4 5.6 7 8/9 10 11 )) ===> 7 ( أولاً إيجاد صفر؟ ' ( 1 2 3 4 )) ===> #f
يوضح المثال التالي، وهو لغز مبرمج تقليدي، أن Scheme يمكنه التعامل مع الاستمراريات ككائنات من الدرجة الأولى، وربطها بالمتغيرات وتمريرها كوسائط إلى الإجراءات.
( دع* (( yin (( lambda ( cc ) ( عرض "@" ) cc ) ( استدعاء مع استمرار التيار ( lambda ( c ) c )))) ( يانج (( lambda ( cc ) ( عرض "*" ) cc ) ( استدعاء مع استمرار التيار ( lambda ( c ) c ))))) ( يين يانج ))
عند تنفيذ هذا الكود يعرض تسلسل العد:@*@**@***@****@*****@******@*******@********...
مساحة اسم مشتركة للإجراءات والمتغيرات
على النقيض من Common Lisp، تشترك جميع البيانات والإجراءات في Scheme في مساحة اسم مشتركة، بينما في Common Lisp، يكون للوظائف والبيانات مساحات اسم منفصلة مما يجعل من الممكن أن يكون للوظيفة والمتغير نفس الاسم، ويتطلب تدوينًا خاصًا للإشارة إلى الوظيفة كقيمة. يُعرف هذا أحيانًا باسم التمييز " Lisp-1 vs. Lisp-2 "، في إشارة إلى مساحة الاسم الموحدة لـ Scheme ومساحات الأسماء المنفصلة لـ Common Lisp. [23]
في Scheme، يمكن استخدام نفس العناصر الأولية المستخدمة في معالجة البيانات وربطها لربط الإجراءات. لا يوجد ما يعادل لغة Common Lisp defunوالعناصر #'الأولية.
;; متغير مرتبط برقم:
( 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 )
معايير التنفيذ
يوثق هذا القسم الفرعي قرارات التصميم التي تم اتخاذها على مر السنين والتي أعطت المخطط طابعًا معينًا، ولكنها ليست النتائج المباشرة للتصميم الأصلي.
برج رقمي
يحدد المخطط مجموعة كاملة نسبيًا من أنواع البيانات الرقمية بما في ذلك الأنواع المعقدة والعقلانية ، والتي تُعرف في المخطط باسم البرج الرقمي (R5RS sec. 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.333333333333333 ;; تحقق من الدقة. ( دقيق؟ xr ) ===> #f ( دقيق؟ xi ) ===> #f
يتوافق كلا التنفيذين مع معيار R5RS، لكن التنفيذ الثاني لا يتوافق مع معيار R6RS لأنه لا ينفذ البرج العددي الكامل.
تأخر التقييم
يدعم المخطط التقييم المتأخر من خلال delayالنموذج والإجراء force.
( حدد 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
ترتيب تقييم حجج الإجراء
تحدد أغلب لغات Lisps ترتيبًا لتقييم حجج الإجراء. لا يحدد Scheme ترتيبًا. يمكن اختيار ترتيب التقييم - بما في ذلك الترتيب الذي يتم به تقييم التعبير في موضع العامل - بواسطة التنفيذ على أساس كل استدعاء على حدة، والقيد الوحيد هو أن "تأثير أي تقييم متزامن لتعبيرات العامل والمتغير مقيد بالتوافق مع ترتيب تسلسلي للتقييم." (R5RS s. 4.1.3) [4]
( دع (( ev ( lambda ( n ) ( اعرض "التقييم " ) ( اعرض ( if ( procedure? n ) "procedure" n )) ( newline ) n ))) (( ev + ) ( ev 1 ) ( ev 2 ))) ===> 3
التقييم 1
التقييم 2
إجراء التقييم
ev هو إجراء يصف الحجة التي تم تمريرها إليه، ثم يعيد قيمة الحجة. وعلى النقيض من لغات Lisps الأخرى، فإن ظهور تعبير في موضع المشغل (العنصر الأول) من تعبير Scheme أمر قانوني تمامًا، طالما أن نتيجة التعبير في موضع المشغل هي إجراء.
عند استدعاء الإجراء " + " لإضافة 1 و2، يمكن تقييم التعبيرات (ev +) و(ev 1) و (ev 2) بأي ترتيب، طالما أن التأثير ليس كما لو تم تقييمها بالتوازي. وبالتالي، يمكن عرض الأسطر الثلاثة التالية بأي ترتيب بواسطة مخطط قياسي عند تنفيذ كود المثال أعلاه، على الرغم من أنه لا يجوز تداخل نص سطر واحد مع سطر آخر لأن ذلك من شأنه أن ينتهك قيد التقييم المتسلسل.
الماكرو الصحية
في معيار R5RS وفي التقارير اللاحقة أيضًا، يمكن توسيع بناء جملة Scheme بسهولة عبر نظام الماكرو. قدم معيار R5RS نظام ماكرو صحي قوي يسمح للمبرمج بإضافة بنيات نحوية جديدة إلى اللغة باستخدام لغة فرعية مطابقة للأنماط البسيطة (R5RS sec 4.3). [4] قبل ذلك، تم تهميش نظام الماكرو الصحي إلى ملحق لمعيار R4RS، كنظام "عالي المستوى" إلى جانب نظام ماكرو "منخفض المستوى"، وكلاهما تم التعامل معهما كامتدادات لـ Scheme بدلاً من كونهما جزءًا أساسيًا من اللغة. [25]
تتطلب تنفيذات نظام الماكرو الصحي، والذي يُسمى أيضًا syntax-rules، احترام النطاق المعجمي لبقية اللغة. ويتم ضمان ذلك من خلال قواعد تسمية ونطاق خاصة لتوسيع الماكرو وتجنب أخطاء البرمجة الشائعة التي يمكن أن تحدث في أنظمة الماكرو للغات البرمجة الأخرى. تحدد R6RS نظام تحويل أكثر تطورًا، ، syntax-caseوالذي كان متاحًا كملحق لغوي لمخطط R5RS لبعض الوقت.
;; قم بتعريف ماكرو لتنفيذ متغير من "if" مع
فرع تعبير متعدد ;; true ولا يوجد فرع false.
( 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بأنه "مشابه لوظيفة LISP EVAL" [18] واستبدل التقرير المنقح الأول في عام 1978 هذا بـ enclose، والذي أخذ حجتين. حذفت التقارير المنقحة الثانية والثالثة والرابعة أي معادل لـ eval.
السبب وراء هذا الارتباك هو أنه في Scheme مع نطاقه المعجمي، تعتمد نتيجة تقييم تعبير ما على المكان الذي يتم تقييمه فيه. على سبيل المثال، ليس من الواضح ما إذا كانت نتيجة تقييم التعبير التالي يجب أن تكون 5 أو 6: [27]
( دع (( name '+ )) ( دع (( + * )) ( قيم ( قائمة name 2 3 ))))
إذا تم تقييمه في البيئة الخارجية، حيث nameيتم تعريف، تكون النتيجة هي مجموع المتغيرات. إذا تم تقييمه في البيئة الداخلية، حيث تم ربط الرمز "+" بقيمة الإجراء "*"، تكون النتيجة هي حاصل ضرب المتغيرات.
يقوم R5RS بحل هذا الارتباك من خلال تحديد ثلاثة إجراءات تقوم بإرجاع البيئات وتوفير إجراء evalيأخذ تعبير s وبيئة ويقوم بتقييم التعبير في البيئة المقدمة. (R5RS القسم 6.5) [4] يقوم R6RS بتوسيع هذا من خلال توفير إجراء يتم استدعاؤه environmentيمكن للمبرمج من خلاله تحديد الكائنات التي سيتم استيرادها إلى بيئة التقييم على وجه التحديد.
باستخدام المخطط الحديث (المتوافق عادةً مع R5RS) لتقييم هذا التعبير، نحتاج إلى تعريف دالة evaluateيمكن أن تبدو مثل هذا:
( تعريف ( تقييم التعبير ) ( تقييم التعبير ( بيئة التفاعل )))
interaction-environmentهي البيئة العالمية للمترجم.
معالجة القيم غير المنطقية في التعبيرات المنطقية
في أغلب لهجات لغة Lisp بما في ذلك Common Lisp، يتم تقييم القيمة وفقًا للاتفاقية NILإلى القيمة false في تعبير منطقي. في Scheme، منذ معيار IEEE في عام 1991، [3] يتم تقييم جميع القيم باستثناء #f، بما في ذلك NILمكافئ ' في Scheme والذي يُكتب على هيئة '()، إلى القيمة true في تعبير منطقي. (R5RS sec. 6.3.1) [4]
حيث أن الثابت الذي يمثل القيمة المنطقية true Tفي معظم لغات Lisps هو، في Scheme يكون هو #t.
عدم ترابط أنواع البيانات البدائية
في Scheme، تكون أنواع البيانات الأولية منفصلة. يمكن أن يكون أحد المتنبئات التالية فقط صحيحًا لأي كائن Scheme: boolean?, pair?, symbol?, number?, char?, string?, vector?, port?, procedure?. (R5RS sec 3.2) [4]
على النقيض من ذلك، تتداخل القيم الرقمية داخل نوع البيانات العددي. على سبيل المثال، تلبي قيمة عددية صحيحة جميع المسندات و و و integer?في rational?نفس real?الوقت . (R5RS sec 6.2) [4]complex?number?
مسندات التكافؤ
يحتوي المخطط على ثلاثة أنواع مختلفة من التكافؤ بين الكائنات التعسفية التي يتم الإشارة إليها من خلال ثلاثة مسندات تكافؤ مختلفة ، ومشغلات العلاقات لاختبار المساواة eq?، eqv?و equal?:
eq?يتم تقييمه#fما لم تمثل معلماته نفس كائن البيانات في الذاكرة؛eqv?يكون بشكل عام هو نفسهeq?ولكن يعامل الكائنات البدائية (مثل الأحرف والأرقام) بشكل خاص بحيث تكون الأرقام التي تمثل نفس القيمةeqv?متساوية إذا كانت لا تشير إلى نفس الكائن؛equal?يقارن بين هياكل البيانات مثل القوائم والمتجهات والسلاسل لتحديد ما إذا كانت لها بنية ومحتويات متطابقةeqv?. (R5RS القسم 6.1) [4]
توجد أيضًا عمليات التكافؤ المعتمدة على النوع في Scheme: string=?ومقارنة string-ci=?سلسلتين (يقوم الأخير بإجراء مقارنة مستقلة عن حالة الأحرف)؛ char=?ومقارنة char-ci=?الأحرف؛ =ومقارنة الأرقام. [4]
تعليقات
حتى معيار R5RS، كان التعليق القياسي في Scheme عبارة عن فاصلة منقوطة، مما يجعل بقية السطر غير مرئية لـ Scheme. وقد دعمت العديد من التطبيقات اتفاقيات بديلة تسمح للتعليقات بالامتداد لأكثر من سطر واحد، ويسمح معيار R6RS باثنين منها: يمكن تحويل تعبير s بالكامل إلى تعليق (أو "التعليق عليه") عن طريق وضعه قبله بـ #;(تم تقديمه في SRFI 62 [28] ) ويمكن إنتاج تعليق متعدد الأسطر أو "تعليق كتلة" عن طريق إحاطة النص بـ #|و |#.
الإدخال/الإخراج
يعتمد إدخال وإخراج المخطط على نوع بيانات المنفذ . (R5RS القسم 6.6) [4] يحدد R5RS منفذين افتراضيين، يمكن الوصول إليهما بالإجراءات current-input-portو current-output-port، والتي تتوافق مع مفاهيم يونكس للإدخال القياسي والإخراج القياسي . توفر معظم التنفيذات أيضًا current-error-port. يتم دعم إعادة توجيه الإدخال والإخراج القياسي في المعيار، من خلال إجراءات قياسية مثل with-input-from-fileو with-output-to-file. توفر معظم التنفيذات منافذ سلسلة ذات إمكانيات إعادة توجيه مماثلة، مما يتيح إجراء العديد من عمليات الإدخال والإخراج العادية على مخازن السلسلة بدلاً من الملفات، باستخدام الإجراءات الموضحة في SRFI 6. [29] يحدد معيار R6RS إجراءات منفذ أكثر تطورًا وكفاءة والعديد من الأنواع الجديدة من المنافذ.
تمت كتابة الأمثلة التالية وفقًا لمخطط R5RS الصارم.
المثال 1: مع إخراج افتراضي إلى (منفذ الإخراج الحالي):
( دع (( hello0 ( lambda () ( عرض "Hello world" ) ( سطر جديد )))) ( hello0 ))
المثال 2: كـ 1، ولكن باستخدام وسيطة المنفذ الاختيارية لإخراج الإجراءات
( دع (( hello1 ( lambda ( p ) ( عرض "Hello world" p ) ( سطر جديد p ))) ( hello1 ( منفذ الإخراج الحالي )))
المثال 3: كـ 1، ولكن يتم إعادة توجيه الإخراج إلى ملف تم إنشاؤه حديثًا
;; ملاحظة: with-output-to-file هو إجراء اختياري في R5RS
( let (( hello0 ( lambda () ( display "Hello world" ) ( newline )))) ( with-output-to-file "helloworldoutputfile" hello0 ))
المثال 4: كـ 2، ولكن مع فتح ملف صريح وإغلاق المنفذ لإرسال الإخراج إلى الملف
( دع (( hello1 ( lambda ( p ) ( عرض "Hello world" p ) ( سطر جديد p ))) ( منفذ الإخراج ( فتح ملف الإخراج "helloworldoutputfile" ))) ( منفذ إخراج hello1 ) ( إغلاق منفذ الإخراج منفذ الإخراج ) )
المثال 5: مثل 2، ولكن مع استخدام call-with-output-file لإرسال الإخراج إلى ملف.
( دع (( hello1 ( lambda ( p ) ( عرض "Hello world" p ) ( سطر جديد p )))) ( استدعاء مع ملف الإخراج "helloworldoutputfile" hello1 ))
يتم توفير إجراءات مماثلة للإدخال. يوفر مخطط R5RS المسندات input-port?و output-port?. لإدخال وإخراج الأحرف، يتم توفير write-char, read-char, peek-charو char-ready?. لكتابة وقراءة تعبيرات المخطط، يوفر المخطط 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 sec 7.1) [6] وبسبب هذا، فإن إعادة تعريف الإجراءات القياسية عن طريق الطفرة محظورة. وبدلاً من ذلك، من الممكن استيراد إجراء مختلف تحت اسم إجراء قياسي، وهو ما يشبه إعادة التعريف فعليًا.
التسمية واتفاقيات التسمية
في Standard Scheme، تحتوي الإجراءات التي تحول من نوع بيانات إلى آخر على سلسلة الأحرف "->" في اسمها، وتنتهي المسندات بعلامة "؟"، وتنتهي الإجراءات التي تغير قيمة البيانات المخصصة بالفعل بعلامة "!". غالبًا ما يتبع مبرمجو Scheme هذه الاتفاقيات.
في السياقات الرسمية مثل معايير المخطط، تُستخدم كلمة "إجراء" بدلاً من "وظيفة" للإشارة إلى تعبير لامدا أو إجراء بدائي. في الاستخدام العادي، تُستخدم كلمتا "إجراء" و"وظيفة" بالتبادل. يُشار أحيانًا إلى تطبيق الإجراء رسميًا باسم الجمع .
كما هو الحال في لغات Lisps الأخرى، يُستخدم مصطلح " thunk " في Scheme للإشارة إلى إجراء بدون وسيطات. يشير مصطلح "التكرار الذيلي الصحيح" إلى خاصية جميع تطبيقات Scheme، وهي أنها تقوم بتحسين استدعاء الذيل لدعم عدد غير محدد من استدعاءات الذيل النشطة .
شكل عناوين وثائق المعايير منذ R3RS، "تقرير منقح عن مخطط اللغة الخوارزمية"، هو إشارة إلى عنوان وثيقة معيار ALGOL 60 ، "تقرير منقح عن اللغة الخوارزمية Algol 60"، صفحة الملخص في R3RS مصممة بشكل وثيق على غرار صفحة الملخص في تقرير ALGOL 60. [31] [32]
مراجعة النماذج والإجراءات القياسية
تم تعريف اللغة رسميًا في المعايير R5RS (1998) [4] وR6RS (2007). [6] وهي تصف "الأشكال" القياسية: الكلمات الأساسية والقواعد النحوية المصاحبة، والتي توفر بنية التحكم في اللغة، والإجراءات القياسية التي تؤدي المهام الشائعة.
الاستمارات القياسية
يصف هذا الجدول النماذج القياسية في Scheme. تظهر بعض النماذج في أكثر من صف واحد لأنه لا يمكن تصنيفها بسهولة في وظيفة واحدة في اللغة.
يتم تصنيف النماذج التي تحمل علامة "L" في هذا الجدول على أنها نماذج "مكتبة" مشتقة في المعيار ويتم تنفيذها غالبًا كوحدات ماكرو باستخدام نماذج أكثر جوهرية في الممارسة العملية، مما يجعل مهمة التنفيذ أسهل بكثير من اللغات الأخرى.
| غاية | الاستمارات |
|---|---|
| تعريف | يُعرِّف |
| إنشاءات الربط | لامدا، دو (ل)، دع (ل)، دع* (ل)، دع (ل) |
| التقييم الشرطي | إذا، الشرط (ل)، الحالة (ل)، و (ل)، أو (ل) |
| التقييم المتسلسل | يبدأ (*) |
| التكرار | لامدا، دو (ل)، سمي ليت (ل) |
| الامتداد النحوي | تعريف بناء الجملة، بناء الجملة let، بناء الجملة letrec، قواعد بناء الجملة (R5RS)، بناء الجملة وحالة الأحرف (R6RS) |
| اقتباس | اقتباس(')، إلغاء الاقتباس(,)، شبه الاقتباس(`)، إلغاء الاقتباس-الربط(,@) |
| تكليف | تعيين! |
| تأخر التقييم | التأخير (ل) |
بينما beginيتم تعريفه على أنه بناء جملة مكتبة في R5RS، يجب أن يعرفه الموسع لتحقيق وظيفة الربط. في R6RS لم يعد بناء جملة مكتبة.
الإجراءات القياسية
يصف الجدولان التاليان الإجراءات القياسية في مخطط R5RS. يعتبر مخطط R6RS أكثر شمولاً ولن يكون من العملي تقديم ملخص من هذا النوع.
تظهر بعض الإجراءات في أكثر من صف واحد لأنه لا يمكن تصنيفها بسهولة في وظيفة واحدة في اللغة.
| غاية | إجراءات |
|---|---|
| بناء | متجه، متجه مكوّن، سلسلة مكوّنة، قائمة |
| مسندات التكافؤ | معادل؟، معادل؟، يساوي؟، سلسلة=؟، سلسلة-ci=؟، حرف=؟، حرف-ci=؟ |
| تحويل النوع | متجه->قائمة، قائمة->متجه، رقم->سلسلة، سلسلة->رقم، رمز->سلسلة، سلسلة->رمز، حرف->عدد صحيح، عدد صحيح->حرف، سلسلة->قائمة، قائمة->سلسلة |
| أرقام | انظر الجدول المنفصل |
| أوتار | سلسلة؟، إنشاء سلسلة، سلسلة، طول السلسلة، مرجع السلسلة، مجموعة السلسلة!، سلسلة=؟، سلسلة-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 |
| متجهات | جعل-متجه، متجه، متجه؟، طول المتجه، مرجع المتجه، مجموعة متجهات!، متجه->قائمة، قائمة->متجه، تعبئة المتجه! |
| الرموز | الرمز->سلسلة، سلسلة->رمز، رمز؟ |
| الأزواج والقوائم | زوج؟، سلبيات، سيارة، cdr، مجموعة-سيارة!، مجموعة-cdr!، لا شيء؟، قائمة؟، قائمة، طول، إضافة، عكس، ذيل القائمة، مرجع القائمة، memq. memv. عضو، assq، assv، assoc، قائمة->متجه، متجه->قائمة، قائمة->سلسلة، سلسلة->قائمة |
| مسندات الهوية | منطقي؟، زوج؟، رمز؟، رقم؟، حرف؟، سلسلة؟، متجه؟، منفذ؟، إجراء؟ |
| استمرار | نداء مع استمرار التيار (نداء/cc)، قيم، نداء مع قيم، رياح ديناميكية |
| البيئات | تقييم، بيئة تقرير المخطط، بيئة فارغة، بيئة تفاعل (اختياري) |
| الإدخال/الإخراج | عرض، سطر جديد، قراءة، كتابة، قراءة-حرف، كتابة-حرف، peek-char، char-ready؟، نهاية الكائن؟ فتح-ملف-إدخال، فتح-ملف-إخراج، إغلاق-منفذ-الإدخال، إغلاق-منفذ-الإخراج، منفذ-الإدخال؟، منفذ-الإخراج؟، منفذ-الإدخال-الحالي، منفذ-الإخراج-الحالي، الاتصال-مع-ملف-الإدخال، الاتصال-مع-ملف-الإخراج، مع-الإدخال-من-الملف(اختياري)، مع-الإدخال-إلى-الملف(اختياري) |
| واجهة النظام | تحميل (اختياري)، تشغيل النسخ (اختياري)، إيقاف النسخ (اختياري) |
| تأخر التقييم | قوة |
| البرمجة الوظيفية | الإجراء؟، تطبيق، خريطة، لكل منها |
| القيم المنطقية | منطقي؟ لا |
تؤدي إجراءات السلسلة والأحرف التي تحتوي على "-ci" في أسمائها إلى إجراء مقارنات مستقلة عن حالة الأحرف بين وسيطاتها: يتم اعتبار إصدارات الأحرف الكبيرة والصغيرة من نفس الحرف متساوية.
| غاية | إجراءات |
|---|---|
| العمليات الحسابية الأساسية | +، -، *، /، abs، حاصل القسمة، الباقي، modulo، gcd، lcm، expt، sqrt |
| الأعداد النسبية | البسط، المقام، النسبي؟، ترشيد |
| تقريب | الأرضية، السقف، مقطوع، دائري |
| دقة | غير دقيق->دقيق، دقيق->غير دقيق، دقيق؟، غير دقيق؟ |
| عدم المساواة | <, <= , >, >=, = |
| مسندات متنوعة | صفر؟، سلبي؟، موجب؟ فردي؟ زوجي؟ |
| الحد الأقصى والحد الأدنى | الحد الأقصى، الحد الأدنى |
| علم المثلثات | الخطيئة، كوس، تان، آسين، أكوس، أتان |
| الأسّيّات | خبرة، سجل |
| الأعداد المركبة | جعل مستطيل، جعل قطبي، جزء حقيقي، جزء صورة، مقدار، زاوية، مركب؟ |
| المدخلات والمخرجات | الرقم->سلسلة، سلسلة->رقم |
| مسندات النوع | عدد صحيح؟، نسبي؟، حقيقي؟، مركب؟، عدد؟ |
تم تعريف تنفيذات - و / التي تأخذ أكثر من وسيطتين ولكن تم تركها اختيارية في R5RS.
طلبات تنفيذ المخطط
نظرًا لبساطة Scheme، فإن العديد من الإجراءات الشائعة والأشكال النحوية لا يتم تعريفها بواسطة المعيار. من أجل الحفاظ على اللغة الأساسية صغيرة ولكن تسهيل توحيد الامتدادات، فإن مجتمع Scheme لديه عملية "طلب تنفيذ Scheme" (SRFI) والتي يتم من خلالها تعريف مكتبات الامتداد من خلال مناقشة دقيقة لمقترحات الامتداد. وهذا يعزز قابلية نقل التعليمات البرمجية. يتم دعم العديد من طلبات التنفيذ 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 لغة أوسع بكثير، في محاولة لتوسيع جاذبيتها للمبرمجين.
توفر جميع التطبيقات تقريبًا حلقة قراءة وتقييم وطباعة تقليدية على غرار لغة Lisp للتطوير وتصحيح الأخطاء. كما تقوم العديد منها بتجميع برامج Scheme إلى ملفات ثنائية قابلة للتنفيذ. كما أن دعم تضمين كود Scheme في البرامج المكتوبة بلغات أخرى أمر شائع أيضًا، حيث أن البساطة النسبية لتطبيقات Scheme تجعلها خيارًا شائعًا لإضافة قدرات البرمجة النصية إلى أنظمة أكبر تم تطويرها بلغات مثل C. تقوم مفسرات Gambit وChicken و Bigloo Scheme بتجميع Scheme إلى C، مما يجعل التضمين أسهل بكثير. علاوة على ذلك، يمكن تكوين مُجمِّع Bigloo لتوليد كود ثنائي لآلة Java الافتراضية (JVM)، ولديه مولد كود ثنائي تجريبي لـ .NET .
تدعم بعض التطبيقات ميزات إضافية. على سبيل المثال، توفر Kawa و JScheme التكامل مع فئات Java ، وغالبًا ما تجعل مُجمِّعات Scheme to C من السهل استخدام المكتبات الخارجية المكتوبة بلغة C، حتى السماح بتضمين كود C في كود مصدر Scheme. مثال آخر هو Pvts، الذي يوفر مجموعة من الأدوات المرئية التي تدعم تعلم Scheme.
الاستخدام
يستخدم Scheme على نطاق واسع من قبل العديد من المدارس [35] ؛ على وجه الخصوص، تستخدم العديد من دورات علوم الكمبيوتر التمهيدية Scheme جنبًا إلى جنب مع كتاب هيكل وتفسير برامج الكمبيوتر (SICP). [36] على مدار السنوات الـ 12 الماضية، قامت PLT بتشغيل مشروع ProgramByDesign (المعروف سابقًا باسم TeachScheme!)، والذي عرض ما يقرب من 600 مدرس في المدرسة الثانوية وآلاف الطلاب في المدارس الثانوية لبرمجة Scheme الأولية. تم تدريس فئة البرمجة التمهيدية القديمة 6.001 في Scheme، [37] وعلى الرغم من استبدال 6.001 بدورات أكثر حداثة، لا يزال يتم تدريس SICP في معهد ماساتشوستس للتكنولوجيا. [38] وبالمثل، تم تدريس الفئة التمهيدية في جامعة كاليفورنيا في بيركلي ، CS 61A، حتى عام 2011 بالكامل في Scheme، باستثناء التحويلات الطفيفة في Logo لإظهار النطاق الديناميكي. اليوم، مثل معهد ماساتشوستس للتكنولوجيا، استبدلت بيركلي المنهج الدراسي بنسخة أكثر حداثة يتم تدريسها في المقام الأول بلغة بايثون 3 ، ولكن المنهج الدراسي الحالي لا يزال يعتمد على المنهج القديم، ولا تزال أجزاء من الفصل الدراسي تُدرس في Scheme. [39]
يستخدم بعض معاهد التعليم العالي كتاب كيفية تصميم البرامج لماتياس فيليسن، الموجود حاليًا في جامعة نورث إيسترن، في دورات علوم الكمبيوتر التمهيدية الخاصة بهم. تستخدم كل من جامعة نورث إيسترن ومعهد ووستر بوليتكنيك Scheme حصريًا لدوراتهما التمهيدية أساسيات علوم الكمبيوتر (CS2500) ومقدمة في تصميم البرامج (CS1101)، على التوالي. [40] [41] تستخدم روز هولمان Scheme في دورة مفاهيم لغة البرمجة الأكثر تقدمًا. [42] يتم أيضًا تدريس الدورة الأساسية لجامعة برانديز ، هيكل وتفسيرات برامج الكمبيوتر (COSI121b)، حصريًا في Scheme بواسطة عالم الكمبيوتر النظري هاري ميرسون . [43] يتم تدريس الفصل التمهيدي لجامعة إنديانا ، C211، بالكامل في Scheme. تستمر النسخة ذاتية الوتيرة من الدورة، CS 61AS، في استخدام Scheme. [44] يتم تدريس دورات علوم الكمبيوتر التمهيدية في جامعة ييل وكلية غرينيل أيضًا في Scheme. [45] تستخدم نماذج تصميم البرمجة، [46] وهي دورة إلزامية لطلاب الدراسات العليا في علوم الكمبيوتر في جامعة نورث إيسترن ، أيضًا Scheme على نطاق واسع. استخدمت دورة علوم الكمبيوتر التمهيدية السابقة في جامعة مينيسوتا - توين سيتيز، CSCI 1901، أيضًا Scheme كلغة أساسية، تليها دورة قدمت للطلاب لغة Java؛ [47] ومع ذلك، باتباع مثال معهد ماساتشوستس للتكنولوجيا، استبدل القسم 1901 بدورة CSCI 1133 المستندة إلى بايثون، [48] بينما يتم تغطية البرمجة الوظيفية بالتفصيل في دورة الفصل الدراسي الثالث CSCI 2041. [49]
تم استخدام المخطط أيضًا لما يلي:
- تستخدم لغة دلالات ومواصفات أنماط المستندات (DSSSL)، التي توفر طريقة لتحديد أوراق أنماط SGML ، مجموعة فرعية من المخطط. [50]
- يستخدم محرر الرسومات النقطية مفتوح المصدر المعروف GIMP لغة TinyScheme كلغة برمجة نصية . [51]
- تم اعتماد Guile بواسطة مشروع GNU كلغة برمجة نصية رسمية، وتم تضمين تنفيذ Scheme في تطبيقات مثل GNU LilyPond و GnuCash كلغة برمجة نصية للإضافات. وبالمثل، كانت Guile هي لغة البرمجة النصية لبيئة سطح المكتب GNOME ، [52] ولا يزال GNOME لديه مشروع يوفر روابط Guile لمجموعة مكتباته. [53] يوجد مشروع لدمج Guile في GNU Emacs ، برنامج GNU الرائد، ليحل محل مفسّر Emacs Lisp الحالي . [ بحاجة لمصدر ]
- تستخدم شركة Synopsys لغة Elk Scheme كلغة برمجة لأدوات التصميم بمساعدة الكمبيوتر (TCAD) الخاصة بها . [54]
- استخدم شيرو كاواي، كبير المبرمجين في فيلم Final Fantasy: The Spirits Within ، Scheme كلغة برمجة نصية لإدارة محرك العرض في الوقت الفعلي. [55]
- يستخدم Google App Inventor لنظام Android برنامج Scheme، حيث يتم استخدام Kawa لتجميع كود Scheme إلى أكواد ثنائية للآلة الافتراضية Java التي تعمل على أجهزة Android. [56]
انظر أيضا
- أساسيات لغات البرمجة ، كتاب مدرسي باستخدام Scheme كأساس
مراجع
- ^ "التأثيرات - مرجع Rust". مرجع Rust . تم الاسترجاع في 2023-04-18 .
- ^ Common LISP: The Language, 2nd Ed., Guy L. Steele Jr. Digital Press; 1981. ISBN 978-1-55558-041-4 . "Common Lisp هي لهجة جديدة من Lisp، خليفة لـ MacLisp، متأثرة بشدة بلغة ZetaLisp وإلى حد ما بلغة Scheme وInterLisp."
- ^ ab 1178-1990 (Reaff 2008) معيار IEEE للغة برمجة Scheme. رقم جزء IEEE STDPD14209، تم التأكيد عليه بالإجماع في اجتماع لجنة مراجعة المعايير التابعة لمجلس معايير IEEE-SA (RevCom)، 26 مارس 2008 (البند 6.3 في المحاضر)، محضر إعادة التأكيد تم الوصول إليه في أكتوبر 2009. هذا المستند متاح من IEEE للشراء فقط، وليس متاحًا عبر الإنترنت وقت كتابة هذا: 2009.
- ^ abcdefghijklmnopqr Richard Kelsey; William Clinger; Jonathan Rees; et al. (August 1998). "تقرير منقح5 عن مخطط اللغة الخوارزمية". الحساب الرمزي والحوسبة ذات الترتيب الأعلى . 11 (1): 7–105. doi :10.1023/A:1010051815785. S2CID 14069423. تم الاسترجاع في 2012-08-09 .
- ^ "R7RS النهائي متاح" (PDF) . 2013-07-06.
- ^ abcde Sperber, Michael; Dybvig, R. Kent; Flatt, Matthew; Van Straaten, Anton; et al. (August 2007). "تقرير منقح6 عن مخطط اللغة الخوارزمية (R6RS)". لجنة توجيه المخطط . تم الاسترجاع في 2011-09-13 .
- ^ abcd Sussman, Gerald Jay; Steele, Guy L. (1 December 1998). "The First Report on Scheme Revisited". Higher-Order and Symbolic Computation . 11 (4): 399–404. doi :10.1023/A:1010079421970. S2CID 7704398.
- ^ "تطبيقات R6RS". r6rs.org . تم الاسترجاع في 2017-11-24 .
- ^ عبد العزيز غلوم (2007-10-27). "مكتبات R6RS ونظام بناء الجملة والحالة (psyntax)". مخطط إيكاروس . تم استرجاعه في 2009-10-20 .
- ^ Keep, Andrew W.; Dybvig, R. Kent (نوفمبر 2014). "تمثيل وقت التشغيل لأنواع سجلات المخطط". مجلة البرمجة الوظيفية . 24 (6): 675–716. doi : 10.1017/S0956796814000203 . S2CID 40001845.
- ^ "تقرير منقح^6 عن مخطط اللغة الخوارزمية، الملحق هـ: تغييرات اللغة". لجنة توجيه المخطط. 2007-09-26 . تم الاسترجاع في 2009-10-20 .
- ^ "دائرة R6RS الانتخابية". لجنة توجيه المخطط. 2007. تم الاسترجاع في 2012-08-09 .
- ^ مارك فيلي (تجميع) (2007-10-26). "نوايا المنفذين فيما يتعلق بـ R6RS". لجنة توجيه المخطط، قائمة بريدية r6rs-discuss . تم الاسترجاع في 2012-08-09 .
- ^ ab Will Clinger, Marc Feeley, Chris Hanson, Jonathan Rees and Olin Shivers (2009-08-20). "بيان الموقف (مسودة)". لجنة توجيه المخطط . تم الاسترجاع في 2012-08-09 .
{{cite web}}:CS1 maint: أسماء متعددة: قائمة المؤلفين ( الرابط ) - ^ "R7RS المسودة التاسعة متاحة" (PDF) . 2013-04-15.
- ^ Will Clinger (2013-05-10). "تمديد فترة التصويت". لجنة توجيه لغة المخطط، قائمة بريدية لتقارير المخطط. مؤرشف من الأصل في 2013-07-21 . تم الاسترجاع في 2013-07-07 .
- ^ تم تسمية تنفيذ المخطط 48 بهذا الاسم لأن المترجم كتبه ريتشارد كيلسي وجوناثان ريس في 48 ساعة (6-7 أغسطس 1986. انظر ريتشارد كيلسي؛ وجوناثان ريس؛ ومايك سبيربر (2008-01-10). "دليل مرجعي غير مكتمل للمخطط 48 للإصدار 1.8". جوناثان ريس، s48.org . تم الاسترجاع في 2012-08-09 .
- ^ من تأليف جيرالد جاي سوسمان وجاي لويس ستيل جونيور (ديسمبر 1975). "المخطط: مُفسِّر لحساب لامدا الممتد" (PDF) . مذكرات الذكاء الاصطناعي . AIM-349. مختبر الذكاء الاصطناعي بمعهد ماساتشوستس للتكنولوجيا . hdl :1721.1/5794 . تم الاسترجاع في 23 ديسمبر 2021 .
- ^ جويل موزيس (يونيو 1970)، وظيفة الدالة في لغة ليسب، أو لماذا يجب تسمية مشكلة FUNARG بمشكلة البيئة ، hdl :1721.1/5854، مذكرة الذكاء الاصطناعي 199،
استعارة مفيدة للفرق بين الدالة والاقتباس في لغة ليسب هي التفكير في الاقتباس كغطاء مسامي أو مفتوح للدالة نظرًا لأن المتغيرات الحرة تهرب إلى البيئة الحالية. تعمل الدالة كغطاء مغلق أو غير مسامي (ومن هنا جاء مصطلح "الإغلاق" الذي استخدمه لاندين). وبالتالي فإننا نتحدث عن تعبيرات لامدا "المفتوحة" (الدوال في لغة ليسب عادةً ما تكون تعبيرات لامدا) وتعبيرات لامدا "المغلقة". [...] بدأ اهتمامي بمشكلة البيئة بينما زار لاندين، الذي كان لديه فهم عميق للمشكلة، معهد ماساتشوستس للتكنولوجيا خلال عامي 1966 و1967. لقد أدركت بعد ذلك المراسلات بين قوائم FUNARG والتي تعد نتائج تقييم تعبيرات Lambda "المغلقة" في
LISP وإغلاقات Lambda
الخاصة
بـ
ISWIM .
- ^ فان توندر، أندريه (1 يناير 2004). "حساب لامدا للحوسبة الكمومية". مجلة سيام للحوسبة . 33 (5): 1109-1135. arXiv : quant-ph/0307150 . doi :10.1137/S0097539703432165. S2CID 613571.
- ^ Niehren, J.; Schwinghammer, J.; Smolka, G. (نوفمبر 2006). "حساب لامدا متزامن مع العقود المستقبلية" (PDF) . علوم الكمبيوتر النظرية . 364 (3): 338–356. doi :10.1016/j.tcs.2006.08.016.
- ^ جيرالد جاي سوسمان وجاي لويس ستيل الابن (مارس 1976). "لامدا: الضرورة القصوى". مذكرات الذكاء الاصطناعي . AIM-353. مختبر الذكاء الاصطناعي بمعهد ماساتشوستس للتكنولوجيا . مؤرشف من الأصل (ملحوظة أو ملف PDF) في 2016-05-10 . تم الاسترجاع في 2012-08-09 .
- ^ غابرييل، ريتشارد ب .؛ بيتمان، كينت (1988). "القضايا الفنية للفصل في خلايا الوظائف وخلايا القيمة". LISP والحوسبة الرمزية . المجلد 1، العدد 1 (نُشر في يونيو 1988). ص 81-101. doi :10.1007/BF01806178 . تم الاسترجاع في 2012-08-09 .
- ^ من تأليف Philip L. Bewig (2008-01-24). "SRFI 41: Streams". محررو SRFI، schemers.org . تم الاسترجاع في 2012-08-09 .
- ^ ويليام كلينجر وجوناثان ريس، محرران (1991). "تقرير منقح4 عن مخطط اللغة الخوارزمية". مؤشرات ACM Lisp . 4 (3): 1–55 . تم الاسترجاع في 2012-08-09 .
- ^ Flatt, Matthew (2016). "Binding as sets of domains". Proceedings of the 43th Annual ACM SIGPLAN-SIGACT Symposium on Principles of Programming Languages . ص 705-717. doi :10.1145/2837614.2837620. ISBN 978-1-4503-3549-2. S2CID 15401805.
- ^ جوناثان ريس، مخطط الأشياء اجتماع يونيو 1992 محفوظ في 16 يوليو 2011 على موقع واي باك مشين (ملحوظة تالية)، في مؤشرات لشب، المجلد (4)، أكتوبر-ديسمبر 1992. تم الاسترجاع في 9 أغسطس 2012
- ^ تايلور كامبل (2005-07-21). "SRFI 62: تعليقات على التعبير S". محررو SRFI، schemers.org . تم الاسترجاع في 2012-08-09 .
- ^ William D Clinger (1999-07-01). "SRFI 6: Basic String Ports". محررو SRFI، schemers.org . تم الاسترجاع في 2012-08-09 .
- ^ Scott G. Miller (2002-06-25). "SRFI 28: Basic Format Strings". محررو SRFI، schemers.org . تم الاسترجاع في 2012-08-09 .
- ^ JW Backus; FL Bauer; J.Green; C. Katz; J. McCarthy P. Naur; et al. (January–April 1960). "تقرير منقح عن لغة الخوارزمية Algol 60". Numerische Mathematik, Communications of the ACM, and Journal of the British Computer Society . تم الاسترجاع في 2012-08-09 .
- ^ جوناثان ريس؛ ويليام كلينجر، محرران (ديسمبر 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. تم الاسترجاع في 2012-08-09 .
- ^ "أنظمة المخططات الداعمة لمؤسسات التمويل الاجتماعي". محررو مؤسسة التمويل الاجتماعي، schemers.org. 2009-08-30 . تم الاسترجاع في 2012-08-09 .
- ^ تم إدراج 75 تنفيذًا معروفًا لـ Scheme بواسطة "scheme-faq-standards". Community Scheme Wiki. 2009-06-25 . تم الاسترجاع في 2009-10-20 .
- ^ إد مارتن (2009-07-20). "قائمة المدارس التي تستخدم المخططات". Schemers Inc. تم الاسترجاع في 2009-10-20 .
- ^ "قائمة المدارس التي تستخدم SICP". MIT Press. 1999-01-26 . تم الاسترجاع في 2009-10-20 .
- ^ Eric Grimson (Spring 2005). "6.001 Structure and Interpretation of Computer Programs". MIT Open Courseware . تم الاسترجاع في 20 أكتوبر 2009 .
- ^ اليكس فانديفر. نيلسون الحاج؛ وآخرون. (يناير 2009). "6.184 - مشروب الزومبي الذي يحتوي على الكافيين 6.001". معهد ماساتشوستس للتكنولوجيا CSAIL . تم الاسترجاع 2009-10-20 .
- ^ جون دي نيرو (خريف 2019). "علوم الكمبيوتر 61A، بيركلي". قسم الهندسة الكهربائية وعلوم الكمبيوتر، بيركلي . تم الاسترجاع في 2019-12-17 .
- ^ CS 2500: أساسيات علوم الكمبيوتر 1، جامعة نورث إيسترن
- ^ CS 1101: مقدمة في تصميم البرامج (A05): برنامج الدورة، معهد ووستر بوليتكنيك
- ^ "CSSE 304: مفاهيم لغة البرمجة". معهد روز هولمان للتكنولوجيا .
- ^ "مقرر CS121b لفصل الربيع 2021" (PDF) . جامعة برانديز .
- ^ "الصفحة الرئيسية". berkeley-cs61as.github.io .
- ^ دانا أنجلوين (خريف 2009). "مقدمة في علوم الكمبيوتر (CPSC 201)". حديقة الحيوان، قسم علوم الكمبيوتر بجامعة ييل . تم الاسترجاع في 20 أكتوبر 2009 .
- ^ "قراءات مقررات تصميم البرمجة CSG107". كلية علوم الحاسب والمعلومات بجامعة نورث إيسترن. خريف 2009. تم الاسترجاع في 2012-08-09 .
- ^ بنية برمجة الحاسوب 1 محفوظ في 19 يونيو 2010 على موقع واي باك مشين ، قسم علوم الحاسوب، جامعة مينيسوتا، ربيع 2010 (تم الوصول إليه في 30 يناير 2010).
- ^ تم أرشفة أوصاف الدورات الدراسية المطلوبة لـ CSci والمعلومات الأخرى في 2019-10-25 على موقع Wayback Machine ، قسم علوم الكمبيوتر، جامعة مينيسوتا (تم الوصول إليه في 2019-10-25)
- ^ CSCI 2041—دورة جديدة لجنة مناهج علوم الكمبيوتر والهندسة، جامعة مينيسوتا (تم الوصول إليها في 2019-10-25)
- ^ Robin Cover (2002-02-25). "DSSSL - Document Style Semantics and Specification Language. ISO/IEC 10179:1996". صفحات الغلاف . تم الاسترجاع في 2012-08-09 .
- ^ " لغة البرمجة الأساسية لبرنامج GIMP التي تم ربطها به اليوم هي Scheme. " من Dov Grobgeld (2002). "دليل GIMP الأساسي Scheme". فريق GIMP . تم الاسترجاع في 2012-08-09 .
- ^ تود جراهام لويس؛ ديفيد زول؛ جوليان ميسيج (2002). "GNOME FAQ from Internet Archive". فريق Gnome، gnome.org. مؤرشف من الأصل في 2000-05-22 . تم الاسترجاع في 2012-08-09 .
- ^ "guile-gnome". مؤسسة البرمجيات الحرة . تم الاسترجاع في 2012-08-09 .
- ^ Laurence Brevard (2006-11-09). "تحديث برنامج Synopsys MAP-inSM: منتدى مطوري قابلية التشغيل البيني لـ EDA" (PDF) . Synopsis Inc. تم الاسترجاع في 2012-08-09 .
- ^ كاواي، شيرو (أكتوبر 2002). "لصق الأشياء معًا - مخطط في إنتاج المحتوى المتحرك بالحاسوب في الوقت الفعلي". وقائع المؤتمر الدولي الأول للغة ليسب، سان فرانسيسكو : 342-348 . تم الاسترجاع في 2012-08-09 .
- ^ بيل ماجنوسون؛ هال آبلسون ومارك فريدمان (2009-08-11). "تحت غطاء App Inventor لنظام Android". مدونة Google Research الرسمية . تم الاسترجاع في 2012-08-09 .
قراءة إضافية
- مقدمة عن المخطط وتطبيقاته (مرآة)
- كريستوفر ت. هاينز (1999-06-22). "تجربة توحيد معايير لغة البرمجة Scheme".
- جاي إل ستيل جونيور ، ريتشارد ب. غابرييل . "تطور لغة ليسب" (PDF) . مؤرشف من الأصل (PDF) في 2016-06-11.
- جيرالد جاي سوسمان وجاي لويس ستيل الابن (ديسمبر 1975). . المجلد. مذكرة الذكاء الاصطناعي رقم 349. مختبر الذكاء الاصطناعي بمعهد ماساتشوستس للتكنولوجيا . CiteSeerX 10.1.1.128.80 – عبر ويكي مصدر .
روابط خارجية
- يوفر موقع scheme.org روابط للعديد من موارد Scheme، بما في ذلك المواصفات
برمجة المخططات في ويكي الكتب- مقدمة للمخطط
اكتب لنفسك مخططًا في 48 ساعة على ويكي بوكس
الوسائط المتعلقة بـ Scheme (لغة برمجة) في ويكيميديا كومنز- مخطط اسبوعي
- إشارة مرجعية لإضافة Interactive Scheme REPL إلى أي موقع ويب
