S-expresie

Termenul S-expression sau sexp (prescurtare pentru „Expresie simbolică” [1]  - expresie simbolică în engleză  ) se referă la un acord privind modul de scriere a datelor semi-structurate într-o formă de text care poate fi citită de om. Expresiile simbolice sunt construite în primul rând din simboluri și liste. Expresiile S sunt cel mai bine cunoscute pentru utilizarea lor în familia Lisp de limbaje de programare . Expresiile S sunt folosite și în limbaje derivate din Lisp, cum ar fi DSSSL și în marcarea protocoalelor de comunicare, cum ar fi IMAP și CBCL ale lui John McCarthy . Detaliile sintaxei și tipurile de date acceptate diferă între limbi, dar o caracteristică comună este utilizarea expresiilor S ca notație de prefix folosind paranteze (cunoscută ca notație poloneză Cambridge ).

Expresiile S sunt folosite în Lisp atât pentru cod, cât și pentru date (vezi McCarthy „Funcții de expresie simbolică recursive” ). Expresiile S au fost inițial destinate doar să reprezinte date pe care expresiile M trebuiau să le manipuleze , dar prima implementare a Lisp a fost un interpret de expresii S în care expresiile M urmau să fie traduse, iar programatorii Lisp s-au obișnuit curând să folosească S. -expresii ca date. și pentru cod.

Expresiile S pot fi fie obiecte unice (atomi), cum ar fi numere, Simbol (Lisp) , inclusiv caractere speciale nilși t, sau perechi de puncte , sub forma (x . y). Liste mai lungi de perechi de puncte imbricate, cum ar fi (1 . (2 . (3 . nil))), pot fi scrise într-un mod mai familiar, ca (1 2 3). Listele imbricate pot fi scrise și ca expresii S: ((молоко сок) (мёд мармелад)). Expresiile S sunt independente de spații și rupturi de linie, spațiile sunt folosite doar ca delimitatori între atomi.

Exemplu: o gramatică simplă sub forma unei expresii S [2] :

((( S ) ( NP ) ( VP )) (( VP ) ( V )) (( VP ) ( V ) ( NP )) (( V ) a murit ) (( V ) angajat ) (( NP ) asistente ) ( ( NP ) pacienți ) (( NP ) Medicenter ) (( NP ) Dr Chan ))

Codul programului poate fi scris și ca o expresie S (de obicei folosind notația prefixă). O mică bucată de zahăr sintactic pentru scrierea programelor Lisp este că o expresie folosită în mod obișnuit (quote x)poate fi abreviată'x

Exemplu de Lisp comun :

( factorial defun ( x ) ( dacă ( zerop x ) 1 ( * x ( factorial ( - x 1 )))))

Exemplu pe Scheme :

( definește ( factorial x ) ( dacă ( zero? x ) 1 ( * x ( factorial ( - x 1 )))))

Expresiile S din Lisp sunt citite folosind funcția READ. Această funcție citește reprezentarea textuală a expresiei S și returnează datele Lisp. Funcția PRINT poate fi folosită pentru a tipări o expresie S. Ceea ce returnează PRINT poate fi citit folosind funcția READ, cu condiția ca toate obiectele de date de ieșire să aibă o reprezentare I/O. Lisp are această reprezentare pentru numere, șiruri, caractere, liste și multe alte tipuri de date. Codul programului poate fi reprezentat ca o expresie S bine formatată (destul de tipărită) folosind funcția PPRINT.

Programele Lisp sunt expresii S valide, dar nu toate expresiile S sunt programe Lisp valide. (1.0 + 3.1) este o expresie S validă, dar nu un program Lisp valid, Lisp folosește notația de prefix, astfel încât numărul în virgulă mobilă (1.0) nu poate fi recunoscut ca o operație (primul element al expresiei).

Standardizare

În mai 1997, Ronald Rivest a propus Internet Draft 3] un nou RFC Proiectul a definit o sintaxă bazată pe expresiile S ale lui Lisp, dar destinată stocării și schimbului de date de uz general similar cu XML , mai degrabă decât pentru programare. Nu a fost niciodată aprobat ca RFC, dar de atunci a fost citat și utilizat de alte RFC-uri (de exemplu , RFC 2693 ) și de o serie de alte publicații. [4] A fost inițial destinat utilizării în SPKI .

Formatul Rivest definește o expresie S fie ca un șir de octet (o serie de octeți ) fie o listă finită de alte expresii S. Descrie trei formate de schimb pentru expresii cu această structură. Una dintre ele, „transportul avansat”, este destul de flexibilă în ceea ce privește formatarea și este similară sintactic cu expresiile în stil Lisp, dar nu este identică. Reprezentarea de transport extinsă, de exemplu, permite reprezentarea textuală a șirurilor de octet (lungimea șirului, apoi două puncte și întregul șir „ca atare”), ceea ce evită caracterele, reprezentarea hexazecimală sau în bază64 , un șir de octet poate fi plasat direct ca „jeton”. ” dacă îndeplinește anumite condiții. Jetoanele lui Rivest diferă de cele ale lui Lisp prin faptul că există doar pentru comoditate și estetică și sunt tratate în același mod ca și alte șiruri, mai degrabă decât să aibă un sens sintactic specific. Un alt format de schimb, destinat să fie mai compact, mai ușor de analizat și unic pentru orice expresie S abstractă, este „notația canonică”, care permite doar șiruri textuale și nu permite spații ca elemente de formatare în afara șirurilor. În cele din urmă, există „reprezentarea transportului de bază”, care este fie forma canonică, fie aceleași elemente codificate în Base64, înconjurate de paranteze , acestea din urmă servind ca transport sigur pentru expresiile S codificate canonic într-un sistem care permite modificarea spațiului alb (de ex. un sistem de e-mail care are linii de 80 de linii suprapuse pe ceva mai lung).

Acest format nu a fost adoptat pe scară largă pentru utilizare în afara SPKI. Rivest, pe pagina sa web S-expressions, furnizează codul sursă C pentru un parser și generator care ar putea fi, teoretic, utilizat în alte programe, deși licențiarea acestor programe nu este clară. Cu toate acestea, nu există restricții privind implementările independente ale acestui format. O implementare gratuită poate fi găsită la sexpr.sf.net și leon.bottou.org/projects/minilisp .

Vezi și

Note

  1. McCarthy, 1960 .
  2. Gazdar / MelisH, Procesarea limbajului natural în Lisp
  3. Copie arhivată (link nu este disponibil) . Consultat la 5 februarie 2010. Arhivat din original la 1 decembrie 2008. 
  4. rivest sexp - Google Scholar

Literatură