A Scheme programozási nyelv

Típusok, típuskonstrukciók

A Scheme-ben használható konstansok (atomok) lehetnek számok, logikai konstansok (#t és #f), az üres lista és sztringek. Néhány példa atomokra:

A, abcd, EZEGYATOM, AB12, 123, 9Ai3n, "A string"

A változók és függvények nevei is atomok. A lista elemek rendezett halmaza. A listaelemek lehetnek atomok, vagy listák. A listákat ugyanúgy zárójelek közé kell tenni, mint LISP-ben. Hasonlóan adhatunk meg vektorokat is, ha a zárójel elé # karaktert teszünk.

Néhány példa listákra és vektorokra:

(A B C) (138 abcde 54 18) (IDONKENT (BONYOLULTABB (ZAROJELEZEST IS)) HASZNALUNK) #(ez meg szimolumok vektora) ()

Egy másik mód listák megadására a listakonstruktorok használata. Az üres listát a () reprezentálja, és ebből a listakonstruktor, a cons függvény segítségével a következőképpen építhető fel a lista: a (cons X ()) egy egyelemű, a (cons X (cons y())) egy kételemű listát állít elő. Hasonlóan többelemű listák is konstruálhatók.

Egyszerű típusok

A Scheme egyszerű típusait az alábbi táblázat foglalja össze:

TÍPUSOK ÉRTÉKEK
logikai (boolean) #t, #f
szám (number) egészek és lebegőpontos számok
szimbólum (symbol) karaktersorozatok
pár (pair) listák és rendezett párok
eljárás (procedure) függvények és procedúrák

Összetett típusok

A Scheme összetett típusait az alábbi táblázat foglalja össze:

TÍPUS REPREZEZENTÁCIÓ
lista (elemek szóközökkel elválasztott sorozata)
function lásd később

Típuspredikátumok

A Scheme predikátum egy logikai függvény, amivel egy típushoz való tartozást, vagy valamilyen tulajdonságot lehet megállapítani. Mivel a Scheme gyengén típusos, sok ilyen függvény létezik. Néhány példa ezekre:

PREDIKÁTUM MIT ELLENŐRIZ
(boolean? arg ) az arg logikai érték-e
(number? arg ) az arg numerikus érték-e
(pair? arg ) az arg pár-e
(symbol? arg ) az arg szimbólum-e
(procedure? arg ) az arg függvény-e
(null? arg ) az arg üres lista-e
(zero? arg ) az arg nulla-e
(odd? arg ) az arg páratlan-e
(even? arg ) az arg páros-e

Számok, aritmetikai operátorok

A Scheme numerikus adattípusa a number, ami lehet egész, racionális, valós, vagy komplex.

Például:

a (+ 4 5 2 7 5 2) és a \( 4 + 5 + 2 + 7 + 5 + 2 \) ekvivalensek

Aritmetikai operátorok

SZIMBÓLUM OPERÁTOR
+ összeadás
- kivonás
* szorzás
/ valós osztás
quotient egész osztás
modulo modulus

Listák

A lista a Scheme alapvető struktúrált adattípusa. A következő példákban az argumentumokat aposztrófok előzik meg. Ez jelzi a Scheme-nek, hogy nem szabad szigorú kiértékelést használni. Néhány példa a Scheme beépített listakezelő függvényeire:

cons
két elemből egy párt (listát) konstruál.
(cons '1 '2) ---> (1 . 2) (cons '1 '(2 3 4)) ---> (1 2 3 4) (cons '(1 2 3) '(4 5 6)) ---> ((1 2 3) 4 5 6)
Az első példa egy rendezett pár, a többi lista. Mind listák mind rendezett párok használhatók rekordok implementálására.
car
visszaadja egy lista, vagy egy rendezett pár első elemét.
(car '(123 245 564 898)) ---> 123 (car '(elso masodik harmadik)) ---> elso (car '(ez (sem sokkal) bonyolultabb)) ---> ez
cdr
a lista elsö elem nélküli részét, vagy egy rendezett lista második elemét adja vissza.
(cdr '(7 6 5)) ---> (6 5) (cdr '(minden nap esik)) ---> (nap esik) (cdr (cdr '(a b c d e f))) ---> (c d e f) (car (cdr '(a b c d e f))) ---> b
null?
Ha az argumentum üres lista, #t-t ad vissza. Ha bármi más, ()-t ad vissza.
list
egy listát épít fel az argumentumaiból.
(list 'a) ---> (a) (list 'a 'b 'c 'd 'e 'f) ---> (a b c d e f) (list '(a b c)) ---> ((a b c)) (list '(a b c) '(d e f) '(g h i)) ---> ((a b c)(d e f)(g h i))
length
visszaadja a lista hosszát.
(length '(1 3 5 9 11)) ---> 5
reverse
fordított sorrendben adja vissza a listát.
(reverse '(1 3 5 9 11)) ---> (11 9 5 3 1)
append
két listát konkatenál.
(append '(1 3 5) '(9 11)) ---> (1 3 5 9 11)

Logikai kifejezések

A logikai igaz és hamis rendre #t és #f. A Scheme a #f-on és az üres listán kívül mindent igaznak tekint, a #f-t és a ()-t hamisnak. Scheme-ben használhatók a szokásos logikai operátorok not, and, or, és különféle egyenlőségvizsgálatok.

Logikai operátorok

SZIMBÓLUM MŰVELET
not negáció
and logikai és
or logiaki vagy

Relációs operátorok

SZIMBÓLUM MŰVELET
= egyenlőség (számokon)
(< ) kisebb, mint
(<= ) kisebbegyenlő
(> ) nagyobb, mint
(>= ) nagyobbegyenlő
eq? az argumentumok egyenértékűek
eqv? az argumentumok ekvivalensek
equal? az argumentumok strukturáltak, és a tartalmuk megegyezik

Feltételes kifejezések

A feltételes kifejezések a következő formában írandók:

(if feltétel then-kifejezés) (if feltétel then-kifejezés else-kifejezés).

A feltétel logikai, míg a then- és az else-kifejezés bármilyen kifejezés lehet. Ha a feltétel igaz, a then-kifejezést, ellenkező esetben az else-kifejezést adja vissza. Például:

(if (> n 0) (= n 10)) (if (null? list) list (cdr list))

A második példában a lista a then-kifejezés, a (cdr list) az else. Használható egy másik feltételes kifejezés is, ami a case-kifejezéseknek felel meg, itt több feltétel-eredmény párt adhatunk meg. Megadásának két módja van:

(cond (test-kif kif ...) (test-kif2 kif2 ...) ...) (cond (test-kif kif ...) ... (else kif ...))

Az alábbi feltételes kifejezések ekvivalensek.

(cond ((= n 10) (= m 1)) ((> n 10) (= m 2) (= n (* n m))) ((< n 10) (= n 0))) (cond ((= n 10) (=m 1)) ((> n 10) (= m 2) (= n (* n m))) (else (= n 0)))

Input és output kifejezések

A Scheme nem támogatja a funkcionális stílusú interaktív programozást, mivel az input nem mint paraméter adódik át, hanem a beépített read függvény ismételt alkalmazásával. Például:

(+ 3 (read))

a 3 és egy a bemenetről beolvasott szám összegét adja vissza. A read ismételt hívasa a következő elemet adja vissza a standard bemenetről, tehát nem valódi függvény. A display függvény kiírja az argumentumát a standard kimenetre. Például:

(display (+ 3 (read)))

kiírja az előző függvény eredményét. A következő program pedig példa interaktív programra. Promptol, majd beolvas egy értéket a standard bemenetről.

(define prompt-read (lambda (Prompt) (display Prompt) (read)))