Termín S-expression nebo sexp (zkratka pro "Symbolic expression" [1] - anglický symbolický výraz ) označuje dohodu o tom, jak psát polostrukturovaná data v lidsky čitelné textové podobě. Symbolické výrazy jsou vytvářeny především ze symbolů a seznamů. S-výrazy jsou nejlépe známé pro jejich použití v rodině programovacích jazyků Lisp . S-výrazy se také používají v jazycích odvozených z Lisp, jako je DSSSL , a značkování v komunikačních protokolech, jako jsou IMAP a CBCL Johna McCarthyho . Podrobnosti syntaxe a podporované datové typy se mezi jazyky liší, ale společným rysem je použití S-výrazů jako předpony pomocí závorek (známé jako Cambridge Polish notation ).
S-výrazy se v Lisp používají pro kód i data (viz McCarthy "Funkce rekurzivních symbolických výrazů" ). S-výrazy byly původně určeny pouze k reprezentaci dat, se kterými měly M-výrazy manipulovat , ale první implementací Lisp byl interpret S-výrazů , do kterého měly být M-výrazy překládány, a programátoři Lisp si brzy zvykli používat S. -výrazy jako data. a pro kód.
S-výrazy mohou být buď jednotlivé objekty (atomy), jako jsou čísla, Symbol (Lisp) , včetně speciálních znaků nila t, nebo dvojice teček ve tvaru (x . y). Delší seznamy vnořených teček, jako je (1 . (2 . (3 . nil))), lze zapsat známějším způsobem, jako (1 2 3). Vnořené seznamy lze také zapsat jako S-výrazy: ((молоко сок) (мёд мармелад)). S-výrazy jsou nezávislé na mezerách a zalomení řádků, mezery se používají pouze jako oddělovače mezi atomy.
Příklad: jednoduchá gramatika ve formě S-výrazu [2] :
((( S ) ( NP ) ( VP )) (( VP ) ( V )) (( VP ) ( V ) ( NP )) (( V ) zemřel ) (( V ) zaměstnaný ) (( NP ) sestry ) ( ( NP ) pacienti ) ( ( NP ) Medicenter ) ( ( NP ) Dr Chan ))Programový kód lze také zapsat jako S-výraz (obvykle pomocí předpony). Malým syntaktickým cukrem pro psaní Lisp programů je, že běžně používaný výraz (quote x)může být zkrácen'x
Příklad běžného Lisp :
( defun factorial ( x ) ( if ( zero x ) 1 ( * x ( factorial ( - x 1 ))))))Příklad na schématu :
( definovat ( faktoriál x ) ( if ( nula? x ) 1 ( * x ( faktoriál ( - x 1 )))))S-výrazy v Lisp se čtou pomocí funkce READ. Tato funkce čte textovou reprezentaci S-výrazu a vrací data Lisp. K vytištění S-výrazu lze použít funkci PRINT. To, co vrátí PRINT, lze číst pomocí funkce READ za předpokladu, že všechny výstupní datové objekty mají I/O reprezentaci. Lisp má tuto reprezentaci pro čísla, řetězce, znaky, seznamy a mnoho dalších datových typů. Programový kód může být reprezentován jako úhledně naformátovaný (pěkně vytištěný) S-výraz pomocí funkce PPRINT.
Lisp programy jsou platné S-výrazy, ale ne všechny S-výrazy jsou platné Lisp programy. (1.0 + 3.1) je platný S-výraz, ale není platný Lisp program, Lisp používá předponu, takže číslo s plovoucí desetinnou čárkou (1.0) nemůže být rozpoznáno jako operace (první prvek výrazu).
V květnu 1997 Ronald Rivest navrhl internetový návrh [ ] nový RFC Projekt definoval syntaxi založenou na Lispových S-výrazech, ale určenou pro všeobecné ukládání a výměnu dat podobnou XML , spíše než pro programování. Nikdy nebyl schválen jako RFC, ale od té doby byl citován a používán jinými RFC (např . RFC 2693 ) a řadou dalších publikací. [4] Původně byl určen pro použití v SPKI .
Formát Rivest definuje S-výraz buď jako oktetový řetězec (řada bajtů ) nebo jako konečný seznam dalších S-výrazů. Popisuje tři výměnné formáty pro výrazy s touto strukturou. Jeden z nich, "pokročilý transport", je poměrně flexibilní, pokud jde o formátování, a je syntakticky podobný výrazům ve stylu Lisp, ale není identický. Rozšířená transportní reprezentace například umožňuje, aby byly oktetové řetězce reprezentovány doslovně (délka řetězce, pak dvojtečka a celý řetězec „tak, jak je“), což se vyhýbá znakům, hexadecimálnímu nebo base64 reprezentaci, oktetový řetězec může být umístěn přímo jako „token“. “, pokud splňuje určité podmínky. Rivestovy žetony se liší od Lispových žetonů v tom, že existují pouze pro pohodlí a estetiku a zachází se s nimi stejným způsobem jako s jinými řetězci, spíše než aby měly specifický syntaktický význam. Dalším formátem pro výměnu, který má být kompaktnější, snadněji analyzovatelný a jedinečný pro jakýkoli abstraktní S-výraz, je „kanonický zápis“, který umožňuje pouze doslovné řetězce a nepovoluje mezery jako prvky formátování mimo řetězce. Konečně je zde „základní přenosová reprezentace“, což je buď kanonická forma, nebo stejné prvky zakódované v Base64 obklopené závorkami , které slouží jako bezpečný přenos pro kanonicky zakódované S-výrazy v systému, který umožňuje modifikaci mezer (např. poštovní systém, který má řádky o šířce 80 řádků překryté na něčem delším).
Tento formát nebyl široce přijat pro použití mimo SPKI. Rivest na své webové stránce S-expressions poskytuje zdrojový kód C pro analyzátor a generátor, který by teoreticky mohl být použit v jiných programech, ačkoli licencování těchto programů není jasné. Neexistují však žádná omezení pro nezávislé implementace tohoto formátu. Bezplatnou implementaci lze nalézt na sexpr.sf.net a leon.bottou.org/projects/minisp .
Lisp | |||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
Charakteristika |
| ||||||||||||||
Implementace |
| ||||||||||||||
Hardware |
| ||||||||||||||
Společenství |
| ||||||||||||||
|