Schemat | ||
Data pierwszej wersji | 1975 | |
---|---|---|
Paradygmat | Funkcjonalny | |
Autorski | Guy L. Steele i Gerald Jay Sussman | |
Ostatnia wersja | R7RS (2013) | |
Pisanie na maszynie | mocny, dynamiczny | |
Normy | IEEE 1178-1990, ANSI , R n RS | |
Wpływem | Seplenienie | |
Pod wpływem | JavaScript , Ruby , Hop , Snap! | |
Wdrożenia | Bigloo, Gambit, schemat PLT ... | |
Stronie internetowej | www.scheme-reports.org | |
Rozszerzenie pliku | scm i ss | |
Schemat ( wymowa: / skim / ) to język programowania wywodzący się z języka funkcjonalnego Lisp , stworzonego w latach 70. XX wieku w Massachusetts Institute of Technology (MIT) przez Geralda Jaya Sussmana i Guya L. Steele .
Celem twórców języka było oczyszczenie Lispa przy zachowaniu zasadniczych elementów, elastyczności i mocy ekspresji. Schemat ma zatem niezwykle prostą składnię z bardzo ograniczoną liczbą słów kluczowych. Podobnie jak w Lispie, notacja z prefiksem eliminuje potrzebę pierwszeństwa operatorów . Ponadto moc makr Scheme pozwala mu dostosować się do każdego problemu, w szczególności aby uczynić go zorientowanym obiektowo, a tym samym wieloparadygmatycznym.
Specyfikacja Scheme określa, że wszystkie implementacje powinny optymalizować przypadek rekursji terminala .
Podstawowymi typami danych Scheme są wartości logiczne , liczby, które mogą być liczbami całkowitymi o nieokreślonej wielkości, wymierne lub złożone, znaki lub symbole, które są zmiennymi.
Do nich dodaje się następujące złożone typy danych: łańcuchy, wektory, pary zorientowane, listy, listy asocjacyjne, tablice skrótów i określony typ ogólny, wyrażenie S , z którego wywodzą się wszystkie inne typy, co umożliwia metaprogramowanie , tj. Możliwość rozszerzenia języka o nowe operatory specjalne .
Gérald Sussman i Guy Steele powrócili do narodzin Scheme w artykule zatytułowanym The First Report on Scheme Revisited i opublikowanym w 1998 roku.
W 1973 roku Carl Hewitt zaproponował swój model aktora i napisał ze swoimi uczniami implementację w Lisp o nazwie Planner-73, a następnie PLASMA (akronim od PLAnner-like System Modeled on Actors ). Sussman i Steele chcąc lepiej zrozumieć model Hewitta, w szczególności przez odniesienie go do tradycyjnych pojęć programowania, piszą mały interpreter Lispa i prymitywy do tworzenia aktorów i wysyłania wiadomości między nimi. Używają tej samej składni dla funkcji i aktorów, przy czym pierwszy z nich to domknięcia zadeklarowane przez słowo kluczowe lambdai zwracające wartość, a drugi przez alpha. Aktorzy nie wracają, ale wzywają kontynuacje , czyli inni aktorzy, których zna.
Język nosi nazwę „Schemer”, po nazwach języków Planner i Conniver, z których został zainspirowany. Jednak system ITS używał wówczas ograniczonych nazw plików do 6 znaków, skracając je do „SCHEMATU”. Sussman i Steele mówią, że już nie pamiętają, dlaczego nie zdecydowali się na skrócenie do „SCHMR”, tak jak Planner i Conniver, którzy używali „PLNR” i „CNVR”.
Po napisaniu programów z aktorami odkrywają, że implementacja interpretera była taka sama, że oceniany kod dotyczy funkcji lub aktorów i że to samo dotyczy kodu, który tworzy funkcje i aktorów. Różnica między faktem, że tylko funkcje zwracają wartości, a nie aktorów, nie istniała w implementacji, a jedynie w elementach pierwotnych używanych w treści definicji funkcji i aktorów. Wnioskują, że obsada i zamknięcia są w rzeczywistości tą samą koncepcją, a sam Hewitt później to przyznał.
Te odkrycia dotyczące ówczesnego schematu embrionalnego doprowadziły do trzech głównych wniosków. Po pierwsze, model aktora Hewitta doskonale reprezentował się w rachunku λ . Nie było to samo w sobie nowością dla teoretyków semantyki denotacyjnej , ale Scheme pomógł nadać tym teoriom praktyczny wymiar. Następnie okazało się, że prosty i mały formalizm rachunku λ może służyć jako rdzeń ekspresyjnego i potężnego języka programowania, więc Scheme jest stosowanym rachunkiem λ. Wniosek jest natychmiastowy: semantyka denotacyjna jest równoważna semantyce operacyjnej . Ostatecznie poszukiwanie ostatecznego języka dla sztucznej inteligencji okazało się kręcić w kółko, ponieważ prace nad językami rozpoczęły się od Lispa, następnie CONVERT, następnie Planner, Conniver, PLASMA, a następnie uproszczony dialekt Lispa.
Te zmienne są dynamicznie wpisane, a ich zakres jest leksykalny :
(define var1 value) (let ([var2 value]) ...)Listy :
(cons 1 (cons 2 (cons 3 (cons 4 '()))))To połączenie można skrócić jako
(list 1 2 3 4)lub w
'(1 2 3 4)Funkcje : są zdefiniowane jako wyrażenia lambda
(define fun (lambda (arg1 arg2) ...))lub prościej
(define (fun arg1 arg2) ...)Zgłoszenie do listy:
(apply fun (list value1 value2))Oceny warunkowe :
(cond (test1 expr1) (test2 expr2) ... (else exprn))i również
(if condition then-expr else-expr)Przykład 1 - obliczenie silni:
(define (factorial n) (if (= n 0) 1 (* n (factorial (- n 1))))) (factorial 5) ;; ⇒ 120Przykład 2 - zdefiniowanie funkcji mapującej, która stosuje wyrażenie lambda (które podnosi jej argument do kwadratu) do wszystkich elementów listy:
(define (map f lst) (cond ((null? lst) lst) (else (cons (f (car lst)) (map f (cdr lst)))))) (map (lambda (x) (* x x)) '(1 2 3 4)) ;; ⇒ (1 4 9 16)Rekurencyjne wersje ogonów z dwóch poprzednich przykładów:
(define (factorial n) (let loop ((fact 1) (n n)) (cond ((= n 0) fact) (else (loop (* n fact) (- n 1)))))) (factorial 5) ;; ⇒ 120 (define (map f lst) (do ((lst lst (cdr lst)) (res '() (cons (f (car lst)) res))) ((null? lst) (reverse res)))) (map (lambda (x) (* x x)) '(1 2 3 4)) ;; ⇒ (1 4 9 16)Scheme jest, obok Common Lisp , najpopularniejszym dialektem Lispa. Podobnie jak Lisp, istnieje wiele implementacji, z których każda dodaje funkcjonalność zgodnie z potrzebami użytkowników. W raporcie regularnie podsumowuje się różne implementacje, aby zidentyfikować uzgodnioną definicję języka. Raporty te nazywane są Revised n Report on the Algorithmic Language Scheme , gdzie n to numer wersji, a w skrócie R n RS . Ich celem jest możliwość wymiany kodu między różnymi implementacjami zgodnymi z daną wersją raportu.
Szósta wersja została opublikowana w wrzesień 2007i ratyfikowało 102 osoby, czyli 2/3 wyborców. Ten raport jest od razu kontrowersyjny, niektórzy autorzy głównych wdrożeń wskazywali, że zintegrują niektóre nowe funkcje R 6 RS, ale nie cały raport, Marc Feeley uważa, że celu R6RS nie można osiągnąć i że ma pracować nad nowym standardem.
W 2009 roku Komitet Sterujący Systemem opublikował komunikat prasowy, w którym przypomina o różnorodności wdrożeń Systemu, które są zarówno jego słabością, jak i siłą. Zapowiedział, że obecna różnorodność uzasadnia rozróżnienie między dwoma językami Scheme, jednym zwanym małym , dziedziczącym po IEEE Scheme i R 5 RS, a dużym , dziedziczącym po R 6 RS, ale mimo to kompatybilnym ze sobą. Komitet Sterujący tworzy dwie grupy robocze w celu przygotowania nowej rewizji (R 7 RS) języka.
Pierwsza część raportu, zatytułowana R 7 RS-small, została zamknięta wlipiec 2013.
Program wykorzystuje składnię z Lisp S-wyrażeń zmieniając kilka słów kluczowych. Wyrażenie schematu to albo wartość atomowa (liczba, ciąg znaków, identyfikator itp. ), Albo lista wyrażeń. Istotne różnice w porównaniu z Lispem to: