Ebooks, Audobooks and Classical Music from Liber Liber
a b c d e f g h i j k l m n o p q r s t u v w x y z





Web - Amazon

We provide Linux to the World


We support WINRAR [What is this] - [Download .exe file(s) for Windows]

CLASSICISTRANIERI HOME PAGE - YOUTUBE CHANNEL
SITEMAP
Audiobooks by Valerio Di Stefano: Single Download - Complete Download [TAR] [WIM] [ZIP] [RAR] - Alphabetical Download  [TAR] [WIM] [ZIP] [RAR] - Download Instructions

Make a donation: IBAN: IT36M0708677020000000008016 - BIC/SWIFT:  ICRAITRRU60 - VALERIO DI STEFANO or
Privacy Policy Cookie Policy Terms and Conditions
Scheme - Wikipedia, wolna encyklopedia

Scheme

Z Wikipedii

Scheme to funkcyjny język programowania, dialekt (wariant) LISPa, którego główną ideą jest minimalizm. Oznacza to, że sam język zawiera jedynie podstawowe mechanizmy, a na ich bazie, już z użyciem Scheme, tworzone są bardziej zaawansowane rozwiązania.

Spis treści

[edytuj] Składnia

Składnia języka podobna jest do składni Lispa, z którego język ten się wywodzi. Różne elementy języka, jak np. deklaracje i definicje, warunki, podstawienia, selekcje itp. przedstawione są w postaci list. Lista taka składa się z elementów oddzielonych tzw. białymi spacjami (czyli znakami odstępu, tabulacji lub zmiany wiersza) i otoczona jest parą nawiasów (w niektórych implementacjach dopuszcza się też nawiasy kwadratowe). Pierwszym elementem listy jest określenie funkcji, kolejnymi są argumenty.

[edytuj] Podstawowe operacje matematyczne

Działania, tak jak wszystkie inne funkcje, zapisujemy w notacji prefiksowej, to znaczy znak działania przed argumentami:

(+ 2 (* 2 2))
(+ 1 2 3 4)

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 zmienne (zobacz przykład przy podstawieniu).

[edytuj] Identyfikatory

Identyfikatory można tworzyć z liter alfabetu angielskiego (A-Z i a-z), cyfr (0-9) oraz znaków ? ! . + - * / < = > : $ % ^ & _ ~. Dodatkowo, aby uniemożliwić mylenie identyfikatorów ze stałymi liczbowymi, niedozwolone są identyfikatory rozpoczynające się od znaków, od których mogą zaczynać się liczby - czyli od cyfr lub jednego ze znaków: + - .. Od tej reguły też jednak są wyjątki: + - i ... są prawidłowymi identyfikatorami. Niektore implementacje mogą dopuszczać tez 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:

  • predykaty kończą się znakiem zapytania ?. W tym zapytania o typ zmiennej tworzymy z nazwy typu i znaku zapytania (np. vector?).
  • możliwość zmiany wartości argumentów przy wywołaniu sygnalizujemy przez !, np. set!
  • operatory konwertujące jeden typ na inny oznaczamy typ1->typ2
  • funkcje działające na wektorach, znakach i łańcuchach oznacza się przedrostkami vector-, char- i string-. Czasem stosowane jest to też do operacji na listach.

[edytuj] Podstawienia

W języku tym istnieje wiele sposobów przypisania zmiennym wartości

(define zm wyr)

Deklaruje zmienną zm i nadaje jej wartość wyrażenia wyr. Zmienna jest dostępna do końca bloku, w którym została zdefiniowana. Próba ponownego zdefiniowania tej samej zmiennej skończy się błędem.

(let ((zm_1 wyr_1) ... (zm_n wyr_n)) wyrazenie)

ustawia wartość zmiennych (zm_1, ... zm_n) na wyniki odpowiadających im wyrażeń (wyr_1, ... wyr_n) i wylicza na wartość wyrażenia wyrazenie. Zmienne nie są dostępne poza obrębem let. Jeśli zmienne te istnieją, to zostaną przesłonięte.

(let* ((zm_1 wyr_1) ... (zm_n wyr_n)) wyrazenie)

Znaczenie podobne do let, jednak przy wyliczaniu wartości wyrażen wyr_2, ...wyr_n brane są pod uwagę wartości wcześniej policzone.

(set! zmienna wartosc)

Podstawienie podobne do znanych ze "zwykłych" języków programowania. Zmienia wartość zmiennej na nową, najczęściej policzoną w jakimś wyrażeniu. Zmienna musi być zadeklarowana (np. przez define lub let albo być prametrem funkcji tworzonej przez lambda).

Przykłady:

(let ((x (+ 3 5)) (y (- 4 7))) (* x y))
(let ((+ *)) (+ 3 8))

przyjmie wartość 24 (=3*8), ponieważ wewnątrz let + oznacza *.

[edytuj] 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)

(number? 5)
(number? "foo")
(string? "foo")

Pytania o typ składają się z nazwy typu i znaku zapytania (?).

[edytuj] Równość

