Domanda

Il mio professore ci ha detto che potremmo scegliere un linguaggio di programmazione per il nostro prossimo incarico di programmazione. Volevo provare un linguaggio funzionale, quindi ho pensato di provare il clojure. Il problema è che capisco la sintassi e comprendo i concetti di base, ma ho problemi a ottenere tutto su " click " nella mia testa. Qualcuno ha qualche consiglio? O forse sto scegliendo la lingua sbagliata con cui iniziare la programmazione funzionale?

È stato utile?

Soluzione

È un po 'come andare in bicicletta, ci vuole solo pratica. Prova a risolvere alcuni problemi con questo, forse ProjectEuler e alla fine farà clic.

Qualcuno ha menzionato il libro "The Little Schemer" e questa è una lettura abbastanza buona. Sebbene sia mirato a Scheme, vale la pena risolvere i problemi reali.

Buona fortuna!

Altri suggerimenti

Beh, per me, ho riscontrato lo stesso problema che hai avuto all'inizio quando ho iniziato a fare OCAML, ma il trucco è che devi iniziare a pensare a cosa vuoi dal codice e < em> non come farlo !!!

Ad esempio, per calcolare il quadrato degli elementi dell'elenco, dimentica la lunghezza dell'elenco e tali trucchi, basta pensare matematicamente in questo modo:

  • se l'elenco è vuoto - > Ho finito

  • in caso contrario, l'elenco deve avere testa e coda - > calcoli il quadrato della testa, quindi chiedi alla tua funzione di fare lo stesso con la coda.

Basti pensare al caso generale e a quello di base e che stai emettendo dati e non modificandoli (a meno che tu non voglia modificarli;)).

Buona fortuna!

Puoi dare un'occhiata a The Little Schemer .

Che ne dici di questo: http://www.defmacro.org/ramblings/lisp.html

È un'introduzione molto semplice e passo-passo al pensiero in lisp dal punto di vista di un programmatore imperativo regolare (Java, C #, ecc.).

A scopo educativo, consiglierei lo schema PLT. È un ambiente portatile e potente con ottimi esempi e una documentazione ancora migliore. Ti aiuterà a scoprire i pensieri dietro la programmazione funzionale passo dopo passo e in modo molto pulito. Scegliere una piccola applicazione da implementare ti aiuterà ad imparare la nuova lingua.

http://www.plt-scheme.org/

Inoltre "struttura e interpretazione dei programmi per computer" di H. Abelssn, G. Sussman e J. Sussman è un ottimo libro per quanto riguarda Scheme (e programmazione).

Saluti

mue

Dai un'occhiata a 99 problemi di Lispy

Alcuni pensieri su Lisps, non specifici di Clojure (non sono un esperto di Lisp, quindi spero siano per lo più corretti e utili):

Codifica in AST

So poco della teoria del compilatore o dell'interprete, ma ogni volta che scrivo un codice in Lisp, mi stupisco che mi sembra di costruire direttamente un AST.

Fa parte di ciò che " code = data " significa, la codifica in Lisp è molto simile al riempimento di strutture di dati (elenchi nidificati) con nodi AST. Incredibile, ed è anche facile da leggere (con il giusto editor di testo).

Un linguaggio di programmazione programmabile

Quindi i blocchi di codice sono solo elenchi nidificati e le operazioni sugli elenchi fanno parte della lingua. Quindi puoi facilmente scrivere il codice Lisp che genera il codice Lisp (vedi macro Lisp). Questo rende Lisp un linguaggio di programmazione programmabile (in sé!).

Questo rende la costruzione di un DSL o di un interprete in Lisp è molto semplice (vedi anche valutazione meta-circolare ).

Non riavviare mai nulla

E nella maggior parte dei sistemi Lisp, il codice (compresa la documentazione) può essere introspetto e scambiato a caldo in fase di esecuzione.

OOP avanzato

Quindi, la maggior parte dei sistemi Lisp ha una sorta di Object System derivato da CLOS, che è un avanzato (rispetto a molte implementazioni OOP) e configurabile Object System (vedi The Art of the Metaobject Protocol ).

Tutte queste funzionalità sono state inventate molto tempo fa, ma non sono sicuro che siano disponibili in molti altri linguaggi di programmazione (anche se la maggior parte sta recuperando, ad esempio con le chiusure), quindi devi "riscoprire" e abituarsi a questi esercitandosi (vedere i libri in altre risposte).

Ricorda: sono tutti dati!

Scrivi alcune semplici funzioni classiche in cui Lisp è bravo, come

  • inverti un elenco

  • indica se un atomo si trova da qualche parte in un'espressione s

  • scrivi EQUAL per dire se 2 s-espressioni sono uguali

  • scrivi FRINGE per ottenere l'elenco degli atomi ai margini di un'espressione s

  • scrivi SUBST, quindi scrivi SUBLIS

  • Differenziazione simbolica

  • Semplificazione algebrica

  • scrivi un semplice EVAL e / o APPLY

