In Scheme, abbiamo appena definito per tutte le definizioni, perché Clojure e Lisp utilizzano parole chiave diverse per dichiarazioni diverse?Qual è la logica alla base dell'uso di def e defn invece di definire solo?
risposta
Definiscono diversi tipi di oggetti (funzioni, variabili speciali, macro, strutture, classi, funzioni generiche, metodi, pacchetti). In Common Lisp, sono anche in spazi dei nomi diversi. forme di definizione diversi hanno anche sintassi diversa (Schema di define
combina definizione della variabile e la funzione. Ma può definire una classe?)
defn
, defmacro
, defstruct
e tali sono solo le macro per definire la loro struttura corrispondente, rendendo inutile scrivere boilerplate codice. Ad esempio, defn
rende più facile scrivere funzioni dal momento che non è più necessario preoccuparsi di mettere nel termine lambda (che si può fare nello Schema semplicemente parentesi gli argomenti immediatamente dopo il nome in fase di definizione):
Schema:
(define hello
(lambda (name)
(display (string-append "hello, " name))))
(define (hello name)
(display (string-append "hello, " name)))
Clojure:
(def hello
(fn [name]
(println (str "hello, " name))))
(defn hello [name]
(println (str "hello, " name)))
potete guardare defn
come un dispositivo per mnemomic def
+ fn
. Tali scorciatoie rendono meno codice di programmazione e rendono il codice più semplice da leggere in generale. Sto insegnando a qualcuno come programmare Scheme al momento e faccio in modo che usino le forme lunghe in modo che abbiano sempre in mente ciò che la lingua sta facendo (e apprezzeranno i macro di risparmio di lavoro tanto più quando alla fine inizieranno usandoli).
I moduli define
o def
danno un nome all'espressione che segue. Il modulo lambda
o fn
fornisce il nome un set di associazioni quando utilizzato all'interno di un'espressione define
o def
. È qui che le cose iniziano a diventare più complesse e l'uso di moduli macro ti mantiene sano e ti protegge dal digitare la noia.
Il tuo schema è sbagliato lì - sia il nome della funzione che l'argomento dovrebbero essere tra parentesi. Inoltre, la tua spiegazione è solo una piccola parte dell'intera immagine.La versione "zuccherata" delle definizioni di Scheme è * non * solo per evitare il codice boilerplate - è più facile da usare (specialmente per i principianti) poiché la cosa che viene definita * assomiglia * ai suoi usi. In altre parole, definisci qualcosa che assomiglia a un modello simbolico per usi futuri della funzione. –
Hai ragione. Cercando di mantenere troppe diverse lisps in testa in una volta. Lo schema è la strana frase su quel particolare bit di zuccheraggio, e dal momento che non ho usato molto Scheme e ho evitato la forma zuccherata quando lo faccio, l'ho soffiato. Corretto. – Pinochle
Non avevo notato il piccolo trucco cognitivo che veniva interpretato dalla forma zuccherata, quell'uso pre-echeggiante futuro della funzione in un'espressione s, ordinata. Non l'avevo notato, almeno non coscientemente. Qualcosa mi ha sempre infastidito per quella forma, e ora so di cosa si tratta. Il trucco dell'innesco dipende dal fatto che il cervello capisca la sintassi di 'define' per avere liberamente qualcosa a che fare con un'espressione s piuttosto che dare un valore a un nome (un atomo). Immagino che quella "imprecisione semantica" inconsciamente annotata mi abbia messo a disagio. – Pinochle
def
in Clojure è una forma speciale ed è bello mantenere le forme speciali il più semplici e primitive possibile. defn
è una macro che aggiunge zucchero per impostare facilmente docstring e metadati e (come altri hanno detto) rimuove la necessità di parens estranei. defn
imposta automaticamente anche alcuni metadati sulla propria funzione (mostrando arglist ecc.) Che non ha senso per un generale def
.
Le funzioni sono di gran lunga la cosa più comune che si sta definendo in Clojure. Le variabili mutabili di tipo Toplevel sono scoraggiate. Quindi ha senso avere un modo facile e veloce per definire una funzione di livello superiore. L'utilizzo di def
per tutto ciò comporterebbe un elevato numero di piastre. Se non ci fosse il numero defn
, lo reinventeremmo noi stessi per evitare di essere infastiditi dalla morte.
" defn è una macro che aggiunge zucchero per facilmente impostazione di docstring e metadata ": Ma anche le variabili potrebbero trarre vantaggio da tali caratteristiche.Questo argomento sarebbe valido solo se l'argomento fosse defn che dovrebbe comportarsi come def." def per ogni cosa risulterebbe in un grande numero di combinazioni. ": Potresti per favore elaborare su questo segue? Schema codice, come Eli ha sottolineato utilizzare define per denominare variabili, funzioni e classi ... senza alcun boilerplate. – kanak
- 1. Qual è la logica alla base di boost :: none_t?
- 2. Qual è la logica alla base del modo Qt di classificare le classi?
- 3. Logica alla base std :: bool_constant
- 4. Qual è la logica alla base della rimozione di crt0.o da gcc4.7.x?
- 5. Qual è la logica dietro l'algoritmo di divisione di Fourier?
- 6. Qual è la logica alla base degli oggetti associati in Scala?
- 7. Definizione della funzione dei built-in Clojure: def vs defn
- 8. Qual è la differenza tra def e defonce in Clojure?
- 9. Qual è la logica alla base del comportamento di tipo "pretty-printing" dei contenuti misti di XmlDocument?
- 10. Qual è la differenza tra defdelegate e def con funzione modulo di chiamata direttamente in Elixir
- 11. Qual è la logica dietro typedef vs struct/union/enum, non potrebbe esserci un solo namespace?
- 12. Qual è il concetto alla base di "Handle Pinned GC"?
- 13. Qual è la logica di questo comportamento indefinito?
- 14. Qual è la ragione alla base della differenza nei risultati?
- 15. Qual è la logica di mettere @interface nel file .m?
- 16. Qual è la logica di un iteratore fail-safe?
- 17. DEF o val per definire la funzione a Scala
- 18. Cosa significano `def + @` e `def - @`?
- 19. Qual è il concetto alla base di R.java?
- 20. Qual è stato il ragionamento alla base di ClojureScript che non richiede la defstruzione di Clojure?
- 21. Qual è la differenza tra definire e richiedere in RequireJS?
- 22. Perché definire una macro solo se non è già definita?
- 23. Logica per la ricerca di Koenig
- 24. Clojure, defn, defn-, pubblico/privato, il default
- 25. Differenze tra def up e def change nel file di migrazione
- 26. Qual è la logica dietro l'affermazione "PHP non scala (bene)"?
- 27. Qual è la logica dietro il contesto zeroMQ?
- 28. Elixir: logica alla base della possibilità di legare nuovamente le variabili
- 29. Qual è la logica dietro l'intestazione della data HTTP?
- 30. Perché sovraccaricare true e false invece di definire l'operatore bool?
Lo schema non ha classi. E 'define' definisce solo le variabili - 'lambda' definisce le funzioni. (define (a b c) ...) è equivalente a (define a (lambda (b c) ...)) –
In Scheme, 'lambda' non * definisce * una funzione, ne crea solo una. 'define' è usato per le definizioni * all *. E sì, "Scheme" non ha classi, ma praticamente in tutti i sistemi di classe Scheme (e quasi tutte le implementazioni hanno un sistema OO) 'define' è usato anche per definire le classi, succede solo che l'espressione usata nel la definizione valuta una classe. –