S-lauseke

Termi S-lauseke tai sexp (lyhenne sanoista "Symbolic expression" [1]  - englanninkielinen  symbolinen ilmaisu ) viittaa sopimukseen siitä, miten puolistrukturoitua dataa kirjoitetaan ihmisen luettavassa tekstimuodossa. Symboliset ilmaisut rakennetaan ensisijaisesti symboleista ja listoista. S-lausekkeet tunnetaan parhaiten niiden käytöstä Lisp -ohjelmointikielissä . S-lausekkeita käytetään myös Lisp-johdannaisissa kielissä, kuten DSSSL , ja merkintöjä viestintäprotokollassa, kuten John McCarthyn IMAP ja CBCL . Syntaksin yksityiskohdat ja tuetut tietotyypit vaihtelevat kielittäin, mutta yhteinen piirre on S-lausekkeiden käyttö etuliitteenä hakasulkeiden avulla (tunnetaan nimellä Cambridge Polish notation ).

S-lausekkeita käytetään Lispissä sekä koodille että datalle (katso McCarthy "Rekursiiviset symbolilausekefunktiot" ). S-lausekkeet oli alun perin tarkoitettu vain edustamaan dataa, jota M-lausekkeiden oli tarkoitus käsitellä , mutta Lispin ensimmäinen toteutus oli S-lausekkeiden tulkki , johon M-lausekkeet oli tarkoitus kääntää, ja Lisp-ohjelmoijat tottuivat pian käyttämään S-lauseketta. -lausekkeet datana. , ja koodille.

S-lausekkeet voivat olla joko yksittäisiä objekteja (atomeja), kuten numeroita, symboleja (Lisp) , mukaan lukien erikoismerkit nilja ttai pisteparit muodossa (x . y). Pidemmät listat sisäkkäisistä pistepareista, kuten (1 . (2 . (3 . nil))), voidaan kirjoittaa tutummin, kuten (1 2 3). Sisäkkäiset listat voidaan kirjoittaa myös S-lausekkeina: ((молоко сок) (мёд мармелад)). S-lausekkeet ovat riippumattomia välilyönnistä ja rivinvaihdoista, välilyöntejä käytetään vain erottimina atomien välillä.

Esimerkki: yksinkertainen kielioppi S-lausekkeen muodossa [2] :

(( S ) ( NP ) ( VP )) ( ( VP ) ( V )) ( ( VP ) ( V ) ( NP )) ( ( V ) kuoli ) ( ( V ) työssä ) ( ( NP ) sairaanhoitajat ) ( ( NP ) potilaat ) ( ( NP ) Medicenter ) ( ( NP ) tohtori Chan ))

Ohjelmakoodi voidaan kirjoittaa myös S-lausekkeena (yleensä etuliitemerkinnällä). Pieni pala syntaktista sokeria Lisp-ohjelmien kirjoittamiseen on se, että yleisesti käytetty ilmaisu (quote x)voidaan lyhentää'x

Tavallinen Lisp- esimerkki :

( defun factorial ( x ) ( if ( nolla x ) 1 ( * x ( factorial ( - x 1 )))))

Esimerkki kaaviosta :

( define ( factorial x ) ( if ( nolla? x ) 1 ( * x ( factorial ( - x 1 )))))

Lisp:n S-lausekkeet luetaan READ-toiminnolla. Tämä funktio lukee S-lausekkeen tekstiesityksen ja palauttaa Lisp-tiedot. PRINT-toimintoa voidaan käyttää S-lausekkeen tulostamiseen. Mitä PRINT palauttaa, voidaan lukea READ-toiminnolla, jos kaikilla lähtötietoobjekteilla on I/O-esitys. Lispillä on tämä esitys numeroille, merkkijonoille, merkeille, luetteloille ja monille muille tietotyypeille. Ohjelmakoodi voidaan esittää siististi muotoiltuna (kauniisti tulostettuna) S-lausekkeena käyttämällä PPRINT-toimintoa.

