Termen S-uttryck eller sexp (förkortning för "Symboliskt uttryck" [1] - engelska symboliska uttryck ) syftar på en överenskommelse om hur man skriver semi-strukturerad data i en mänskligt läsbar textform. Symboliska uttryck byggs i första hand från symboler och listor. S-uttryck är mest kända för sin användning i Lisp -familjen av programmeringsspråk . S-uttryck används också i Lisp-härledda språk som DSSSL och uppmärkning i kommunikationsprotokoll som John McCarthys IMAP och CBCL. . Detaljerna för syntaxen och de datatyper som stöds skiljer sig åt mellan språken, men ett vanligt drag är användningen av S-uttryck som prefixnotation med parenteser (känd som Cambridge Polish notation ).
S-uttryck används i Lisp för både kod och data (se McCarthy "Rekursiva symboliska uttrycksfunktioner" ). S-uttryck var ursprungligen endast avsedda att representera data som M-uttryck skulle manipulera , men den första implementeringen av Lisp var en S- uttryckstolk till vilken M-uttryck var tänkta att översättas till, och Lisp-programmerare blev snart vana vid att använda S -uttryck som data. , och för koden.
S-uttryck kan vara antingen enstaka objekt (atomer) som siffror, Symbol (Lisp) , inklusive specialtecken niloch t, eller punktpar , i formen (x . y). Längre listor med kapslade punktpar, som (1 . (2 . (3 . nil))), kan skrivas på det mer välbekanta sättet, som (1 2 3). Kapslade listor kan också skrivas som S-uttryck: ((молоко сок) (мёд мармелад)). S-uttryck är oberoende av mellanrum och radbrytningar, mellanrum används endast som avgränsare mellan atomer.
Exempel: en enkel grammatik i form av ett S-uttryck [2] :
((( S ) ( NP ) ( VP )) (( VP ) ( V )) (( VP ) ( V ) ( NP )) (( V ) dog ) (( V ) anställd ) (( NP ) sjuksköterskor ) ( ( NP ) patienter ) (( NP ) Medicenter ) (( NP ) Dr Chan ))Programkod kan också skrivas som ett S-uttryck (vanligtvis med prefixnotation). En liten bit syntaktisk socker för att skriva Lisp-program är att ett vanligt använda uttryck (quote x)kan förkortas'x
Vanligt Lisp exempel :
( defun factorial ( x ) ( if ( noll x ) 1 ( * x ( factorial ( - x 1 )))))Exempel på schema :
( definiera ( faktoriellt x ) ( om ( noll? x ) 1 ( * x ( faktoriellt ( - x 1 )))))S-uttryck i Lisp läses med hjälp av READ-funktionen. Denna funktion läser textrepresentationen av S-uttrycket och returnerar Lisp-data. PRINT-funktionen kan användas för att skriva ut ett S-uttryck. Vad PRINT returnerar kan läsas med hjälp av READ-funktionen, förutsatt att alla utdataobjekt har en I/O-representation. Lisp har denna representation för siffror, strängar, tecken, listor och många fler datatyper. Programkod kan representeras som ett snyggt formaterat (ganska tryckt) S-uttryck med PPRINT-funktionen.
Lisp-program är giltiga S-uttryck, men inte alla S-uttryck är giltiga Lisp-program. (1.0 + 3.1) är ett giltigt S-uttryck, men inte ett giltigt Lisp-program, använder Lisp prefixnotation, så flyttalstalet (1.0) kan inte kännas igen som en operation (det första elementet i uttrycket).
I maj 1997 föreslog Ronald Rivest Internet Draft 3] en ny RFC Projektet definierade en syntax baserad på Lisps S-uttryck, men avsedd för allmän datalagring och utbyte liknande XML , snarare än för programmering. Den godkändes aldrig som RFC, men har sedan dess citerats och använts av andra RFC:er (t.ex. RFC 2693 ) och ett antal andra publikationer. [4] Det var ursprungligen avsett för användning i SPKI .
Rivest-formatet definierar ett S-uttryck som antingen en oktettsträng (en serie byte ) eller en ändlig lista med andra S-uttryck. Den beskriver tre utbytesformat för uttryck med denna struktur. En av dem, "avancerad transport", är ganska flexibel när det gäller formatering, och liknar syntaktiskt uttryck i Lisp-stil, men är inte identisk. Den utökade transportrepresentationen tillåter till exempel att oktettsträngar representeras ordagrant (längden på strängen, sedan ett kolon och hela strängen "som den är"), vilket undviker tecken, hexadecimal eller base64- representation, en oktettsträng kan vara placeras direkt som en "token". " om den uppfyller vissa villkor. Rivests tokens skiljer sig från Lisps tokens genom att de existerar enbart för bekvämlighet och estetik, och behandlas på samma sätt som andra strängar, snarare än att ha en specifik syntaktisk betydelse. Ett annat utbytesformat, avsett att vara mer kompakt, lättare att tolka och unikt för alla abstrakta S-uttryck, är den "kanoniska notationen", som endast tillåter ordagrant strängar och inte tillåter mellanslag som formateringselement utanför strängar. Slutligen finns den "grundläggande transportrepresentationen" som antingen är den kanoniska formen eller samma Base64-kodade element omgivna av parenteser , den senare fungerar som en säker transport för kanonkodade S-uttryck i ett system som tillåter modifiering av blanksteg (t.ex. ett postsystem som har 80 rader breda rader överlagrade på något längre).
Detta format har inte antagits allmänt för användning utanför SPKI. Rivest, på sin S-expressions webbsida, tillhandahåller C -källkoden för en parser och generator som teoretiskt skulle kunna användas i andra program, även om licensieringen av dessa program inte är tydlig. Det finns dock inga begränsningar för oberoende implementeringar av detta format. En gratis implementering finns på sexpr.sf.net och leon.bottou.org/projects/minilisp .
Läspa | |||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
Egenskaper |
| ||||||||||||||
Genomföranden |
| ||||||||||||||
Hårdvara |
| ||||||||||||||
gemenskap |
| ||||||||||||||
|