Quali sono le differenze tra Clojure, Scheme / Racket e Common Lisp?


120

So che sono dialetti della stessa famiglia linguistica chiamata lisp, ma quali sono esattamente le differenze? Potresti fornire una panoramica, se possibile, su argomenti come sintassi, caratteristiche, funzionalità e risorse.


3
Chiedo una panoramica più generale delle differenze perché mi è sembrato che questa domanda possa essere utile per molte altre persone, scusate se suona offensiva.
MaiaVictor

4
Mi confondo sempre su quale post debba andare e dove. Questa è una discussione sugli strumenti, quindi è una domanda per qui o per i programmatori? Logicamente, direi di spostarlo ai programmatori, perché non sta chiedendo di risolvere un problema particolare, ma è un buon post con una buona risposta IMHO.
octopusgrabbus

1
@octopusgrabbus: la domanda è troppo ampia. Il confronto di tre linguaggi di programmazione su "sintassi, caratteristiche, funzioni e risorse" può facilmente riempire un libro o un sito web. Stackoverflow è per le persone che hanno problemi di programmazione, non è un'enciclopedia (Wikipedia), non è un forum di discussione generale (Usenet), non è un sito di confronto linguistico ( rosettacode.org ). È meglio per problemi di programmazione reali in cui la domanda ha un codice e anche le risposte hanno un codice. Inoltre: non risolvere i problemi solo perché qualcuno è annoiato o è un hobby.
Rainer Joswig,

3
Solo perché la domanda è ampia non significa che non appartenga qui. È una domanda perfettamente chiara , ed è certamente una "vera domanda di programmazione". StackOverflow è pensato principalmente per essere una risorsa della comunità [googleabile] per condividere le conoscenze sulla programmazione tramite il formato di domande e risposte.
Dan Burton

@ RainerJoswig, potrei scrivere tutto quello che ho imparato su quelle lingue negli ultimi giorni in cui le ho studiate, ma questo renderebbe il filo grande. È davvero brutto quando ti rendi conto che le persone cercheranno su Google quel tipo di frase breve e non saranno in grado di ottenere la risposta perché un testo grande impedisce loro di capire rapidamente ciò che viene chiesto. In questo modo, molte più persone saranno aiutate da una buona risposta.
MaiaVictor

Risposte:


103

