Dopo alcuni mesi di conoscenza e di gioco con Lisp, sia CL che un po 'di Clojure, non vedo ancora un motivo convincente per scrivere qualcosa al suo posto invece di C #.
Vorrei davvero alcuni motivi convincenti, o per qualcuno sottolineare che mi manca qualcosa di veramente grande .
I punti di forza di Lisp (secondo la mia ricerca):
- Notazione compatta ed espressiva - Più che in C #, sì ... ma mi sembra di poter esprimere quelle idee anche in C #.
- Supporto implicito per la programmazione funzionale - C # con metodi di estensione LINQ:
- mapcar = .Select (lambda)
- mapcan = .Select (lambda) .Aggregate ((a, b) => a.Union (b))
- auto / primo =. Primo ()
- cdr / rest = .Skip (1) .... ecc.
- Lambda e supporto di funzioni di ordine superiore - C # ha questo, e la sintassi è probabilmente più semplice:
- "(lambda (x) (body))" versus "x => (body)"
- "# (" con "%", "% 1", "% 2" è utile in Clojure
- Invio di metodi separato dagli oggetti - C # ha questo tramite metodi di estensione
- Invio multimetodo - C # non lo ha in modo nativo, ma potrei implementarlo come una chiamata di funzione in poche ore
- Il codice è dati (e macro) - Forse non ho "ottenuto" le macro, ma non ho visto un singolo esempio in cui l'idea di una macro non potesse essere implementata come funzione; non cambia la "lingua", ma non sono sicuro che sia un punto di forza
- DSL - Può farlo solo attraverso la composizione di funzioni ... ma funziona
- Programmazione "esplorativa" non tipizzata - per le strutture / classi, le autoproperties di C # e l '"oggetto" funzionano abbastanza bene, e puoi facilmente passare a una digitazione più forte man mano che procedi
- Funziona su hardware non Windows - Sì, quindi? Al di fuori del college, ho conosciuto solo una persona che non esegue Windows a casa, o almeno una VM di Windows su * nix / Mac. (Ancora una volta, forse questo è più importante di quanto pensassi e mi sono appena fatto il lavaggio del cervello ...)
- Il REPL per il design dal basso - Ok, lo ammetto è davvero bello e mi manca in C #.
Cose che mi mancano in Lisp (a causa di un mix di C #, .NET, Visual Studio, Resharper):
- Namespace. Anche con metodi statici, mi piace legarli a una "classe" per categorizzare il loro contesto (Clojure sembra avere questo, CL non sembra.)
- Ottima compilazione e supporto in fase di progettazione
- il sistema dei tipi mi permette di determinare la "correttezza" delle strutture dati che passo in giro
- qualsiasi cosa errata viene sottolineata in tempo reale; Non devo aspettare fino al momento dell'esecuzione per sapere
- i miglioramenti del codice (come l'uso di un approccio FP invece di uno imperativo) sono sottoposti a autosuggestione
- Strumenti di sviluppo della GUI: WinForms e WPF (so che Clojure ha accesso alle librerie della GUI Java, ma sono del tutto estranee a me).
- Strumenti di debug della GUI: breakpoint, step-in, step-over, ispettori di valore (testo, xml, personalizzati), orologi, debug-by-thread, breakpoint condizionali, finestra di stack di chiamate con la possibilità di saltare al codice a qualsiasi livello nello stack
- (Per essere onesti, il mio periodo con Emacs + Slime sembrava fornire un po 'di questo, ma sono parziale dell'approccio guidato dalla GUI)
Mi piace molto l'hype che circonda Lisp e gli ho dato una possibilità.
Ma c'è qualcosa che posso fare in Lisp che non posso fare anche in C #? Potrebbe essere un po 'più dettagliato in C #, ma ho anche il completamento automatico.
Cosa mi sto perdendo? Perché dovrei usare Clojure / CL?
AND
o OR
come una funzione. Potrebbe essere fatto (dato LAMBDA
, che è anche una macro) ma non vedo un modo ovvio per farlo che non farebbe assolutamente schifo.