Rendszer | |
---|---|
Szemantika | funkcionális |
Nyelvóra | programozási nyelv , többparadigmás programozási nyelv , funkcionális programozási nyelv , procedurális programozási nyelv és metaprogramozási nyelv [d] |
A végrehajtás típusa | tolmács vagy fordító |
Megjelent | 1975 |
Szerző | Guy Steele és Gerald Sussman |
Fájlkiterjesztés _ | .scm, .ss |
Kiadás |
|
Típusrendszer | erős, dinamikus |
Főbb megvalósítások | PLT-séma , MIT-séma , Scheme48 , Guile , JScheme |
Dialektusok | T |
Befolyásolva | Lisp , ALGOL |
befolyásolta | Common Lisp , JavaScript , R , Ruby , Dylan , Lua , Hop, Ütő |
Weboldal | schema-reports.org _ |
Médiafájlok a Wikimedia Commons oldalon |
A Scheme [ skiːm ] egy funkcionális programozási nyelv , a három legnépszerűbb Lisp dialektus egyike (a Common Lisp és Clojure mellett ). Az 1970 - es évek közepén készítette az MIT kutatói , Guy L. Steele és Gerald Jay Sussman .
Minimalista kialakítású, minimális primitív struktúrákat tartalmaz, és lehetővé teszi, hogy mindent kifejezzen, amire szüksége van rájuk építve. Például csak két hurokmechanizmust használ – a farokrekurziót és az iteratív megközelítést (amely ideiglenes változókat használ a közbenső eredmény tárolására).
A nyelvezet Carl Hewitt színészi modelljének megvalósítására tett kísérletként indult, amelyhez Steele és Sussman "egy apró Lisp-tolmácsot" írt, majd "egy mechanizmust adtak hozzá a színészek létrehozásához és az üzenetek küldéséhez". A Scheme volt a Lisp első dialektusa, amely kizárólag statikus (nem dinamikus) változó hatókört használt , ami garantálta a farok-rekurzió optimalizálását és logikai típusú támogatást ( #tés a hagyományos és #fhelyett ). Szintén az egyik első nyelv lett, amely támogatja a folytatásokat . Az R⁵RS specifikációtól kezdve a nyelv lehetőséget kapott a szintaktikai transzformációs mintákon alapuló makrók írására „ higiénikus makróval ” . A " szemétgyűjtés " biztosított (a már nem használt objektumok memória automatikus felszabadítása). TNIL
A nyelv listákat és egydimenziós tömböket ("vektorokat") használ alapvető adatszerkezetként. A deklarált minimalizmusnak megfelelően (még) nincs szabványos szintaxis a megnevezett mezőkkel rendelkező struktúrák támogatására, valamint az OOP lehetőségekre - mindezt a programozó tetszés szerint megvalósíthatja, bár a legtöbb nyelvi implementáció kész mechanizmusokat kínál.
A nyelv eredeti neve, Schemer megváltozott az ITS fájlnevek hosszának korlátozása miatt ; ( angol schemar - "kalandor", "kombinátor"; nyilvánvalóan utalás más lisp-szerű nyelvekre, amelyek az MIT - Planner (az egyik jelentésben - "projektor") és a Conniver ("conniving ") programból jöttek ki. "). A nyelv népszerűsítéséhez jelentős mértékben hozzájárult Abelson és Sussman " A számítógépes programok szerkezete és értelmezése " című könyve , amelyet hosszú ideig a Massachusetts Institute of Technology programozási alaptankönyveként használtak.
Egyszerű matematikai műveletek:
( + 2 ( * 2 2 )) > 6 ( + 1 2 3 4 ) > 10Az egyes műveletek (vagy függvények) meghívását egy lista képviseli, amelyben a műveletszimbólum (amely lényegében a függvény neve) mindig a kezdeti pozíciót foglalja el.
Predikátumok típusa:
( szám? 5 ) ( szám? "foo" ) ( karakterlánc? "foo" )Megállapodás szerint minden predikátumnév -re végződik ?.
Egyenlőségi ellenőrzések:
( egyenlő? "foo" "bar" ) ( eqv? 5 ( + 2 3 )) ( eq? 'a 'A )A makrók meghatározása a hagyományos push és pop műveletekhez:
( define-syntax push! ( syntax-rules () (( push! x l ) ( set! l ( cons x l ))))) ( define-syntax pop! ( syntax-rules () (( pop! l ) ( let (( x ( car l ))) ( set! l ( cdr l )) x ))))Funkciódefiníciók:
;; faktoriális (nem hatékony) rekurzív stílusban ( define ( tény x ) ( if ( < x 2 ) 1 ( * ( tény ( - x 1 )) x ))) ;; Fibonacci függvény - párhuzamos rekurziót igényel ( define ( fib n ) ( cond ( ( = n 0 ) 0 ) ( ( = n 1 ) 1 ) ( else ( + ( fib ( - n 1 )) ( fib ( - n 2 )) )))) ;; a lista elemeinek összege tipikus Scheme stílusban ;; (a huroksegítő függvény egy ciklust fejez ki ;-vel; farokrekurzió és egy akkumulátor változó) ( define ( sum-list x ) ( let loop (( x x ) ( n 0 )) ( if ( null? x ) n ( ciklus ( cdr x ) ( + ( autó x ) n )))) ( 14. tény ) ( fib 10 ) ( sum-list ' ( 6 8 100 )) ( sum-list ( map fib ' ( 1 2 3 4 ))A függvénydefiníciónak meg kell felelnie a következő prototípusnak:
( define függvénynév ( lambda ( argumentumok ) ( függvény-implementáció )))bár a gyakorlatban gyakran használják a rövidített formát:
( define ( függvénynév argumentumok ) ( függvény-implementáció ))A séma a porttípust használja a bemenethez és a kimenethez ( port, R5RS sec 6.6) [1] . Az R5RS két szabványos portot határoz meg, amelyek és minták állnak rendelkezésre current-input-port, amelyek current-output-portmegfelelnek a szabványos Unix I/O adatfolyamoknak . A legtöbb megvalósítás azt is biztosítja current-error-port. Az I/O átirányítást a szabvány támogatja a with-input-from-fileés eljárásokon keresztül with-output-to-file. Az implementációknak vannak string portjai is, amelyeken keresztül számos I/O művelet hajtható végre egy karakterlánc pufferen, nem pedig fájlon, az SRFI 6 eljárásaival [2] . Az R6RS szabvány bonyolultabb eljárásokat határoz meg a portok és sok új típusú port kezelésére.
A következő példák az R5RS sémában vannak írva.
( írás ( + ( olvas ) ( olvas )Kimenet az alapértelmezett portra (current-output-port):
( let (( hello0 ( lambda () ) ( "Hello world" megjelenítése ) ( újsor )))) ( hello0 ))Port átadása argumentumként:
( let (( hello1 ( lambda ( p ) ( "Hello world" p ) ( újsor p )))) ( hello1 ( jelenlegi kimeneti port )))A kimenet átirányítása fájlba:
( let (( hello0 ( lambda () ) ( "Hello world" megjelenítése ) ( újsor )))) ( with-output-to-file "outputfile" hello0 ))Egy fájl nyílt megnyitása és egy port bezárása:
( let (( hello1 ( lambda ( p ) ( "Hello world" p megjelenítése ) ( újsor p ))) ( output-port ( open-output-file "outputfile" ))) ( hello1 output-port ) ( bezárás kimenet -port kimenet-port ) )hívás kimeneti fájllal:
( let (( hello1 ( lambda ( p ) ( "Hello world" p ) ( újsor p )))) ( call-with-output-file "outputfile" hello1 ) )Hasonló eljárások vannak a bevitelhez. Az R5RS séma predikátumokat input-port?és output-port?. Karakterbevitelhez és -kimenethez a write-char, read-charés peek-chara char-ready?. A és eljárások a Sémakifejezések olvasására és írására readszolgálnak write. Ha a port egy olvasási művelet során elérte a fájl végét, akkor egy eof objektum kerül visszaadásra, amelyet a predikátum felismer eof-object?.
A nyelv minimalizmusa miatt sok gyakori eljárás és szintaktikai forma nincs meghatározva a szabványban. Annak érdekében, hogy a nyelv magja kicsiben maradjon, és előmozdítsa a kiterjesztések szabványosítását, a Scheme közösség elfogadta a „Scheme Request for Implementation” folyamatot, amelynek során a javasolt kiterjesztéseket gondosan megvitatják. Ez hozzájárul a kód hordozhatóságához. Sok SRFI-t az összes vagy a legtöbb Scheme implementáció támogat.
A következő SRFI-ket [3] széles körben támogatják a megvalósítások :
A GNU Guile , a GNU Project kiterjesztési nyelve , egy olyan séma értelmező, amely könyvtárként van megvalósítva, és lehetővé teszi az alkalmazások számára, hogy belső sémaértelmezést hozzanak létre.
A Racket nyelv eredetileg a Scheme (eredeti nevén PLT Scheme) megvalósítása volt.
Az MIT Scheme egy ingyenes ( GPL ) megvalósítás az x86 platformon Linux , FreeBSD , IBM OS/2 és Win32 alatt . A Chicken Scheme egy tolmács, amely támogatja a C fordítást . A JScheme egy Java nyelven írt tolmács ; A Kawa egy Scheme to JVM bájtkód fordítója . A Chez Scheme fordítót már régóta kereskedelmi termékként szállítják, 2016 óta szabadon terjeszthetővé vált ( Apache ).
Összességében nagyszámú nyelvi implementáció létezik a különböző platformokhoz, különösen az ARM architektúrán alapuló mikrokontrollerekhez létezik egy Armpit Scheme interpreter [4] .
Selypít | |||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
Jellemzők |
| ||||||||||||||
Megvalósítások |
| ||||||||||||||
Hardver |
| ||||||||||||||
Közösség |
| ||||||||||||||
|
Programozási nyelvek | |
---|---|
|