Równość dwóch zmiennych sprawdzamy predykatem eq?. Dwie zmienne są równe jeśli są tą samą liczbą, tym samym symbolem lub wskazują na tę samą parę (w szczególności listę). Dwie listy o takich samych elementach zostaną wzięte za różne jeśli powstały niezależnie od siebie (czyli jedna z nich nie przyjęła wartości przez podstawienie drugiej ani).

(eq? "foo" "bar")
(eq? 5 (+ 2 3))
(eq? (eq? 2 3) (eq? 3 4))

[edytuj] Wartości i operatory logiczne

Wartości logiczne prawda i fałsz reprezentowane są odpowiednio symbolami #t i #f. Możemy na nich wykonywać np. operacje or (alternetywa lub), and (koniunkcja i) oraz not (negacja nie). Mają one jednak odrobinę szersze zastosowanie.

[edytuj] Funkcje i rekursja

Funkcje definiuje się za pomocą:(lambda (lista argumentów) (ciało funkcji)), przy czym może ona zostać wartością zmiennej (np. przez define lub let) albo zostać użyta bez nadawania jej nazwy.

(define fact (lambda (x) (if (= x 0) 1 (* x (fact (- x 1))))))
(define fib (lambda (n) 
    (cond 
        ((= n 0) 0)
        ((= n 1) 1)
        (else (+ (fib (- n 1)) (fib (- n 2))))
    )
))
(define sum (lambda (x)
    (cond
        ((null? x) 0)
        (else (+ (car x) (sum (cdr x))))
    )
))
(fact 14)
(fib 10)
(map (lambda (x) (* x (+ 1 x))) '(1 3 6 9)) ; obliczy listę wartości wyrażenia x*(x+1) kolejno dla 1, 3, 6 i 9
(sum '(6 6 6 100))
(sum (map fib '(1 2 3 4)))

Zamiast pętli wykorzystuje się możliwości stwarzane przez rekursję, szczególnie przez rekursję ogonową. (przykład pierwszy - funkcja fact)

Tak zdefinowana rekursja może być wykonywana bez odkładania parametrów na stos, czyli tak jak zwykła iteracja.

[edytuj] I/O

(write (+ (read) (read)))

[edytuj] Definicja języka

Język Scheme ciągle się rozwija, dwa główne elementy tego rozwoju to dokument opisujący rdzeń języka (RnRS) oraz proces zgłaszania dokumentów SRFI (Scheme Requests for Implementation) czyli propozycji rozszerzeń i ulepszeń języka opracowywanych przez użytkowników.

[edytuj] Standard IEEE i raport RnRS

Język Scheme opisany jest w dwóch dokumentach [1]:

  • standard organizacji IEEE (The IEEE standard, 1178-1990 (R1995))
  • raport R5RS (Revised5 Report on the Algorithmic Language Scheme), piąta wersja dokumentu RnRS

przy czym język opisany w tym drugim dokumencie jest nadzbiorem języka opisanego w standardzie IEEE. Raport RnRS jest powszechnie uważany za oficjalną i podstawową definicję języka: programiści piszą programy zgodne z RnRS, o implementacjach języka Scheme mówi się, że są w całości lub częściowo zgodne z raportem RnRS.

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. Aktualny raport R5RS został opublikowany 20 lutego 1998 roku, obecnie trwają prace nad nową definicją języka - raportem R6RS [2]. Wstępna wersja nowego raportu o numerze 5.91 została wydana 5 września 2006 roku. Zmiany w raporcie dotyczą nie tylko podstawowych cech języka, znaczna część dokumentu to opis standardowej biblioteki języka Scheme.

[edytuj] Dokumenty SRFI

Dokumenty zgłoszone i przyjęte w procesie SRFI [3] są sposobem na w miarę szybkie wprowadzanie przenośnych między implemetacjami 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 skrypró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 RnRS.

Our "Network":

Project Gutenberg
https://gutenberg.classicistranieri.com

Encyclopaedia Britannica 1911
https://encyclopaediabritannica.classicistranieri.com

Librivox Audiobooks
https://librivox.classicistranieri.com

Linux Distributions
https://old.classicistranieri.com

Magnatune (MP3 Music)
https://magnatune.classicistranieri.com

Static Wikipedia (June 2008)
https://wikipedia.classicistranieri.com

Static Wikipedia (March 2008)
https://wikipedia2007.classicistranieri.com/mar2008/

Static Wikipedia (2007)
https://wikipedia2007.classicistranieri.com

Static Wikipedia (2006)
https://wikipedia2006.classicistranieri.com

Liber Liber
https://liberliber.classicistranieri.com

ZIM Files for Kiwix
https://zim.classicistranieri.com


Other Websites:

Bach - Goldberg Variations
https://www.goldbergvariations.org

Lazarillo de Tormes
https://www.lazarillodetormes.org

Madame Bovary
https://www.madamebovary.org

Il Fu Mattia Pascal
https://www.mattiapascal.it

The Voice in the Desert
https://www.thevoiceinthedesert.org

Confessione d'un amore fascista
https://www.amorefascista.it

Malinverno
https://www.malinverno.org

Debito formativo
https://www.debitoformativo.it

Adina Spire
https://www.adinaspire.com