Scheme






















Scheme
Lambda lc.svg

Парадигма:
декілька
Дата появи:1970-ті
Творці:
Гай Стіл та Джеральд Сассмен

Система типізації:
сувора, динамічна
Основні реалізації:
PLT Scheme, MIT/GNU Scheme, Scheme 48, Chicken, Gambit, Guile, Bigloo, Chez Scheme, STk, STklos, Larceny, SCM, Kawa
Діалекти:T
Під впливом від:
Lisp, Алгол
Вплинула на:
Common Lisp, JavaScript, Ruby, Dylan

Сторінка інтернет:
website

Scheme — мультипарадигмна мова програмування, підтримує функціональну та процедурну парадигми програмування. Словник мови можна розширювати засобами самої мови. Існують розширення, які додають підтримку об'єктно-орієнтованої, декларативної і інших парадигм програмування. Є діалектом мови програмування Лісп.




Зміст





  • 1 Історія створення


  • 2 Стислий опис


  • 3 Приклади програм


  • 4 Інтерпретатори та компілятори


  • 5 Засоби розробки


  • 6 Джерела інформації


  • 7 Див. також


  • 8 Посилання




Історія створення |


Перший опис Scheme написано в 1975 році. Творцями мови є Гай Стіл (англ. Guy L. Steele) та Джеральд Сассмен (англ. Gerald Jay Sussman) з Массачусетського технологічного інституту. В 1981 та 1982 роках почались три різних проекти по використанню Scheme для навчального процесу в університетах США.


Мова програмування Scheme визначається двома стандартами: стандартом де-юре в редації IEEE, та стандартом де-факто. Поточна версія описання стандарту де-факто має назву «Revised 5 Report on the Algorithmic Language Scheme».[1]28 серпня 2007 року було затверджено наступну редакцію: R6RS[2].


Основну увагу, при створенні діалекту, було приділено елегантності та концептуальній довершеності мови. Як наслідок, повна специфікація мови програмування Scheme вмістилася в 50 сторінок, в той час, як специфікація Common Lisp має розмір 1300 сторінок.



Стислий опис |


Як і в Алголі, області видимості в Scheme статичні, кожне використання змінної відповідає лексично видимому значенню цієї змінної.


Типи асоціюються із значеннями (об'єктами), а не із змінними. Іншими словами, Scheme — мова програмування із динамічною типізацією. Однак, існують діалекти Scheme із статичною типізацією.


Всі об'єкти, які створюються під час виконання програми, включаючи процедури та продовження існують до її завершення. Жоден із об'єктів не знищується. Однак, інтерпретаторам та компіляторам Scheme дозволяється звільняти місце, зайняте об'єктом у випадку, якщо вони можуть довести що цей об'єкт в програмі більше не використовується. Цю задачу звільнення місця в пам'яті від невикористовуємих об'єктів виконує прибиральник сміття.


Процедури в Scheme є повноцінними об'єктами. Процедури можна створювати під час виконання програми, зберігати в структурах даних, повертати як результат роботи інших процедур, і так далі.


Однією із відмінних рис Scheme є те, що продовження також мають статус звичайних об'єктів. Продовження корисні для реалізації багатьох складних конструкцій керування, включаючи нелокальні виходи (non-local exits), зворотне виконання (backtracking), та співпрограми (coroutines).


Аргументи завжди передаються в процедури за значенням. Це значить, що всі значення аргументів обчислюються до того, як буде передано керування до процедури, не зважаючи на те, чи використовуються ці аргументи під час виконання процедури. Це відрізняється від семантики лінивого обчислення мови програмування Haskell, або семантики виклику по імені Algol 60, в якій значення виразу аргумента обчислюється тільки в разі використання в процедурі.


Модель арифметики Scheme розроблялась таким чином, щоб залишатись як можна незалежнішою від представлення чисел в комп'ютері. В Scheme, кожне ціле є раціональним числом, кожне раціональне є дійсним, а кожне дійсне — комплексне. Тому, різниця між арифметикою дійсних та комплексних чисел, яка присутня в інших мовах програмування, для Scheme не виникає. Замість цього розрізняється точна арифметика (яка відповідає математичним ідеалам), та наближена (яка базується на апроксимаціях). Як і в Common Lisp, точна арифметика не обмежується операціями з цілими числами.


В Scheme наявні оператори циклів. Ще одним способом організації циклічності виконання певного блоку є використання рекурсивних процедур. Всі реалізації Scheme мають виконувати правильну оптимізацію хвостової рекурсії.



Приклади програм |


Наприклад, функція обчислення значення факторіалу з використанням операторів циклу матиме вигляд:


 (define (factorial n)
(let loop ((total 1)
(i n))
(if (= i 0)
total
(loop (* i total) (- i 1)))))

Однак, цю функцію можна переписати із використанням рекурсії:


 (define (factorial n)
(if (= n 0) 1
(* n (factorial (- n 1)))))

Тут рекурсивний виклик в знаходиться в хвості тіла процедури, але не є останньою дією функції, тобто, не є прикладом хвостової рекурсії.



Інтерпретатори та компілятори |


Для мови програмування Scheme існує велика кількість інтерпретаторів та компіляторів. Деякі інтерпретатори використовуються в інших програмах для написання макросів і розширення функціональності (наприклад, у графічному редакторі GIMP використовується інтерпретатор Guile). Для повного переліку, дивіться відповідну сторінку ЧАПів.



Засоби розробки |


Для Scheme, також, існує велика кількість допоміжних засобів розробки, інтегрованих середовищ. До інтегрованих середовищ належить Dr. Scheme. Для GNU Emacs та XEmacs існує спеціальний основний режим: scheme-mode.



Джерела інформації |



  1. Richard Kelsey, William Clinger, Jonathan Rees et al. (August 1998). Revised5 Report on the Algorithmic Language Scheme. Higher-Order and Symbolic Computation 11 (1): 7–105. doi:10.1023/A:1010051815785. 


  2. R6RS.org. Архів оригіналу за 2013-06-25. Процитовано 2007-12-04. 


  • Revised 5 Report on the Alogrithmic Language Scheme, Richard Kelsey, William Clinger, Jonathan Rees, 1998.


  • Teach Yourself Scheme in Fixnum Days, Dorai Sitaram, 2004.


Див. також |



  • Коммон Лісп — інший популярний діалект мови програмування Лісп.

  • Лісп

  • Лямбда-числення


Посилання |



  • schemers.org Спільнота Scheme програмістів.(англ.)


  • ЧАПи: перелік реалізацій.


  • Open Directory: Scheme посилання на різноманітні ресурси присвячені Scheme.





П:  Портал «Програмування» П:  Портал «Вільне програмне забезпечення»







Popular posts from this blog

AWS Lex not identifying response if by a variable The 2019 Stack Overflow Developer Survey Results Are In Announcing the arrival of Valued Associate #679: Cesar Manara Planned maintenance scheduled April 17/18, 2019 at 00:00UTC (8:00pm US/Eastern) The Ask Question Wizard is Live! Data science time! April 2019 and salary with experienceEnforcing custom enumeration in AWS LEX for slot valuesHow to give response based on user response in Amazon Lex?Intercepting AWS Lambda Response to a AWS Lex QueryLex chat bot error: Reached second execution of fulfillment lambda on the same utteranceamazon lex showing invalid responseLambda response send back to Lex slot?Response card in Amazon lexAmazon Lex - Lambda response return HTML to botHow can I solve 424 (Failed Dependency) (python) obtained from Amazon lex?

Алба-Юлія

Захаров Федір Захарович