Kaavio | |
---|---|
Semantiikka | toimiva |
Kieliluokka | ohjelmointikieli , moniparadigmaohjelmointikieli , toiminnallinen ohjelmointikieli , prosessiohjelmointikieli ja metaohjelmointikieli [d] |
Toteutustyyppi | tulkki tai kääntäjä |
Esiintyi | 1975 |
Tekijä | Guy Steele ja Gerald Sussman |
Tiedostotunniste _ | .scm, .ss |
Vapauta |
|
Tyyppijärjestelmä | vahva, dynaaminen |
Tärkeimmät toteutukset | PLT Scheme , MIT Scheme , Scheme48 , Guile , JScheme |
Murteet | T |
Vaikutettu | Lisp , ALGOL |
vaikutti | Common Lisp , JavaScript , R , Ruby , Dylan , Lua , Hop, Maila |
Verkkosivusto | schema-reports.org _ |
Mediatiedostot Wikimedia Commonsissa |
Scheme [ skiːm ] on toiminnallinen ohjelmointikieli , yksi kolmesta suosituimmasta Lisp -murteesta (yhdessä Common Lispin ja Clojuren kanssa ). MIT :n tutkijoiden Guy L. Steele ja Gerald Jay Sussman luovat 1970 - luvun puolivälissä .
Siinä on minimalistinen muotoilu, se sisältää vähän primitiivisiä rakenteita ja antaa sinun ilmaista kaikkea mitä tarvitset rakentamalla niiden päälle. Se esimerkiksi käyttää vain kahta silmukkamekanismia - tail-rekursiota ja iteratiivista lähestymistapaa (joka käyttää väliaikaisia muuttujia välituloksen tallentamiseen).
Kieli alkoi yrityksellä toteuttaa Carl Hewittin näyttelijämallia , jota varten Steele ja Sussman kirjoittivat "pienen Lisp-tulkin" ja sitten "lisäsivät mekanismin näyttelijöiden luomiseen ja viestien lähettämiseen". Scheme oli ensimmäinen Lispin murre, joka käytti yksinomaan staattista (dynaamisen sijaan) muuttujan laajuutta , mikä takasi tail-rekursion optimoinnin ja tarjosi boolean-tyyppisen tuen ( #tja #fperinteisen Tja sijaan NIL). Siitä tuli myös yksi ensimmäisistä kielistä, joka tukee jatkoja . R⁵RS-spesifikaatiosta lähtien kieli sai mahdollisuuden kirjoittaa makroja syntaktisten muunnosmallien perusteella " hygieenisellä makrolla " . " Roskakeräys " tarjotaan (automaattinen muistin vapauttaminen kohteista, joita ei enää käytetä).
Kieli käyttää perustietorakenteina listoja ja yksiulotteisia taulukoita ("vektoreita"). Ilmoitetun minimalismin mukaisesti nimettyjen kenttien tukirakenteille ja OOP -mahdollisuuksille ei (vielä) ole standardisyntaksia - kaiken tämän voi toteuttaa ohjelmoija mielensä mukaan, vaikka useimmat kielitoteutukset tarjoavat valmiita mekanismeja.
Kielen alkuperäinen nimi Schemer muutettiin ITS :n tiedostonimien pituuden rajoittamisen vuoksi ; ( Englannin kielen suunnittelija - "seikkailija", "kombinaattori"; ilmeisesti vihje muille lisp-tyyppisille kielille, jotka tulivat MIT - Plannerista (yksi merkityksistä - "projektori") ja Conniverista ("conniving" "). Merkittävä panos kielen popularisointiin oli Abelsonin ja Sussmanin kirja " The Structure and Interpretation of Computer Programs " , jota käytettiin pitkään ohjelmoinnin perusoppikirjana Massachusetts Institute of Technologyssa.
Yksinkertaiset matemaattiset operaatiot:
( + 2 ( * 2 2 )) > 6 ( + 1 2 3 4 ) > 10Kunkin toiminnon (tai funktion) kutsu esitetään luettelona, jossa operaatiosymboli (joka on olennaisesti funktion nimi) on aina alkuasemassa.
Tyyppi predikaatit:
( numero? 5 ) ( numero? "foo" ) ( merkkijono? "foo" )Sopimuksen mukaan kaikki predikaattinimet päättyvät merkkiin ?.
Tasa-arvotarkastukset:
( yhtä suuri? "foo" "bar" ) ( eqv? 5 ( + 2 3 )) ( eq? 'a 'A )Perinteisten push- ja pop-operaatioiden makrojen määritelmä:
( 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 ))))Toimintojen määritelmät:
;; faktoriaali (tehoton) rekursiivisella tyylillä ( määrittele ( tosiasia x ) ( if ( < x 2 ) 1 ( * ( fakta ( - x 1 )) x ) ;; Fibonacci-funktio - vaatii rinnakkaisrekursion ( define ( fib n ) ( cond (( = n 0 ) 0 ) (( = n 1 ) 1 ) ( muuten ( + ( fib ( - n 1 )) ( fib ( - n 2 )) )))) ;; luettelon elementtien summa tyypillisessä Scheme-tyylissä ;; (silmukan apufunktio ilmaisee silmukan, jossa on ;; häntärekursio ja akkumuuttuja) ( define ( summa-lista x ) ( anna silmukan (( x x ) ( n 0 )) ( if ( null? x ) n ( silmukka ( cdr x ) ( + ( auto x ) n ))))) ( fakta 14 ) ( fib 10 ) ( summa-lista ' ( 6 8 100 )) ( summa-lista ( kartta fib ' ( 1 2 3 4 ))Toimintomäärityksen on oltava seuraavan prototyypin mukainen:
( määrittele funktion nimi ( lambda ( argumentit ) ( funktion toteutus )))vaikka käytännössä käytetään usein lyhennettä:
( define ( funktion nimi argumentit ) ( funktion toteutus ))Scheme käyttää porttityyppiä tuloon ja ulostuloon ( port, R5RS sec 6.6) [1] . R5RS määrittelee kaksi standardiporttia, jotka ovat saatavilla muodossa current-input-portja current-output-port, jotka vastaavat tavallisia Unix I/O -virtoja . Useimmat toteutukset tarjoavat myös current-error-port. I/O-uudelleenohjausta tuetaan standardissa with-input-from-fileja -menettelyjen avulla with-output-to-file. Toteutuksissa on myös merkkijonoportteja, joiden kautta voidaan suorittaa monia I/O-operaatioita merkkijonopuskurissa tiedoston sijasta käyttämällä SRFI 6:n [2] proseduureja . R6RS-standardi määrittelee monimutkaisempia menettelyjä porttien ja monien uudentyyppisten porttien käsittelyyn.
Seuraavat esimerkit on kirjoitettu R5RS-kaaviossa.
( kirjoita ( + ( lue ) ( lue )Lähtö oletusporttiin (nykyinen lähtöportti):
( let (( hello0 ( lambda ( ) ( näytä "Hei maailma" ) ( rivinvaihto )))) ( hei0 ))Portin välittäminen argumenttina:
( let (( hello1 ( lambda ( p ) ( näytä "Hei maailma" p ) ( rivinvaihto p )))) ( hello1 ( nykyinen lähtöportti )))Tulosteen uudelleenohjaus tiedostoon:
( let (( hello0 ( lambda () ) ( näytä "Hei maailma" ) ( rivinvaihto )))) ( with-output-to-file "outputfile" hello0 ))Tiedoston avaaminen ja portin sulkeminen:
( let ( ( hello1 ( lambda ( p ) ( näytä " Hei maailma " p ) _ _ _ _ _ _ _ _ _ _ _ _ -portti lähtö-portti ) )call with-output-tiedosto:
( let (( hello1 ( lambda ( p ) ( näytä "Hei maailma" p ) ( rivinvaihto p )))) ( call-with-output-file "outputfile" hello1 ))On olemassa samanlaisia syöttömenetelmiä. R5RS-kaavio tarjoaa predikaatteja input-port?ja output-port?. Merkkien syöttämistä ja tulostamista varten on write-char, read-char, peek-charja char-ready?. Menetelmiä ja käytetään Scheme - readlausekkeiden lukemiseen ja kirjoittamiseen write. Jos portti on saavuttanut tiedoston loppuun lukutoiminnossa, palautetaan eof-objekti, jonka predikaatti tunnistaa eof-object?.
Kielen minimalismista johtuen monia yleisiä menettelytapoja ja syntaktisia muotoja ei ole määritelty standardissa. Pitääkseen kielen ytimen pienenä ja edistääkseen laajennusten standardointia Scheme-yhteisö on ottanut käyttöön "Scheme Request for Implementation" -prosessin, jossa ehdotetuista laajennuksista keskustellaan huolellisesti. Tämä edistää koodin siirrettävyyttä. Kaikki tai useimmat Scheme-toteutukset tukevat monia SRFI:itä.
Toteutukset tukevat laajasti seuraavia SRFI :itä [3] :
GNU Guile , GNU Projectin laajennuskieli , on Scheme-tulkki, joka on toteutettu kirjastona, jonka avulla sovellukset voivat luoda sisäisen Scheme-tulkin.
Racket - kieli oli alun perin Schemen (alun perin nimeltään PLT Scheme) toteutus.
MIT Scheme on ilmainen ( GPL ) toteutus x86 -alustalle Linuxissa , FreeBSD : ssä , IBM OS/2 :ssa ja Win32 :ssa . Chicken Scheme on tulkki, joka tukee C -käännöstä . JScheme on Java -kielellä kirjoitettu tulkki ; Kawa on Scheme to JVM -tavukoodin kääntäjä . Chez Scheme -kääntäjä on toimitettu kaupallisena tuotteena pitkään, vuodesta 2016 lähtien se on levitetty vapaasti ( Apache ).
Kaiken kaikkiaan eri alustoille on olemassa suuri määrä kielitoteutuksia, erityisesti ARM-arkkitehtuuriin pohjautuvien mikrokontrollereiden Armpit Scheme -tulkki [4] .
Lisp | |||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
Ominaisuudet |
| ||||||||||||||
Toteutukset |
| ||||||||||||||
Laitteisto |
| ||||||||||||||
Yhteisö |
| ||||||||||||||
|
Ohjelmointikielet | |
---|---|
|