Scheme

Z Wikipedie, otevřené encyklopedie

Scheme je dialekt funkcionálního programovacího jazyka Lisp. Jazyk navrhli Guy Lewis Steele a Gerald Jay Sussman a jeho první popis byl sepsán v roce 1975. Oproti Lispu se Scheme snaží o minimalismus - poskytovat co nejmenší počet základních funkcí, na nichž jsou pak v knihovnách postaveny složitější konstrukce. Díky tomu má dosud poslední reference jazyka jen 50 stran.

Tento jazyk je pro praxi nepoužitelný, používá se především ve školách pro výuku programování algoritmů.

[editovat] Ukázka kódu

Tradiční program hello world vypadá v jazyce Scheme třeba takto:

(define (hello)
  (display "Ahoj svete!")
  (newline))
(hello)

Na prvním řádku začíná definice procedury hello, která vypíše text „Ahoj svete!“ a odřádkuje. Na čtvrtém řádku je pak tato procedura zavolána.

Příkaz define slouží také k definici proměnných:

(define pi 3.14)

Následující příklad ukazuje definici funkce, která vypočítá faktoriál zadaného čísla:

(define fact
  (lambda (n)
    (if (= n 0)
      1
      (* n (fact (- n 1))))))

Psaní konstrukce lambda může být zdlouhavé a tak Scheme nabízí zkratku:

(define (fact n)
  (if (= n 0)
    1
    (* n (fact (- n 1)))))

Funkci pak lze zavolat:

(fact 4)

Na výstupu bychom dostali číslo 24. Výše uvedený příklad ukazuje několik zajímavých konstrukcí. Jednak je zřejmé, že v jazyce Scheme se používá prefixového zápisu:

(+ 1 2)  ; součet
(- 5 3)  ; rozdíl
(* 4 5)  ; součin
(/ 9 3)  ; podíl

(+ 1 3 7)  ; není třeba se omezovat na dvě čísla

Druhou zajímavou věcí je podmínka if. Ta má tvar (if (výraz) true false), kde větev true se provede, je-li výraz pravdivý (vyhodnocen jako #t), větev false v případě, že je výraz nepravdivý (#f; ekvivalentní části else v jiných jazycích).

Třetí zajímavou věcí je rekurzivní volání sebe sama na pátém řádku definice funkce. Funkci pro výpočet faktoriálu lze přepsat:

(define (fact n)
  (define (iter nn result)
    (if (= nn 0)
      result
      (iter (- nn 1) (* result nn))))
  (iter n 1))

V takovém to případě budou všechna rekurzivní volání koncově rekurzivní. Průběžné hodnoty nejsou ukládány na zásobník, ale jsou předávány jako argumenty rekurzivní fce. a interpretr, může zahodit obsah zásobníku a znovu zavolat funkci. Tzn. že výpočet funkce probíhá v konstantní pamětovém prostoru. Standard jazyka Scheme R5RS, přesně definuje, kdy dojde ke koncovému volání.

[editovat] Externí dokazy


Programovací jazyky

ABAP | Ada | AWK | Assembler | C | C++ | C# | COBOL | ColdFusion | Clean | D | Eiffel | Erlang | Flex | Fortran | JADE | Java | JavaScript | Lisp | Lua | Oberon | Object Pascal | Objective-C | Pascal | Perl | PHP | Python | REALbasic | REBOL | RPG | Ruby | SQL / PL/SQL | Tcl / Tcl/Tk | Visual Basic / VBScript | VB.NET | Visual FoxPro

Akademické: APL / J | Baltazar | Baltík | Karel | OCaml | Haskell | Scheme | Smalltalk | Logo | MATLAB | Mathematica | ML | Prolog

Ostatní: ALGOL | BASIC | Clipper | Forth | Goedel | Limbo | Miranda | Modula-2 / Modula-3 | MUMPS | PL/1 | Simula 67 | Whitespace