Lisp-ohjelmat ovat kelvollisia S-lausekkeita, mutta kaikki S-lausekkeet eivät ole kelvollisia Lisp-ohjelmia. (1.0 + 3.1) on kelvollinen S-lauseke, mutta ei kelvollinen Lisp-ohjelma, Lisp käyttää etuliitemerkintää, joten liukulukulukua (1.0) ei voida tunnistaa toiminnoksi (lausekkeen ensimmäinen elementti).

Standardointi

Toukokuussa 1997 Ronald Rivest ehdotti Internet luonnosta 3] RFC : lle Projektissa määriteltiin syntaksi, joka perustuu Lispin S-lausekkeisiin, mutta se on tarkoitettu yleiskäyttöiseen XML :n kaltaiseen tietojen tallennukseen ja vaihtoon ohjelmoinnin sijaan. Sitä ei koskaan hyväksytty RFC:ksi, mutta sen jälkeen muut RFC:t (esim. RFC 2693 ) ja monet muut julkaisut ovat lainanneet ja käyttäneet sitä. [4] Se oli alun perin tarkoitettu käytettäväksi SPKI :ssä .

Rivest-muoto määrittelee S-lausekkeen joko oktettimerkkijonoksi ( tavusarjaksi ) tai lopulliseksi listaksi muista S-lausekkeista. Se kuvaa kolme vaihtomuotoa lausekkeille, joilla on tämä rakenne. Yksi niistä, "edistynyt kuljetus", on muotoilultaan melko joustava ja on syntaktisesti samanlainen kuin Lisp-tyyliset lausekkeet, mutta ei ole identtinen. Laajennettu kuljetusesitys mahdollistaa esimerkiksi oktettimerkkijonojen esittämisen sanatarkasti (merkkijonon pituus, sitten kaksoispiste ja koko merkkijono "sellaisenaan"), jolloin vältetään merkit, heksadesimaali- tai base64 -esitys, oktettimerkkijono voidaan esittää sijoitetaan suoraan "tunnukseksi". Jos se täyttää tietyt ehdot. Rivestin merkit eroavat Lispin tokeneista siinä, että ne ovat olemassa vain mukavuuden ja esteettisyyden vuoksi, ja niitä käsitellään samalla tavalla kuin muita merkkijonoja, sen sijaan, että niillä olisi tietty syntaktinen merkitys. Toinen vaihtomuoto, jonka on tarkoitus olla kompaktimpi, helpompi jäsentää ja ainutlaatuinen kaikille abstrakteille S-lausekkeille, on "kanoninen merkintä", joka sallii vain sanamerkityt merkkijonot ja ei salli välilyöntejä muotoiluelementteinä merkkijonojen ulkopuolella. Lopuksi on "peruskuljetusesitys", joka on joko kanoninen muoto tai samat Base64-koodatut elementit suluilla ympäröitynä. Jälkimmäinen toimii turvallisena siirtona kanonisesti koodatuille S-lausekkeille järjestelmässä, joka mahdollistaa välilyöntien muuttamisen (esim. postijärjestelmä, jossa on 80 riviä leveitä rivejä pidemmän päälle).

Tätä muotoa ei ole otettu laajalti käyttöön SPKI:n ulkopuolella. Rivest tarjoaa S-lausekkeiden verkkosivullaan C - lähdekoodin jäsentimelle ja generaattorille, joita voitaisiin teoriassa käyttää muissa ohjelmissa, vaikka näiden ohjelmien lisensointi ei ole selvä. Tämän muodon itsenäisille toteutuksille ei kuitenkaan ole rajoituksia. Ilmainen toteutus löytyy osoitteista sexpr.sf.net ja leon.bottou.org/projects/minilisp .

Katso myös

Muistiinpanot

  1. McCarthy, 1960 .
  2. Gazdar / MelisH, Natural Language Processing in Lisp
  3. Arkistoitu kopio (linkki ei saatavilla) . Haettu 5. helmikuuta 2010. Arkistoitu alkuperäisestä 1. joulukuuta 2008. 
  4. rivest seksi - Google Scholar

Kirjallisuus