Il set Clojure e la sintassi delle mappe possono essere aggiunti ad altri dialetti Lisp?

5

Oltre a creare un elenco usando parentesi, Clojure consente di creare vettori usando [], mappe usando {} e imposta utilizzando # {}.

Il Lisp viene sempre definito come un linguaggio molto estensibile in cui è possibile creare facilmente DSL ecc. Ma Lisp è così estensibile che puoi prendere qualsiasi dialetto Lisp e aggiungere relativamente facilmente il supporto per i vettori, le mappe e i set di Clojure (che sono tutti funzioni in Clojure)?

Non sto necessariamente chiedendo che contro o simili funzionino effettivamente su queste funzioni: cosa vorrei sapere se l'altro potrebbe essere modificato in modo che il codice sorgente assomigli alla fonte di Clojure codice (ovvero: utilizzando la corrispondenza [], {} e # {} oltre a ()).

Nota che se non può essere fatto questa non è una critica di Lisp: quello che mi piacerebbe sapere è, tecnicamente, cosa dovrebbe essere fatto o cosa non può essere fatto se si dovesse aggiungere una cosa del genere.

    
posta Cedric Martin 03.07.2012 - 14:35
fonte

2 risposte

7

Sì, possono essere aggiunti. È qualcosa che puoi fare usando le macro del lettore. C'è già #(…) per i vettori, ma puoi definire la tua [...] macro:

(set-macro-character #\] (get-macro-character #\)))
(set-macro-character #\[ (lambda (stream char)
                   (declare (ignore char))
                   '',(apply #'vector (read-delimited-list #\] stream t))))

CL-USER> [1 2 3]
#(1 2 3)
CL-USER> (aref [1 2 3] 0)
1
CL-USER> 

Guarda closer-apl per altri esempi più utili.

    
risposta data 03.07.2012 - 19:31
fonte
2

Risposta banale: sì, puoi farlo per qualsiasi dialetto Lisp estendendo l'implementazione per fornire più funzionalità. (Non penso che questo sia ciò che intendi)

Risposta pratica: no, non puoi farlo in "qualsiasi dialetto Lisp" , anche se puoi farlo in alcuni. Tutte le implementazioni di Lisp sono diverse: hanno punti di forza, punti deboli e modi diversi in cui possono essere estesi. Alcuni potrebbero essere supponenti e non consentire tali estensioni di sintassi quando potrebbero essere utilizzate le normali funzioni vector , map e set insieme alle parentesi. Altri potrebbero non permetterlo perché è un'altra caratteristica, che deve essere progettata, specificata, implementata e testata - tutto ciò aumenta il carico di lavoro sugli implementatori.

Se hai in mente un Lisp specifico, dovresti controllare se quel dialetto permette una cosa del genere, ma non mi aspetto che qualsiasi codice Lisp più complicato di (+ 1 2) per essere portabile a tutti implementazioni.

    
risposta data 03.07.2012 - 15:33
fonte

Leggi altre domande sui tag