Cosa c'è di così bello in Clojure? [chiuso]


40

Ho dato un'occhiata a Clojure di recente e mi sono imbattuto in questo post su Stackoverflow che indica alcuni progetti che seguono le migliori pratiche e un buon codice Clojure nel complesso. Volevo capire meglio la lingua dopo aver letto alcuni tutorial di base, quindi ho dato un'occhiata ad alcuni progetti "reali".

Dopo aver esaminato ClojureScript e Compojure (due dei progetti "buoni" di cui sopra), sento che Clojure è uno scherzo. Non capisco perché qualcuno scelga Clojure per dire, Ruby o Python, due lingue che amo e hanno una sintassi così pulita e sono molto facili da imparare mentre Clojure usa così tante parentesi e simboli ovunque da rovinare la leggibilità per me.

Penso che Ruby e Python siano belli, leggibili ed eleganti. Sono facili da leggere anche per qualcuno che non conosce a fondo la lingua. Tuttavia, Clojure è opaco per me e mi sento come se dovessi conoscere ogni minimo dettaglio sull'implementazione del linguaggio per essere in grado di comprendere qualsiasi codice.

Quindi, per favore, illuminami!

  • Cosa c'è di così buono in Clojure?
  • Qual è il minimo assoluto che dovrei sapere sulla lingua per apprezzarla?

14
I don't understand why someone would pick Clojure over say, Ruby or Python- funziona su jvm e può usare l'intera libreria java. ... have such a clean syntaxprobabilmente, i linguaggi funzionali come lisp hanno una sintassi e una struttura molto pulite, è solo uno a cui la maggior parte delle persone non è abituata.

22
Il suo nome è sexy.
programmatore

4
Ogni adolescente che vive in un seminterrato può raccogliere Python e Ruby nel giro di pochi mesi. Se questo è tutto ciò che vorranno usare, non usciranno mai dal seminterrato. Non sto dicendo che qualcuno che ha fatto lo sviluppo professionale di Python per molti anni sia un mortale minore rispetto a qualcuno che scrive C incorporato, ma se Python e Ruby sono tutto ciò che sanno e tutto ciò che vorranno sapere, allora qualcosa è sospetto. A proposito, mi ci sono voluti personalmente più di 6 anni dopo la laurea per scoprire e apprezzare la programmazione funzionale e Lisps. La mia prima reazione a Scheme fu un sussulto.
Giobbe

4
"Probabilmente, lisp come i linguaggi funzionali hanno una sintassi e una struttura molto pulite, è solo uno a cui la maggior parte delle persone non è abituata.": Ho poca esperienza con Lisp e ho appena iniziato a leggere il libro "Practical Common Lisp". Finora non ho riscontrato problemi con la sintassi; IMHO i miti sulla sintassi simile a Lisp che sono meno leggibili sono solo FUD.
Giorgio,

4
Ho iniziato a guardare Clojure di recente (ma ho una precedente esperienza con Haskell e Scala, quindi la sintassi non è un tale shock). L'ho trovato sorprendentemente leggibile. Esistono molti fewsimboli al di fuori della parentesi rispetto a molte lingue e quasi nessuna parola riservata. Il motivo per cui lo trovi illeggibile è perché è un paradigma totalmente nuovo e funziona in un modo fondamentalmente diverso rispetto a un tipico linguaggio orientato agli oggetti. Dagli un po 'di tempo e potenza.
KChaloux,

Risposte:


47

Per lo sfondo che hai dato, se posso parafrasare:

  1. Hai familiarità con Ruby / Python.
  2. Non vedi ancora i vantaggi di Clojure.
  3. Non trovi chiara la sintassi di Lisp o Clojure.

... Penso che la migliore risposta sia leggere il libro Clojure Programming di Emerick, Carper e Grand. Il libro ha numerosi confronti espliciti di codice con Python, Ruby e Java e ha spiegazioni testuali indirizzate ai programmatori di quelle lingue. Personalmente, sono venuto a Clojure dopo aver costruito progetti di buone dimensioni con Python e avendo avuto qualche esperienza con Lisp; la lettura di quel libro mi ha aiutato a convincermi ad iniziare a usare Clojure non solo in progetti secondari ma per scopi professionali.

Per rispondere direttamente alle tue due domande:

  1. Cosa c'è di così buono in Clojure? Molte risposte su questo sito e altrove, ad es. Vedi https://www.quora.com/Why-would-someone-learn-Clojure
  2. Qual è il minimo assoluto che dovrei sapere sulla lingua per apprezzarla? Io suggerirei di conoscere le grandi idee che stanno dietro il progetto di Clojure, come articolato sia nella programmazione Clojure e Gioia di Clojure libri-saggio, e nei colloqui di Rich Hickey, esp. il discorso Simple Made Easy . Una volta che sai cosa / perché puoi quindi iniziare a capire come leggere il codice Clojure, esp. come cambiare il tuo modo di pensare da classi, oggetti, stato / mutazione a "solo funzioni e dati" (funzioni di ordine superiore, mappe / insiemi / sequenze, tipi).

