Scheme: Różnice pomiędzy wersjami

Dodane 27 bajtów ,  9 lat temu
m
Popups: Ujednoznacznienie linku z MIT na Massachusetts Institute of Technology, ort., drobne redakcyjne, WP:SK
m (Wycofano edycje użytkownika 95.49.214.112 (dyskusja). Autor przywróconej wersji to Luckas-bot.)
m (Popups: Ujednoznacznienie linku z MIT na Massachusetts Institute of Technology, ort., drobne redakcyjne, WP:SK)
'''Scheme''' to [[programowanie funkcyjne|funkcyjny]] [[język programowania]], dialekt (wariant) [[Lisp]]u, który został zaprojektowany na [[Massachusetts Institute of Technology|MIT]] przez [[Guy L. Steele|Guy L. Steele-a]] i [[Gerald Jay Sussman|Geralda Jay Sussmana]] w latach 70-tych. Jego główną ideą jest minimalizm, co oznacza, że sam język zawiera jedynie podstawowe mechanizmy, a na ich bazie, już z użyciem Scheme, tworzone są bardziej zaawansowane rozwiązania. Scheme nie jest czysto funkcyjnym językiem programowania, co oznacza, że dopuszczalne są efekty uboczne obliczeń. Scheme umożliwia również tworzenie programów w stylu proceduralnym i obiektowym. Jest to język o dynamicznym systemie typów. Zarządzanie pamięcią jest w pełni automatyczne. Scheme był pierwszym dialektem [[Lisp|Lispa]]a, który używał zmiennych leksykalnych i pierwszym który wymagał od implementacji optymalizacji wywołań z rekurencją ogonową. Scheme jest ustandaryzowany przez organizaję [[Institute_of_Electrical_and_Electronics_EngineersInstitute of Electrical and Electronics Engineers|IEEE]] oraz przez dokumenty ''Revised<sup>n</sup> Report on the Algorithmic Language Scheme'' (R''n''RS), z których najczęściej implementowane są R5RS z 1998 roku oraz R6RS z 2007 roku.
 
== Składnia ==
 
=== Identyfikatory ===
[[Identyfikator (programowanie)|Identyfikatory]] można tworzyć z [[Litera|liter]] [[Alfabet łaciński|alfabetu łacińskiego]] (<tt>A-Z</tt> i <tt>a-z</tt>), cyfr (<tt>0-9</tt>) oraz znaków <tt>! $ % & * + - . / : < = > ? @ ^ _ ~</tt>. Dodatkowo, aby uniemożliwić mylenie identyfikatorów ze [[Literał liczbowy|stałymi liczbowymi]], niedozwolone są identyfikatory rozpoczynające się od znaków, od których mogą zaczynać się liczby - czyli od [[Cyfra|cyfr]] lub jednego ze znaków: <tt>+ - .</tt>. Od tej reguły też jednak są wyjątki: <tt>+ - i ...</tt> są prawidłowymi identyfikatorami. Niektóre implementacje mogą dopuszczać też użycie innych identyfikatorów, które rozpoczynają się od tych znaków, ale nie są liczbami. Dodatkowo przyjmuje się następujące konwencje tworzenia identyfikatorów:
* [[predykat]]y kończą się znakiem zapytania <tt>?</tt>. W szczególności zapytania o typ zmiennej tworzymy z nazwy typu i znaku zapytania (np. <tt>vector?</tt>).
* nazwy funkcji, które modyfikują swoje argumenty, oznaczamy wykrzyknikiem <tt>!</tt>, np. <tt>set!</tt>
 
=== Pytania o typ ===
Zmienne są typowane dynamicznie, czyli zmienna nie ma ustalonego typu - jest takiego typu jak wartość, którą przechowuje. Czasem musimy więc sprawdzić czy rzeczywiście przechowuje ona wartość odpowiedniego typu (np. przed użyciem w funkcji, które przyjmują wartości tylko określonego typu lub chcąc wybrać sposób potraktowania danych zależnie od typu)
<pre>
(number? 5)
 
