Systém

Systém
Sémantika funkční
Jazyková třída programovací jazyk , multiparadigmatický programovací jazyk , funkcionální programovací jazyk , procedurální programovací jazyk a metaprogramovací jazyk [d]
Typ provedení interpret nebo kompilátor
Objevil se v 1975
Autor Guy Steele a Gerald Sussman
Přípona souboru .scm, .ss
Uvolnění
Typový systém silný, dynamický
Hlavní implementace Schéma PLT , schéma MIT , schéma48 , Guile , JScheme
Dialekty T
Byl ovlivněn Lisp , ALGOL
ovlivnil Common Lisp , JavaScript , R , Ruby , Dylan , Lua , Hop, Raketa
webová stránka schéma-reports.org
 Mediální soubory na Wikimedia Commons

Scheme [ skiːm ] je funkcionální programovací jazyk , jeden ze tří nejoblíbenějších dialektů Lisp (spolu s Common Lisp a Clojure ). Vytvořeno v polovině 70. let výzkumníky MIT Guyem L. Steelem a Geraldem Jayem Sussmanem .  

Má minimalistický design, obsahuje minimum primitivních struktur a umožňuje vám vyjádřit vše potřebné tím, že na ně postavíte. Například používá pouze dva mechanismy cyklování – koncovou rekurzi a iterativní přístup (který používá dočasné proměnné k uložení mezivýsledku).

