2009-07-22 13 views

risposta

2

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?)

+3

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) ...)) –

+2

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. –

15

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.

+1

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. –

+0

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

+1

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

1

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.

+0

" 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

Problemi correlati