Hanno tutti molto in comune:

  • Linguaggi dinamici
  • Fortemente digitato
  • compilato
  • Sintassi in stile Lisp, ovvero il codice è scritto come strutture di dati Lisp (moduli) con il modello più comune costituito da chiamate di funzioni come: (function-name arg1 arg2)
  • Potenti sistemi macro che consentono di trattare il codice come dati e generare codice arbitrario in fase di esecuzione (spesso utilizzato per "estendere il linguaggio" con una nuova sintassi o creare DSL)
  • Spesso utilizzato nello stile di programmazione funzionale, sebbene abbia la capacità di accogliere altri paradigmi
  • Enfasi nello sviluppo interattivo con un REPL (ovvero si sviluppa in modo interattivo in un'istanza in esecuzione del codice)

Caratteristiche distintive comuni del Lisp:

Caratteristiche distintive di Clojure:

  • Il più grande ecosistema di librerie, poiché puoi utilizzare direttamente qualsiasi libreria Java
  • Vettori []e mappe {}usati come standard in aggiunta agli elenchi standard ()- oltre all'utilità generale di vettori e mappe alcuni ritengono che questa sia un'innovazione che rende generalmente più leggibile
  • Maggiore enfasi sull'immutabilità e sulla programmazione funzionale pigra, in qualche modo ispirata da Haskell
  • Forti capacità di concorrenza supportate dalla memoria transazionale del software a livello di lingua (vale la pena guardare: http://www.infoq.com/presentations/Value-Identity-State-Rich-Hickey )

Caratteristiche distintive dello schema:

  • Probabilmente il Lisp più semplice e facile da imparare
  • Macro igieniche (vedi http://en.wikipedia.org/wiki/Hygienic_macro ) - evita elegantemente i problemi con l'acquisizione accidentale di simboli nelle espansioni macro

11
questo va bene, ma forse dovresti menzionare che il racket è più di un "semplice" schema; è un sistema che supporta più lingue (ma correlate) (puoi persino definirne una tua). inoltre, clojure ha vari modi di eseguire la programmazione oo-like (sia un approccio di invio multiplo vagamente simile a clos sia qualcosa di più vicino a java che è più efficiente su jvm). e lo schema si sta avvicinando a librerie più standard (che includono anche oo) con r6rs, supportato da racket.
andrew cooke

2
"Linguaggio dinamico fortemente digitato" è marketing. In questo senso anche Python è fortemente tipizzato.
ron

16
@ron: Python è fortemente tipizzato, proprio come Lisp (a differenza di Javascript o VB). Stai invece pensando alla "digitazione statica" rispetto alla "digitazione dinamica", vedi en.wikipedia.org/wiki/Type_system per tutte le varietà. Ma sì, è marketing
Nas Banov

2
Penso anche che Racket sarebbe buono da aggiungere a questa risposta. Penso che Racket sia ancora più facile da imparare di Scheme grazie alla comunità e al focus della lingua. Racket (precedentemente denominato PLT Scheme) è un linguaggio di programmazione multi-paradigma generico della famiglia Lisp / Scheme. Uno dei suoi obiettivi di progettazione è fungere da piattaforma per la creazione, la progettazione e l'implementazione del linguaggio.
mtelesha

Clojure ha macro igieniche. Maggiori informazioni qui: xivilization.net/~marek/blog/2013/09/17/…
Christopher Kuttruff

50

Le persone sopra hanno perso alcune cose

  1. Common Lisp ha anche vettori e tabelle hash. La differenza è che Common Lisp usa # () per i vettori e nessuna sintassi per le tabelle hash. Lo schema ha vettori, credo

  2. Common Lisp ha macro di lettura, che ti permettono di usare nuove parentesi (come fa Racket, un discendente di Scheme).

  3. Scheme e Clojure hanno macro igieniche, a differenza di quelle antigieniche Common Lisp

  4. Tutte le lingue sono moderne o hanno ampi progetti di ristrutturazione. Common Lisp ha ottenuto vaste librerie negli ultimi cinque anni (grazie soprattutto a Quicklisp), Scheme ha alcune implementazioni moderne (Racket, Chicken, Chez Scheme, ecc.) E Clojure è stato creato relativamente di recente

  5. Common Lisp ha un sistema OO integrato, sebbene sia abbastanza diverso dagli altri sistemi OO che potresti aver usato. In particolare, non viene applicato: non è necessario scrivere codice OO.

  6. Le lingue hanno filosofie di progettazione un po 'diverse. Scheme è stato concepito come un dialetto minimo per la comprensione del modello attore; successivamente è stato utilizzato per la pedagogia. Common Lisp è stato progettato per unificare la miriade di dialetti Lisp che erano sorti. Clojure è stato progettato per la concorrenza. Di conseguenza, Scheme ha la reputazione di essere minimale ed elegante, Common Lisp di essere potente e paradigma-agnostico (funzionale, OO, qualunque cosa) e Clojure di favorire la programmazione funzionale.


4
Racket non è un'implementazione di Scheme, salvo modalità di compatibilità. Vedi stackoverflow.com/questions/3345397
bug

Clojure non ha macro igieniche, come ho trovato nel modo più duro.
pyon

40

Non dimenticare le differenze tra Lisp-1 e Lisp-2.

Scheme e Clojure sono Lisp-1:
Ciò significa che sia i nomi delle variabili che quelli delle funzioni risiedono nello stesso spazio dei nomi.

Common Lisp è Lisp-2:
funzione e variabili hanno spazi dei nomi diversi (infatti, CL ha molti spazi dei nomi).


-4

Gimp è scritto in Scheme :)

In effetti, la quantità di software che alcune persone pensano potrebbe essere scritta in C ++ è stata probabilmente fatta sotto l'ombrello Lisp, è difficile scegliere le mele d'oro dal mazzo. Il fatto è che il C ++ non è sempre stato popolare, sembra essere popolare solo oggi a causa di una cronologia di aggiornamenti. Per la metà minore del secolo il C ++ non utilizzava nemmeno il multithreading, era dove Python è oggi un pozzo nero di inutile codice colla buggy non testato. Più veloce un po 'e ora stiamo assistendo a un aumento della programmazione funzionale, è più come adattarsi o morire. Penso che Java abbia ragione per quanto riguarda la parte di adattamento.

Scheme è stato progettato per semplificare il linguaggio Lisp, questo era il suo unico intento tranne che non ha mai preso piede. Penso che Clojure faccia qualcosa di simile, inteso a semplificare nient'altro che Scheme per la JVM. È proprio come ogni altro linguaggio JVM solo per aumentare l'esperienza dell'utente, solo per semplificare la scrittura del boilerplate in Java.


2
"significava semplificare niente di più Scheme per la JVM" "proprio come ogni altro linguaggio JVM" Sì, giusto.
oskarkv

4
Gimp è scritto in C e supporta Scheme, Python e Perl come linguaggi di scripting.
lbalazscs
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.