Nel mondo della programmazione, le espressioni S (o espressioni simboliche) sono una rappresentazione di dati di elenchi annidati (struttura ad albero). Questa rappresentazione è stata proposta e resa popolare per la prima volta dal linguaggio di programmazione Lisp ed è stata ampiamente utilizzata sia nel codice sorgente che nei dati del linguaggio. Le espressioni S hanno un significato rivoluzionario nella programmazione e nella rappresentazione della struttura dei dati. Esploriamo le sue caratteristiche principali e i suoi usi in profondità.
Nella sintassi tradizionale delle parentesi del Lisp, la definizione di un'espressione S è abbastanza semplice: può essere un atomo, oppure può essere un'espressione della forma (x . y), dove xey sono entrambi espressioni S . Questa definizione riflette il concetto del Lisp di rappresentare le liste come una serie di "unità", ciascuna delle quali è una coppia ordinata.
Questa definizione ricorsiva significa che sia le espressioni S che le liste possono rappresentare qualsiasi albero binario.
Inoltre, i moderni dialetti Lisp come Common Lisp e Scheme forniscono una sintassi che utilizza tag di dati per indicare la struttura condivisa degli oggetti, che consente alle espressioni di trasportare la funzionalità dei cicli di riferimento senza causare ricorsione infinita.
La forma sintattica dell'espressione S presenta molte varianti, supportando la rappresentazione di diversi tipi di dati. I più comuni includono:
Pertanto, il carattere # viene spesso utilizzato come prefisso dell'espansione della sintassi, ad esempio, #x10 rappresenta un numero intero esadecimale o #\C rappresenta un carattere.
In Lisp, quando si esprime il codice sorgente, il primo elemento di un'espressione S è solitamente un operatore o un nome di funzione e gli elementi successivi vengono trattati come parametri. Questa è chiamata "notazione del prefisso" o "notazione polacca". Ad esempio, l'espressione booleana 4 == (2 + 2) nel linguaggio C è espressa come (= 4 (+ 2 2)) nell'espressione S di Lisp.
La definizione precisa di un "atomo" varia tra i linguaggi Lisp; le stringhe tra virgolette possono generalmente contenere qualsiasi carattere, ma gli identificatori senza virgolette non possono contenere virgolette, spazi, parentesi o altri caratteri speciali.
Le espressioni S vengono lette tramite la funzione READ e la funzione PRINT viene utilizzata per produrre espressioni S. Questa capacità di leggersi e scriversi a vicenda rende i programmi Lisp non solo una rappresentazione del codice sorgente, ma anche una struttura dati elaborabile. I programmi Lisp possono essere formattati in bellissime espressioni S e l'output in vari formati può essere ottenuto tramite la funzione PPRINT.
Nell'uso delle espressioni S, un confronto importante è la loro differenza con XML: le espressioni S hanno solo una forma di inclusione, ovvero coppie di punti, mentre i tag XML possono contenere attributi semplici, altri tag o CDATA . Le espressioni S sono più semplici di XML nei casi d'uso semplici, ma nelle applicazioni avanzate, XML fornisce linguaggi di query come XPath, che rendono gli strumenti e le librerie che elaborano i dati XML relativamente più vantaggiosi.
Vari linguaggi di programmazione derivati da Lisp hanno le proprie specifiche di sintassi per le espressioni S, tra cui Common Lisp (ANSI INCITS 226-1994 (R2004)), Scheme (R5RS e R6RS) e ISLISP. Sebbene l'Internet Draft proposto da Ron Rivest nel 1997 non sia riuscito a diventare un RFC, le specifiche generali di archiviazione e scambio di dati basate sulle espressioni S Lisp da esso definite sono ancora citate e applicate in altri documenti.
Il formato Rivest è definito come una stringa di otto bit o un elenco di un numero limitato di altre espressioni S e descrive il formato di trasmissione di tre strutture di espressioni.
Questi sviluppi hanno senza dubbio promosso l'applicazione delle espressioni S nello scambio e nell'analisi dei dati, nonché l'universalità e la flessibilità della programmazione. Attraverso questi sviluppi standardizzati vediamo l'importante posizione delle espressioni S nella nuova generazione di programmazione.
In breve, lo status delle espressioni S in Lisp non è solo un requisito grammaticale, ma anche una presentazione integrata della struttura dei dati e del codice sorgente. Mette alla prova le nostre opinioni intrinseche sui linguaggi di programmazione. Quindi, le espressioni S possono trovare nuove applicazioni e significati nella programmazione futura?