Comprendi che Lisp è utile per questo tipo di programmi funzionali senza effetti collaterali.

È anche utile per programmi con effetti collaterali (non funzionali) con stato, ma quelli sono più simili a "programmi". di " funzioni " ;.

Quale è meglio per una determinata applicazione dipende dall'applicazione. In generale, dovrebbe contenere non meno e non più informazioni sullo stato del necessario.

Facile!

  

M-x & nbsp; lisp-mode

OK, OK, quindi potresti non avere Emacs per un cervello. In tutta serietà, quello che devi fare è diventare davvero bravo nella ricorsione. Questo può inizialmente essere una distorsione del cervello quando si cerca di estendere il concetto di ricorsione oltre gli esempi canonici, ma alla fine si tradurrà in un codice più fluido e fluido.

Inoltre, molte persone restano bloccate dalla parentesi e non so davvero perché: la sintassi è molto semplice e coerente e può essere padroneggiata in pochi minuti. Per me, sono arrivato a Scheme dopo aver appreso C ++ e Java e ho sempre pensato che la differenza tra "funzioni" e "operatori" era una falsa dicotomia ed è stato piacevole vedere eliminata questa distinzione.

Per quanto riguarda la programmazione funzionale, finché puoi avvolgere la testa sul fatto che una funzione è un valore di prima classe e può essere passata dentro e fuori da altre funzioni, dovresti andare bene. L'utilità di questo diventerà chiara nel tempo, ma è sufficiente che tu possa scrivere funzioni che assumono e restituiscono funzioni.

Infine, non sono sicuro del supporto di Clojure per le macro, ma sono considerati una parte essenziale di lisp. Tuttavia, non mi preoccuperei di impararli fino a quando non avrai familiarità con gli elementi di cui sopra - anche se le macro sono incredibilmente utili e versatili, vengono anche utilizzate meno spesso delle altre tecniche che ho citato.

Comincerei con una lingua che può essere interpretata. Ho trovato Moscow ML essere abbastanza semplice. È un'implementazione leggera di Standard ML.

La mia pratica personale è quella di trovare un piccolo progetto (qualcosa che potrebbe richiedere 3-5 notti di hacking) e implementarlo. Che ne dici di uno strumento filtro blog? Forse solo un'implementazione di Towers of Hanoi o Linked List (di solito sono progetti di una notte).

Il modo in cui di solito funziona è che lo implemento male la prima volta, butto via quello che avevo e alla fine scatta qualche ora.

Un aiuto ENORME sta seguendo un corso in qualcosa come ... um ... LISP! :) I compiti ti costringeranno a confrontarti con molti concetti e mi è scattato molto prima che finisse il semestre.

Buona fortuna !!

Buona fortuna. Mi ci è voluto fino a circa la metà del "Linguaggi di programmazione" corso al college prima dello Schema "cliccato". Una volta che è successo, però, tutto ha avuto un senso e mi sono innamorato della programmazione funzionale.

Scrivi un interprete Lisp in Lisp.

Se non hai alrady, leggi cosa rende lisp un linguaggio unico. Se non lo fai prima, proverai a fare le stesse cose che potresti fare in alcuni altri linguaggi di programmazione.

Quindi prova a implementare qualche piccola cosa (prova a renderti utile o potresti non avere la motivazione).

Lisp in a box è un ottimo modo per bagnarti i piedi.

Per me l'importante è assicurarmi di fare tutto in modo "lisp-y". Non essere tentato di pensare "In Java qui userei un ciclo for, come posso fare per i loop in Lisp?" ma per esaminare abbastanza esempi ed esercitazioni (come qualcuno ha sottolineato, SICP è perfetto per questo) che puoi iniziare a individuare quando il codice appare "Lisp-y" e riconoscere i paradigmi del linguaggio comune.

Sicuramente conosco la sensazione di guardare un codice che ho appena scritto e di sapere intuitivamente che è correttamente idiomatico per quel linguaggio e quella piattaforma / framework - che, penso, è quando "scatta".

Modifica : e complimenti per aver scelto un linguaggio funzionale, gli studenti minori lo avrebbero appena fatto in Java :)

Chi ha detto che farà clic? Sono sempre confuso

Ma se pensi a quanta astrazione è possibile nascondere, dietro macro lisp. Quindi il tuo cervello esploderà.

:)

Darei un'occhiata a Programming Clojure. È un ottimo libro per non lispers.

Oltre a ciò che altri SO hanno già suggerito, ecco i miei 2 centesimi:

  1. Inizia ad imparare la lingua e prova alcuni semplici problemi numerici / hobby nella lingua
  2. IMPORTANTE: pubblica la soluzione / codice su StackOverflow, chiedendo l'opinione della gente se questo è davvero il modo LISPy per farlo.

Buona fortuna!

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top