Le parentesi quadre e le parentesi graffe in Clojure sono ancora espressioni S?


12

Sto cercando di imparare Lisp e guardando tutte le Lisp là fuori e le loro differenze.

Vedo che in alcune implementazioni di Scheme, puoi usare parentesi quadre in modo intercambiabile con parentesi tonde per leggibilità, quindi poiché sono trattate allo stesso modo, suppongo che siano ancora solo espressioni S come tutte le altre.

Tuttavia, in Clojure vedo che parentesi quadre e parentesi graffe vengono utilizzate per rappresentare diversi tipi di dati come vettori e così via. Anche queste sono ancora espressioni S valide o devono essere considerate atomi? Questo "spezza" l'intero concetto delle espressioni S, rendendo Clojure un Lisp "impuro"?


Tecnicamente "se le parentesi quadre sono s-espressioni, come è possibile esprimerle tra parentesi?" non faceva parte della domanda, ma è quello che voglio sapere.
Qwertie

Risposte:


10

La notazione letterale per vettori e mappe (es. Parentesi quadre e parentesi graffe) è solo zucchero di lettura , e tutto ciò che puoi rappresentare con quella notazione può anche essere rappresentato con espressioni S. Di conseguenza, non vi è alcuna perdita di potenza o omoiconicità, e in effetti le macro dei lettori (che a mio avviso sono ancora più potenti) sono disponibili in diverse serie.

Per inciso, nota che Clojure ora fornisce un meccanismo per la creazione di letterali personalizzati "taggati", che, come altri letterali, vengono trasformati in espressioni S prima di essere compilati e interpretati.


1
Mmm, la tua risposta mi fa pensare che capisco meno di quanto pensassi di capire su Lisp. Quindi quello che stai dicendo (penso) è che le parentesi quadre e ricci non sono in realtà espressioni S stesse. Ho pensato che l'idea con l'input Lisp fosse che tutto è un'espressione a S. Sembra che dovrei scavare un po 'di più prima di tornare a leggere di nuovo la tua risposta. Grazie!
mydoghasworms

È corretto: non sono espressioni S. La sintassi di Lisp inizia con espressioni S, in quanto tutto ciò che può essere espresso nella lingua può essere espresso con espressioni S. Ma la sintassi di Lisp non finisce qui: molti compilatori di Lisp hanno una fase esplicita di lettura-macro, in cui i modelli speciali nel codice sorgente vengono trasformati in espressioni S. Ciò consente agli autori di lingue di offrire una sintassi adatta ai programmatori. La cosa importante da notare è che poiché qualsiasi cosa rappresentata con questi letterali speciali può essere rappresentata anche nelle espressioni S, nessuno dei benefici dell'omoiconicità è perso.
tvachon,

3

Le espressioni S sono una rappresentazione testuale per i dati. Numeri, simboli, celle, elenchi, stringhe, ... Common Lisp ha anche rappresentazioni testuali per array, vettori, più tipi di numeri, caratteri, ... Common Lisp fornisce anche un lettore estensibile dall'utente, in modo che l'utente possa aggiungere più rappresentazioni testuali per tipi di dati. A volte questo meccanismo viene anche usato per alterare la sintassi del linguaggio di programmazione Lisp (ad esempio per supportare espressioni infix o dichiarazioni da altri linguaggi di programmazione).

Pertanto, se un dialetto Lisp offre rappresentazioni testuali per tipi di dati aggiuntivi, questo si adatta bene all'idea delle espressioni-s.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.