2013-10-31 8 views
5

So vorbei kann ich dies tun:defparameter vs defun für Funktionen rund um

(defparameter *some-function* ... ; returns lambda later

oder dies:

(defun some-function ...

Mit beiden kann ich funcall:

(funcall 'some-function ... oder (funcall *some-function* ...

Mit der defun Version ich dies auch tun können:

(some-function ...

Ich kann das nicht mit der defparameter Funktion.

defparameter bietet eine einfachere Methode für die Neuzuweisung von some-function zu einer anderen Funktion (oder irgendetwas anderem, einschließlich Nichtfunktionsdaten) später.

Aber abgesehen von diesen zwei Punkten, was sind andere Überlegungen, eine über die andere zu verwenden?

+0

Je nachdem, was genau Sie versuchen, grundsätzlich, Sie _may_ möchten auch 'flet' und/oder' labels', die ich finde eine schöne Beschreibung von [hier] (http: //www.gigamonkeys .com/book/the-special-operators.html # Manipulation der lexikalischen Umgebung). – lindes

Antwort

9

Dies ist eine merkwürdige Antwort, da wir Äpfel mit Orangen vergleichen.

Für die neu zu lisp, die das betrachten, defparameter ist zum Definieren einer dynamischen Variable, während defun zum Definieren einer Funktion ist.

Wenn Sie besorgt sind über die Möglichkeit, programmatisch eine Funktion zuweisen, ohne die folgenden defun Besuche:

CL-USER> (defun jam() (print 'some-jam)) 
JAM 

CL-USER> (jam) 
SOME-JAM 

CL-USER> (setf (symbol-function 'jam) (lambda() (print 'some-ham))) 
#<FUNCTION (LAMBDA()) {1004C033DB}> 

CL-USER> (jam) 
SOME-HAM 

So defparameter keinen Vorteil hat, wenn es darum geht, eine Funktion zu Neuzuordnung. Auch wenn Sie die Funktion neu definieren möchten, können Sie in the compile command suchen.

+5

Sie können auch '(setf (fdefinition 'jam) ...)' hier verwenden, und ['fdefinition'] (http://www.lispworks.com/documentation/HyperSpec/Body/f_fdefin.htm) wird funktionieren _all_ Funktionsnamen (einschließlich '(setf ...)' Funktionen, nicht nur Symbole. –

+0

@JoshuaTaylor: Brilliant, wusste ich nicht darüber. Prost (auch gute Punkt etwa lassen) – Baggers

+1

Es gibt immer noch einen Vorteil mit 'Defparameter ' "let" bindet einen neuen Wert und _restore_ automatisch an den alten Wert, ohne dass Sie ihn explizit speichern müssen, zB vergleichen Sie die beiden Snippets in [this paste] (http://pastebin.com/8sLLnEPJ). –