Перейти до вмісту

Scheme

Матеріал з Вікіпедія
Scheme
Парадіґмафункціонална
Обявив ся в1975
Дізайноване одGuy L. Steele and Gerald Jay Sussman
Стабілне выданяR6RS (ratified standard) (2007)
Тіпізація датstrong, dynamic
Основна реалізаціяМного. Видь Category:Scheme implementations
ДіалектыT
Овпливненый зLisp, ALGOL
ОвпливнивCommon Lisp, JavaScript, R, Ruby, Dylan, Lua, Hop, Racket
Вебсайтhttp://www.scheme-reports.org/

Scheme є мултіпарадіґматічный проґрамовачій язык. Фунціонална парадіґма належыть міджі такзваны декларатівны парадіґмата. Scheme є єден з двох головный діалектів функціоналного проґрамовачого языка Lisp. Язык предложыли Гай Луіс Стіл (Guy Lewis Steele) і Жералд Джей Сусман (Gerald Jay Sussman) і ёго першый попис быв списаный в роцї 1975. Scheme быв представленый академічному світу через серію статей, нынї знамых як Сусмановы і Стіловы Ламбда Папіря. Язык Scheme дефінують два штандарты: офіціалный IEEE штандарт і штандарт званый Revisedn Report on the Algorithmic Language Scheme, скорочено RnRS, де n є чісло ревізії. Сучасный штандарт є R5RS, і R6RS ся вывивать.

Опроти Lisp-у ся Scheme снажыть о мінімалізм - додати што найменше чісло основных функцій, на котрых суть пак в книжніцях поставлены зложытїшы конштрукції. Вдяка тому має дотеперь послїдня референція языка лем 50 сторінок.


Scheme быв першым діалектом Lisp-у, котрый понукав вольбу міджі лексікалным або дінамічным россягом платности переменной. Тыж быв першым языком, котрый підпоровав „first-class continuation“.

Тот язык є в праксі хоснованый рідше, хоснує ся передовшыктым в школах про учіня проґрамованя алґорітмів. Найзнамішов імплементаціов є ґрафічный едітор GIMP, котрого додатковы засувный модулы і скріпты суть писаны в діалектї языка Scheme.

Традічный проґрам hello world вызерать в языку Scheme наприклад так:

(define (hello)
  (display "Агой світе!")
  (newline))
(hello)

Не першім рядку дефініції процедуры hello, котра выпише текст „Агой світе!“ і одрядкує. На четвертім рядку є пак тота процедура кликана.

Команд define служыть тыж про дефініцію переменных:

(define пі 3.14)

Наслїдній приклад указує дефініцію функції, котра вырахує факторіал зазначеного чісла:

(define fact
  (lambda (n)
    (if (= n 0)
      1
      (* n (fact (- n 1))))))

Писаня конштрукції lambda мож быти довготырваюче, і зато Scheme нукать скороченя:

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

Функція ся дасть потім закликати:

(fact 4)

На выступі бы сьме дістали чісло 24. Выше зазначеный приклад указу/ пару інтересных конштрукцій. Єднак є ясне, же в языку Scheme ся хоснує префіксовый запис:

(+ 1 2)  ; сума
(- 5 3)  ; розность
(* 4 5)  ; умножіня
(/ 9 3)  ; дїлїня

(+ 1 3 7)  ; не треба ся обмеджовати лем на дві чісла

Другов інтереснов річов є подмінка if. Тота має способ (if (výraz) true false), де ветва true ся проведе, кідь є выраз правдивый (кідь не є посудженый як #f), ветва false в припадї, же є выраз неправдивый (#f; еквівалентне части else в іншых языках).

Третёв інтереснов річов є рекурзівне кликаня себе самого на пятім рядку дефініції функції. Функція про рахованя факторіалу ся дасть переписати:

(define (fact n)
  (let fact-iter ((n n) 
                  (result 1))
    (if (= n 0)
        result
        (fact-iter (- n 1) (* n result)))))

В такім припадї будуть вшыткы рекурзівны кликаня концово рекурзівны. Дочасны параметры не суть укладаны на засобник, але суть передаваны як арґументы рекурзівной функції і інтерпрет може зашмарити обсяг засобника і знову закликати функцію. То значіть же рахованя функції ся дїє в конштантім простору памятї. Штандарт языка Scheme R5RS, точно дефінує, коли дійде ку консовому кликаню. В прикладі коду є тыж хоснована конштрукція „пописаный лїт“, котра ся хоснує про створїня рекурзії в тїли функції без того, жебы сьме імпліцітно дефіновали функцію в ґлобалнім средстві.