=== Makra ===
Za pomocą makr można przetwarzać kod scheme jak dane. Makra są przetwarzane w czasie kompilacji. Makro musi zawracać kod jako dane (tzn. listę symboli) które zostaną obliczone (według specyfikacji języka scheme makra tworzy się za pomocą define-syntax, let-syntax, syntax-rule ale większość implementacji udostępnia makro define-macro lub defmacro za pomocą definiuje się makra w stylu [[Common Lisp|Common Lispa]]a).
 
Znak ` (tylny apostrof) działa tak jak ' (cytat) z tym że wewnątrz można użyć przecinka, który oblicza dane wyrażenie lub ,@ (przecinek małpa) który oblicza wyrażenie i usuwa zewnętrzne nawiasy.
 
"`" jest to skrót do funkcji quasiquote, "," - to skrót do unquote a ",@" to skrót do unquote-splicing
<pre>
(define-macro (for params . body)
(define-macro (for-list params . body)
(let ((iter (gensym)) (list (gensym)))
`(let ,iter ((,(car params) (car ,(cadr params)))
(,list (cdr ,(cadr params))))
(when (not (null? ,(car params)))
(for-each (lambda (line) (write-line line port)) list))
</pre>
 
== Definicja języka ==
Język Scheme ciągle się rozwija, dwa główne elementy tego rozwoju to dokument opisujący rdzeń języka (R<sup>n</sup>RS) oraz proces zgłaszania dokumentów SRFI (Scheme Requests for Implementation) czyli propozycji rozszerzeń i ulepszeń języka opracowywanych przez użytkowników.
Raport R<sup>n</sup>RS jest powszechnie uważany za oficjalną i podstawową definicję języka: programiści piszą programy zgodne z R<sup>n</sup>RS, o implementacjach języka Scheme mówi się, że są w całości lub częściowo zgodne z raportem R<sup>n</sup>RS.
 
Pierwszy dokument opisujący język Scheme powstał w roku 1975: "Scheme: an interpreter for extended lambda calculus", autorami byli Gerald Jay Sussman i Guy Lewis Steele Jr., twórcy języka. Raport R<sup>5</sup>RS został opublikowany 20 lutego 1998 roku, Do sierpnia 2007 roku trwały prace nad nową definicją języka - raportem R<sup>6</sup>RS<ref>[http://www.r6rs.org R6RS<!-- Tytuł wygenerowany przez bota -->]</ref>. Wstępna wersja nowego raportu o numerze 5.97 została poddana pod głosowanie osób, które zgłosiły zainteresowanie procesem tworzenia dokumentu. Głosowanie zakończyło się 12 sierpnia, 29 sierpnia ogłoszono wyniki głosowania i ratyfikację nowego raportu - R<sup>6</sup>RS<ref>[http://lists.r6rs.org/pipermail/r6rs-discuss/2007-August/003272.html [r6rs-discuss&#93; [Scheme Steering Committee announcements&#93; R6RS Ratified<!-- Tytuł wygenerowany przez bota -->]</ref>.
 
=== Dokumenty SRFI ===
Dokumenty zgłoszone i przyjęte w procesie SRFI <ref>[http://srfi.schemers.org/ Scheme Requests for Implementation<!-- Tytuł wygenerowany przez bota -->]</ref>są sposobem na w miarę szybkie wprowadzanie przenośnych między implementacjami języka rozwiązań ułatwiających tworzenie programów. Obecnie istnieje około 60 dokumentów SRFI, opisują one sposób zaimplementowania takich funkcji czy rozwiązań jak np. sposób notacji tablic, strumienie, obsługa wyjątków, higieniczne makra, wykonywanie skryptów języka Scheme w systemach operacyjnych UNIX czy obsługa wielowątkowości. Rozwiązania te nie wchodzą w skład oficjalnej definicji języka, jednak mogą być brane pod uwagę przy tworzeniu kolejnych wersji raportu R<sup>n</sup>RS.
 
=== Implementacje ===
* [http://en.wikipedia.org/wiki/MIT_Scheme MIT Scheme] implementacja stworzona przez [[Free Software Foundation|FSF]]
* [[Gambit (Scheme implementation)|Gambit]] kompilator i interpreter stworzony przez [[Free Software Foundation|FSF]]
 
 
{{Przypisy}}
14 957

edycji