Ulteriori suggerimenti: l'eleganza e il potere di Lisp derivano in parte dalla sua sintassi minimalista e assolutamente coerente. È molto più facile apprezzarlo con un buon editor, ad esempio Emacs con modalità clojure e ParEdit. Man mano che acquisisci familiarità con esso, la sintassi svanisce e "vedrai" semantica, intenzioni e astrazioni concise. In secondo luogo, non iniziare leggendo la fonte per ClojureScript o Compojure, quelli sono troppo alla volta; prova alcuni problemi di 4clojure.org e confronta le soluzioni con i migliori programmatori. Se vedi 4-6 altre soluzioni, invariabilmente qualcuno avrà scritto una soluzione in stile FP veramente idiomatica, concisa, che puoi confrontare con una soluzione di stile imperativo goffa, verbosa e inutilmente complicata.


20

I dialetti Lisp hanno una nicchia unica per la loro semplice sintassi. Questa semplice sintassi rende molto semplice la meta-programmazione mediante l'uso di macro. Ciò consente di modellare la lingua in base al dominio del problema anziché modellare per adattare il dominio del problema alla propria lingua. È davvero fantastico una volta che ci si capisce intorno e ti consente di fare facilmente molte cose che è molto difficile in altre lingue.

Il rovescio della medaglia, è che poiché ogni programma Lisp essenzialmente definisce la propria lingua, hai davvero bisogno di una solida conoscenza delle cose per capire cosa sta succedendo.

Ora, per rispondere alle tue domande ...

  1. Clojure è un moderno dialetto Lisp che funziona nella JVM / CLR. Ciò semplifica l'utilizzo della potenza di Lisp in un'infrastruttura esistente.

  2. È essenziale capire come utilizzare le macro per creare Lisp nel dominio del problema per apprezzarne l'utilizzo. L'ho capito davvero solo dopo aver implementato un runtime Lisp, quando ho scoperto che gran parte delle funzionalità del linguaggio di base possono essere facilmente implementate in Lisp stesso. Ci vuole un progetto di dimensioni adeguate per ottenere questo.

I suoi vantaggi a parte, anche se è divertente programmare, personalmente non ho molti casi in cui mi rivolgerei ad esso per problemi quotidiani. È un ottimo strumento per apprendere l'espansione della mente e, dopo aver appreso correttamente Lisp, è diventato molto più naturale trarre vantaggio dalle strutture di meta-programmazione in altre lingue.

La semplice sintassi facilita l'interpretazione dei computer (consentendo macro così facili e potenti), ma rende molto difficile per un essere umano analizzare rapidamente espressioni complesse.


2
Hai visto il tavolo luminoso ?

4
La tua risposta sembra che le macro siano il modo normale di avvicinarsi alla programmazione Lisp, quando in realtà la maggior parte dei problemi di programmazione può essere risolta con normali funzioni di prima classe. Le macro devono essere utilizzate principalmente per la programmazione linguistica (ovvero l'estensione della lingua). Vedi anche bookshelf.jp/texi/onlisp/onlisp_9.html
Robert Harvey,

3
@RobertHarvey Direi che se non stai approfittando di Marcos, allora ci sono una miriade di altre lingue a cui vorrei rivolgermi per offrire funzioni di prima classe con una sintassi molto più leggibile.
bunglestink,

@MichaelT che sembra pulito. Mi piace il concetto.
DPM,

3
@RobertHarvey Scala, JavaScript, C #, Python e Haskell sono tutti in cima alla mia testa per quanto riguarda le lingue con funzioni di prima classe che considererei più sintassi analizzabili dall'uomo che Lisps.
bunglestink,

10

I punti di forza di Clojure sono stati evidenziati molte volte e, sicuramente, rendono un linguaggio molto potente, quindi non li ripeterò più qui.

Ho sempre amato lisp, sin dai tempi dell'università e mi sono davvero emozionato quando ho scoperto Clojure (forse la possibilità di usare finalmente lisp fuori dal mondo accademico!). Tuttavia, quando ho iniziato a imparare, una sensazione spiacevole ha iniziato a insinuarsi, anche se non riesco a individuare esattamente cosa non mi piace. Prima di tutto direi che scrivere codice in Common LISP è stato facile e divertente per me, ma Clojure ha una curva di apprendimento più ripida. Clisp aveva una certa bellezza ed eleganza. Non sono sicuro che avrò la stessa sensazione da Clojure. Mi chiedo se quella sensazione sparirà man mano che avrò più esperienza.

Ho un'altra ipotesi per la mia misteriosa leggera repulsione. Penso che potrebbe essere la sua grande flessibilità. Ad esempio puoi avere strutture che sono metà vettoriale e metà mappa e con pochi caratteri di codice puoi accettarle come parametri, smontarle ed elaborarle correttamente. Sì, rimuove tutta la piastra della caldaia, ma in qualche modo non sembra giusto. È come se non conoscessi mai molto bene le regole di tutte quelle parentesi, due punti, braket, ecc. Che stanno funzionando.

Per me, adoro ancora il linguaggio per tutti i suoi vantaggi (principalmente, eseguire nella JVM e semplificare la concorrenza, pur essendo molto più potente e conciso rispetto a Java e con difetti di progettazione meno evidenti) ma la giuria è ancora fuori sul fatto se qualcosa avrebbe potuto essere migliorato.

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.