Jazyk začal jako pokus implementovat herecký model Carla Hewitta , pro který Steele a Sussman napsali „malého tlumočníka Lisp“ a poté „přidali mechanismus pro vytváření herců a odesílání zpráv“. Scheme byl prvním dialektem jazyka Lisp, který používal výhradně statický (spíše než dynamický) proměnný rozsah , který zaručoval optimalizaci ocasu-rekurze a poskytoval podporu typu boolean ( #ta #fmísto tradičního Ta NIL). Stal se také jedním z prvních jazyků, které podporovaly pokračování . Počínaje specifikací R⁵RS získal jazyk schopnost psát makra založená na syntaktických transformačních vzorcích s „ hygienickým makrem.  Je poskytován „ garbage collection “ (automatické uvolnění paměti z objektů, které se již nepoužívají).

Jazyk používá seznamy a jednorozměrná pole ("vektory") jako základní datové struktury. V souladu s deklarovaným minimalismem (zatím) neexistuje žádná standardní syntaxe pro podpůrné struktury s pojmenovanými poli, stejně jako OOP zařízení  - to vše může programátor implementovat podle své preference, ačkoli většina jazykových implementací nabízí hotové mechanismy.

Původní název jazyka, Schemer, byl změněn kvůli omezení délky názvů souborů v ITS ; ( Anglický  plánovač  - "dobrodruh", "kombinátor"; zjevně náznak jiných jazyků podobných lispu, které vyšly z MIT - Planner (v jednom z významů - "projektor") a Conniver (" conniving "). K popularizaci jazyka významně přispěla kniha „ The Structure and Interpretation of Computer Programs “ od Abelsona a Sussmana , která byla dlouhou dobu používána jako základní učebnice programování na Massachusetts Institute of Technology.

Příklady

Jednoduché matematické operace:

( + 2 ( * 2 2 )) > 6 ( + 1 2 3 4 ) > 10

Volání každé operace (nebo funkce) je reprezentováno seznamem, ve kterém symbol operace (což je v podstatě název funkce) vždy zaujímá počáteční pozici.

Typové predikáty:

( číslo? 5 ) ( číslo? "foo" ) ( string? "foo" )

Podle konvence končí všechna jména predikátů? na .

Kontroly rovnosti:

( rovná se? "foo" "bar" ) ( ekv ? 5 ( + 2 3 )) ( rov.? 'a 'A )

Definice maker pro tradiční operace push a pop:

( definovat-syntaxe push! ( syntax-rules () (( push! x l ) ( set! l ( cons x l ))))) ( definujte-syntax pop! ( syntax-rules () (( pop! l ) ( let (( x ( auto l ))) ( set! l ( cdr l )) x ))))

Definice funkcí:

;; faktoriál v (neefektivním) rekurzivním stylu ( definuj ( fakt x ) ( if ( < x 2 ) 1 ( * ( fakt ( - x 1 )) x ))) ;; Fibonacciho funkce – vyžaduje paralelní rekurzi ( definujte ( fib n ) ( cond ( ( = n 0 ) 0 ) ( ( = n 1 ) 1 ) ( else ( + ( fib ( - n 1 )) ( fib ( - n 2 )) )))) ;; součet prvků seznamu v typickém stylu Scheme ;; (pomocná funkce smyčky vyjadřuje smyčku s ;; koncovou rekurzi a akumulační proměnnou) ( definovat ( sum-list x ) ( nechat smyčku (( x x ) ( n 0 )) ( if ( null? x ) n ( smyčka ( cdr x ) ( + ( auto x ) n ))))) ( fact 14 ) ( fib 10 ) ( sum-list ' ( 6 8 100 )) ( sum-list ( map fib ' ( 1 2 3 4 )))

Definice funkce musí odpovídat následujícímu prototypu:

( definujte název-funkce ( lambda ( argumenty ) ( implementace funkce )))

i když v praxi se často používá zkrácená forma:

( definovat ( argumenty názvu funkce ) ( implementace funkce ))

I/O

Schéma používá typ portu pro vstup a výstup ( port, R5RS sec 6.6) [1] . R5RS definuje dva standardní porty dostupné jako current-input-porta current-output-port, které odpovídají standardním unixovým I/O streamům . Většina implementací také poskytuje current-error-port. Přesměrování I/O je standardem podporováno prostřednictvím procedur with-input-from-filea with-output-to-file. Implementace mají také řetězcové porty, přes které lze provádět mnoho I/O operací v řetězcové vyrovnávací paměti namísto souboru, pomocí procedur ze SRFI 6 [2] . Standard R6RS definuje složitější postupy pro práci s porty a mnoho nových typů portů.

Následující příklady jsou zapsány ve schématu R5RS.

( psát ( + ( číst ) ( číst )))

Výstup na výchozí port (aktuální-výstupní-port):

( let (( hello0 ( lambda () ( display "Ahoj světe" ) ( nový řádek )))) ( hello0 ))

Předání portu jako argument:

( let (( hello1 ( lambda ( p ) ( display " Hello world" p ) ( newline p )))) ( hello1 ( current-output-port )))

Přesměrování výstupu do souboru:

( let (( hello0 ( lambda () ( display "Ahoj světe" ) ( nový řádek )))) ( with-output-to-file "outputfile" hello0 ))

Explicitní otevření souboru a uzavření portu:

( let (( hello1 ( lambda ( p ) ( display "Ahoj svět" p ) ( nový řádek p ))) ( output-port ( open-output-file "outputfile" ))) ( hello1 output-port ) ( close-output -výstup portu-port ) )

call-with-output-file:

( let (( hello1 ( lambda ( p ) ( display "Ahoj světe" p ) ( nový řádek p )))) ( call-with-output-file "outputfile" hello1 ))

Pro zadávání existují podobné postupy. Schéma R5RS poskytuje predikáty input-port?a output-port?. Pro vstup a výstup znaků existují write-char, read-char, peek-chara char-ready?. Procedury a se používají ke čtení a zápisu readvýrazů schématu write. Pokud port při operaci čtení dosáhl konce souboru, vrátí se objekt eof, který lze rozpoznat predikátem eof-object?.

SRFI

Vzhledem k minimalismu jazyka není ve standardu definováno mnoho běžných postupů a syntaktických forem. Aby bylo jádro jazyka malé a aby se podpořila standardizace rozšíření, komunita Scheme přijala proces „Scheme Request for Implementation“, v jehož rámci jsou pečlivě diskutována navrhovaná rozšíření. To přispívá k přenositelnosti kódu. Mnoho SRFI je podporováno všemi nebo většinou implementací schématu.

Následující SRFI [3] jsou široce podporovány implementacemi :

  • 0: kontrola rozšíření pomocícond-expand
  • 1: knihovna pro seznamy
  • 4: vektory homogenních čísel
  • 6: string porty
  • 8: receive: vazba na více hodnot
  • 9: typy záznamů
  • 13: knihovna pro řetězce
  • 14: knihovna znakové sady
  • 16: syntaxe pro procedury proměnné arity
  • 17: zobecněnoset!
  • 18: podpora multithreadingu
  • 19: datové typy a postupy pro práci s časem
  • 25: vícerozměrná pole
  • 26: zápis pro fixaci argumentů procedury bez curry
  • 27: Zdroje náhodných bitů
  • 28: základní formátování řetězců
  • 29: lokalizace
  • 30: vnořené víceřádkové komentáře
  • 31: speciální forma rekurzivního provádění
  • 37:: args-foldprocesor argumentů programu
  • 39: objekty parametrů
  • 41: datové toky
  • 42: dychtivé porozumění
  • 43: vektorová knihovna
  • 45: primitiva pro vyjádření líných iteračních algoritmů
  • 60: bitové operace
  • 61: obecnějšícond
  • 66: oktetové vektory
  • 67: srovnávací postupy

Hlavní implementace

GNU Guile , rozšiřující jazyk projektu GNU , je interpret schémat implementovaný jako knihovna, která umožňuje aplikacím vytvářet interní interpret schémat.

Jazyk Racket byl původně implementací Scheme (původně nazývaného PLT Scheme).

MIT Scheme  je bezplatná implementace ( GPL ) pro platformu x86 pod Linuxem , FreeBSD , IBM OS/2 a Win32 . Chicken Scheme  je tlumočník, který podporuje překlad C. JScheme  je interpret napsaný v Javě ; Kawa je  kompilátor bajtového kódu schématu JVM . Překladač Chez Scheme je dlouhodobě dodáván jako komerční produkt, od roku 2016 je volně distribuován ( Apache ).

Celkem existuje velké množství jazykových implementací pro různé platformy, konkrétně existuje interpret Armpit Scheme pro mikrokontroléry založený na architektuře ARM [4] .

Poznámky

  1. Richard Kelsey; William Clinger; Jonathan Rees; Rozas, GJ; Adams IV, N. I.; Friedman, D.P.; Kohlbecker, E.; Steele Jr., G.L.; Bartley, DH Revised 5 Report on the Algorithmic Language Scheme  //  Vyšší řád a symbolické výpočty: časopis. - 1998. - Srpen ( roč. 11 , č. 1 ). - str. 7-105 . - doi : 10.1023/A:1010051815785 .
  2. William D Clinger. SRFI 6: Základní porty řetězce . Redakce SRFI, schemers.org (1. července 1999). Získáno 9. srpna 2012. Archivováno z originálu dne 21. října 2021.
  3. Systémy schémat podporující SRFI . Redakce SRFI, schemers.org (30. srpna 2009). Získáno 9. srpna 2012. Archivováno z originálu dne 20. června 2021.
  4. Interpret schémat pro mikrokontroléry ARM . Datum přístupu: 30. prosince 2014. Archivováno z originálu 30. prosince 2014.

Literatura

Odkazy