Scheme: Różnice pomiędzy wersjami

[wersja przejrzana][wersja przejrzana]
Usunięta treść Dodana treść
Almabot (dyskusja | edycje)
m robot dodaje: ta:இசுகீம்
Joee (dyskusja | edycje)
linki
Linia 2:
 
== Składnia ==
Składnia języka jest budowana z S-wyrażeń w sposób klasyczny dla Lispu. Różne elementy języka, jak np. [[Deklaracja (informatyka)|deklaracje]] i definicje, warunki, [[Przypisanie|podstawienia]], [[Selekcja (programowanie)|selekcje]] itp. przedstawione są w postaci list. Lista taka składa się z elementów [[Separator (programowanie)|oddzielonych]] tzw. ''białymi znakami'' (czyli znakami odstępu, tabulacji lub nowego wiersza) i otoczona jest parą nawiasów[[nawias]]ów (w niektórych [[Implementacja (informatyka)|implementacjach]] dopuszcza się też w celu poprawienia czytelności kodu nawiasy kwadratowe). Pierwszym elementem listy jest identyfikator (nazwa) funkcji, kolejnymi są [[Argument (informatyka)|argumenty]].
 
== Elementy języka ==
=== Podstawowe operacje matematyczne ===
Działania, tak jak wszystkie inne funkcje, zapisujemy w [[Notacja polska|notacji prefiksowej]], to znaczy znak działania przed argumentami:
<pre>
(+ 2 (* 2 2))
Linia 14:
W istocie działania matematyczne to zwykłe funkcje.
 
Można przekazywać im więcej niż 2 argumenty. Operatory działań mogą być przesłaniane podobnie jak inne [[Zmienna (informatyka)|zmienne]] (zobacz przykład przy podstawieniu).
 
=== 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>
* operatory [[Konwersja typu|konwertujące]] jeden typ na inny oznaczamy <tt>typ1 → typ2</tt>
* funkcje działające na wektorach, znakach i łańcuchach oznacza się przedrostkami <tt>vector-</tt>, <tt>char-</tt> i <tt>string-</tt>. Czasem stosowane jest to też do operacji na listach.
 
=== Komentarze ===
[[Komentarz (informatyka)|Komentarz]] do kodu źródłowego (tekst pomijany przez interpreter/kompilator) rozpoczyna się od średnika i rozciąga się aż do końca nowej linii.
 
=== Podstawienia ===
W języku tym istnieje wiele sposobów [[Przypisanie|przypisania]] zmiennym wartości.
<pre>
(define zm wyr)
Linia 68:
(string? "foo")
</pre>
Pytania o typ składają się z nazwy typu i [[Pytajnik|znaku zapytania]] (<tt>?</tt>).
 
=== Równość ===
Linia 79:
 
=== Wartości i operatory logiczne ===
Wartości logiczne ''prawda'' i ''fałsz'' reprezentowane są [[Literał logiczny|odpowiednio symbolami]] <tt>#t</tt> i <tt>#f</tt>. Możemy na nich wykonywać np. operacje <tt>or</tt> (alternatywa ''lub''), <tt>and</tt> (koniunkcja ''i'') oraz <tt>not</tt> (negacja ''nie''). Mają one jednak odrobinę szersze zastosowanie.
 
=== Funkcje i rekursja ===
Linia 114:
</pre>
 
Zamiast [[Pętla (informatyka)|pętli]] wykorzystuje się możliwości stwarzane przez [[rekursja|rekursję]], szczególnie przez [[rekursja ogonowa|rekursję ogonową]].
 
Tak zdefiniowana rekursja może być wykonywana bez odkładania parametrów na stos, czyli tak jak zwykła [[iteracja]].