2012-07-19 14 views
5

Sto discutendo della chiusura con un amico e lui pensa che (partial + 5) sia una chiusura. Ma penso che una chiusura è una chiusura funzione in una variabile libera, per esempioquesta funzione parziale è una chiusura?

(let [a 10] 
    (defn func1 [x] (+ x a)) 
) 

poi func1 è una chiusura. Ma in questo caso 5 non è una variabile libera. Quindi qual è la risposta giusta?

+0

Mentre la risposta accettata è corretta in termini di implementazione, direi che non dovrebbe essere considerata una chiusura, ma piuttosto "solo" un'applicazione parziale. L'uso di una chiusura è un dettaglio di implementazione interna che non è direttamente esposto al chiamante. – user2864740

risposta

7

partial utilizza una chiusura per eseguire la funzione parziale. Controlla il codice partial usando (source partial) in repl e vedrai che usa chiusure.

(defn partial 
    "Takes a function f and fewer than the normal arguments to f, and 
    returns a fn that takes a variable number of additional args. When 
    called, the returned function calls f with args + additional args." 
    {:added "1.0"} 
    ([f arg1] 
    (fn [& args] (apply f arg1 args))) 
    ([f arg1 arg2] 
    (fn [& args] (apply f arg1 arg2 args))) 
    ([f arg1 arg2 arg3] 
    (fn [& args] (apply f arg1 arg2 arg3 args))) 
    ([f arg1 arg2 arg3 & more] 
    (fn [& args] (apply f arg1 arg2 arg3 (concat more args))))) 
+0

Perché è scritto così? Sto imparando proprio adesso e [f arg1] sembra ridondante poiché c'è un'implementazione "varargs" (quella con & more) – themistoklik

+0

Una scommessa sicura sarebbe che sta ottimizzando i casi più comuni – Sushisource

0

(partial + 5) è una funzione anonima o "lambda".

Le funzioni anonime sono spesso chiamate "chiusure" ma è un abuso del termine; vedere la discussione in "What is the difference between a 'closure' and a 'lambda'?"


[¹] Forse perché in lingue più popolari che li supportano, chiusure e funzioni anonime vengono creati utilizzando le stesse funzionalità del linguaggio - che li rende indistinguibili a prima vista.

Problemi correlati