Kaavio

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.

Esimerkkejä

Yksinkertaiset matemaattiset operaatiot:

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

Kunkin 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 ))

I/O

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?.

SRFI

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] :

  • 0: tarkista, onko laajennuksiacond-expand
  • 1: kirjasto luetteloille
  • 4: homogeeniset lukuvektorit
  • 6: merkkijonoportit
  • 8: receive: sitoudu useisiin arvoihin
  • 9: tietuetyypit
  • 13: kirjasto jousille
  • 14: merkistökirjasto
  • 16: syntaksi muuttujaarity- proseduureille
  • 17: yleistettyset!
  • 18: monisäikeinen tuki
  • 19: Tietotyypit ja menetelmät ajan kanssa työskentelemiseen
  • 25: moniulotteiset taulukot
  • 26: merkintä prosessiargumenttien kiinnittämiseksi ilman currya
  • 27: satunnaisten bittien lähteet
  • 28: perusmerkkijonomuotoilu
  • 29: lokalisointi
  • 30: sisäkkäiset moniriviset kommentit
  • 31: erityinen rekursiivisen suorituksen muoto
  • 37: args-fold: ohjelman argumenttien prosessori
  • 39: parametriobjektit
  • 41: tietovirrat
  • 42: innokkaita käsityksiä
  • 43: vektorikirjasto
  • 45: primitiivit laiskojen iteratiivisten algoritmien ilmaisemiseen
  • 60: bittitoiminnot
  • 61: yleisempicond
  • 66: oktettivektorit
  • 67: vertailumenettelyt

Tärkeimmät toteutukset

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] .

Muistiinpanot

  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  //  Higher-Order and Symbolic Computation : Journal. - 1998. - elokuu ( osa 11 , nro 1 ) . - s. 7-105 . - doi : 10.1023/A:1010051815785 .
  2. William D Clinger. SRFI 6: Perusmerkkijonoportit . The SRFI Editors, schemars.org (1. heinäkuuta 1999). Haettu 9. elokuuta 2012. Arkistoitu alkuperäisestä 21. lokakuuta 2021.
  3. SRFI:itä tukevat järjestelmäjärjestelmät . The SRFI Editors, schemars.org (30. elokuuta 2009). Haettu 9. elokuuta 2012. Arkistoitu alkuperäisestä 20. kesäkuuta 2021.
  4. Kaaviotulkki ARM-mikro-ohjaimille . Käyttöpäivä: 30. joulukuuta 2014. Arkistoitu alkuperäisestä 30. joulukuuta 2014.

Kirjallisuus

Linkit