Luku – arviointi – tulostussilmukka - Read–eval–print loop

Luku eval-print silmukka ( KORV ), jota kutsutaan myös vuorovaikutteinen toplevel tai kieli kuori , on yksinkertainen interaktiivinen ohjelmointi ympäristö, joka vie yhden käyttäjän syötteitä, suorittaa ne ja palauttaa tuloksen käyttäjälle; REPL -ympäristössä kirjoitettu ohjelma suoritetaan kappaleittain. Termiä käytetään yleensä viittaamaan ohjelmointirajapintoihin, jotka ovat samanlaisia ​​kuin klassinen Lisp -koneen vuorovaikutteinen ympäristö. Yleisiä esimerkkejä ovat komentorivin kuoret ja niiden kaltaiset ympäristöjä ohjelmointikieliä , ja tekniikka on hyvin tyypillistä ohjelmointikieliä .

Yleiskatsaus

REPL: ssä käyttäjä syöttää yhden tai useamman lausekkeen (eikä koko kokoelmayksikön ), ja REPL arvioi ne ja näyttää tulokset. Nimi read – eval – print loop tulee tämän toiminnon toteuttavien Lisp -primitiivisten toimintojen nimistä:

  • Luku- toiminto hyväksyy lausekkeen käyttäjän, ja jäsentää sen tietorakenne muistiin. Käyttäjä voi esimerkiksi syöttää s-lausekkeen (+ 1 2 3) , joka jäsennetään linkitettyyn luetteloon, joka sisältää neljä tietoelementtiä.
  • Eval toiminto kestää tämän sisäisen tietorakenne ja arvioi sen. Lispissä funktion nimellä alkavan s-lausekkeen arvioiminen tarkoittaa funktion kutsumista argumentteihin, jotka muodostavat muun lausekkeen. Joten funktio +kutsutaan argumentteihin 1 2 3, jolloin tulos saadaan 6.
  • Tulosta toiminto ottaa tulos tuottamia eval , ja tulostaa sen käyttäjälle. Jos se on monimutkainen ilmaisu, se voi olla kauniisti painettu , jotta se olisi helpompi ymmärtää.

Kehitysympäristö palaa sitten lukutilaan ja luo silmukan, joka päättyy, kun ohjelma suljetaan.

REPL -ohjelmat helpottavat tutkivaa ohjelmointia ja virheenkorjausta, koska ohjelmoija voi tarkastella tulostettua tulosta ennen kuin päättää, minkä lausekkeen antaa seuraavaan lukuun. Lukeminen -arviointi -tulostuslenkki sisältää ohjelmoijan useammin kuin perinteinen muokkaus -kääntä -suorita -virheenkorjaus.

Koska tulostustoiminto tuottaa saman tekstimuodon, jota lukutoiminto käyttää syöttöön, useimmat tulokset tulostetaan muodossa, joka voidaan kopioida ja liittää takaisin REPL -tiedostoon. Joskus on kuitenkin tarpeen tulostaa sellaisten elementtien esityksiä, joita ei voida järkevästi lukea takaisin, kuten pistorasiakahva tai monimutkainen luokan esiintymä. Näissä tapauksissa lukemattomille objekteille on oltava syntaksi. Pythonissa se on <__module__.class instance>merkintä ja Common Lispissä #<whatever>muoto. CLIM- , SLIME- ja Symbolics Lisp -koneiden REPL voi myös lukea lukemattomia esineitä. Ne kirjaavat jokaiselle tulostukselle, mikä kohde tulostettiin. Myöhemmin, kun koodi luetaan takaisin, objekti haetaan tulostetusta tulosteesta.

REPLs voidaan luoda tukemaan mitä tahansa tekstikieltä. REPL -tuki käännetyille kielille saavutetaan yleensä ottamalla käyttöön tulkki virtuaalikoneen päälle, joka tarjoaa käyttöliittymän kääntäjälle. Esimerkiksi JDK 9: stä alkaen Java sisälsi JShellin komentoriviliittymänä kielelle. Useilla muilla kielillä on ladattavissa kolmannen osapuolen työkaluja, jotka tarjoavat samanlaisen kuoritoiminnon kielen kanssa.

Käyttää

Koska kuori , joka on KORV ympäristö sallii käyttäjien pääsyn oleelliset piirteet käyttöjärjestelmän lisäksi tarjoaa pääsyn ohjelmoinnin ominaisuuksia. Yleisin käyttö REPL: ille käyttöjärjestelmän kuorien ulkopuolella on hetkellinen prototyyppien luominen . Muita käyttötarkoituksia ovat matemaattinen laskenta, tieteellistä analyysiä sisältävien asiakirjojen luominen (esim. IPython ), interaktiivinen ohjelmistojen ylläpito, vertailuanalyysi ja algoritmien etsiminen.

Lispin yksityiskohdat

Toteutus

Minimaalinen määritelmä on:

(define (REPL env)
  (print (eval env (read)))
  (REPL env) )

Missä envedustaa alkuperäistä evalkäyttöympäristöä. Oletetaan myös, että envse voidaan päivittää tuhoavasti eval.

Toimivuus

Lisp REPL: n tarjoamia tyypillisiä toimintoja ovat:

  • Tulojen ja lähtöjen historia.
  • Muuttujat asetetaan syöttölausekkeille ja tuloksille. Nämä muuttujat ovat saatavilla myös REPL: ssä. Esimerkiksi Common Lisp *viittaa viimeiseen tulokseen **ja ***sitä edeltäviin tuloksiin.
  • REPL -tasot. Jos monissa Lisp-järjestelmissä ilmenee virhe lausekkeen lukemisen, arvioinnin tai tulostuksen aikana, järjestelmää ei palauteta ylätasolle virheilmoituksen kanssa. Sen sijaan uusi REPL, yksi taso syvempi, käynnistetään virhekontekstissa. Käyttäjä voi sitten tarkistaa ongelman, korjata sen ja jatkaa - jos mahdollista. Jos tällaisessa REPL -virheenkorjausvirheessä ilmenee virhe, käynnistetään toinen REPL, joka on tasoa syvempi. Usein REPL tarjoaa erityisiä virheenkorjauskomentoja.
  • Virhe käsittelyssä . REPL tarjoaa uudelleenkäynnistyksen. Näitä uudelleenkäynnistyksiä voidaan käyttää virheen sattuessa palaamaan tiettyyn REPL -tasoon.
  • Hiiriherkkä tietokohteiden tulo ja lähtö.
  • Syötteen muokkaus ja kontekstikohtainen viimeistely symboleille, polkuille, luokkien nimille ja muille objekteille.
  • Ohje ja dokumentaatio komennoille.
  • Muuttujat lukijan ohjaamiseen. Esimerkiksi muuttuja * read-base * ohjaa sitä, missä perusnumerot luetaan oletuksena.
  • Muuttujat tulostimen ohjaamiseen. Esimerkki: tulostettavien lausekkeiden enimmäispituus tai enimmäissyvyys.
  • Komentojen lisäsyntaksi. Joissakin REPL-tiedostoissa on komentoja, jotka eivät seuraa s-lausekkeen syntaksia, mutta toimivat usein Lisp-tietojen kanssa argumentteina.
  • Graafiset REPL -vastaukset. Jotkut Lisp -REPL -tiedostot (CLIM -kuuntelija on esimerkki) hyväksyvät myös graafisen tulon ja lähdön.

Katso myös

Viitteet

Ulkoiset linkit