2014-05-22 6 views
21

LISP hat die Funktion setf, um einer Variablen einen Wert zuzuweisen. Jetzt habe ich mich über den Namen der Funktion gewundert: Der set Teil ist offensichtlich, aber wofür steht das Suffix f?Wofür steht das f in setf?

+4

+1 Dies ist eine interessante Frage. Es ist nicht unbedingt eine Programmierfrage per se (da es nicht darum geht, ** setf zu benutzen), aber es ist keine mit einer offensichtlichen Antwort, und das Verständnis der Namenskonventionen und der Geschichte kann oft dem mentalen Modell eines Programmierers der Sprache helfen . (Übrigens, das 'q' in' setq' ist einfacher. In älteren Lisps, wo die Verwendung des Symbolwerts eines Symbols häufiger war, war es schön, '' (set 'foo ...) 'als' (setq foo ...) zu kürzen. '(so das q ist für' zitat').) –

+0

Danke für diesen netten Kommentar :-)). Für mich als LISP-Anfänger sind einige Namen schwer zu verstehen, ein anderes Beispiel ist "evenp" und "oddp": Ich frage mich nur, wofür das 'p' steht, und es hilft definitiv, Funktionen zu merken, wenn man ihre Namen wirklich versteht ihre Bedeutung). –

+4

P steht für "Prädikat" –

Antwort

30

Die eigentliche Bedeutung von F wird oft vergessen. Nach einigen Quellen könnte f Suffix steht für:

  • Field (siehe zum Beispiel dieser answer)
  • Form (wie in verschiedenen Unterrichtsmaterialien und Handbücher gesehen)

Doch nach Gabriel und Steele's The Evolution of Lisp, SETF kommt von Peter Deutsch's A Lisp Machine with Very Compact Programs (veröffentlicht in 1973) und F steht für Funktion.

In diesem Papier, Peter Deutsch schrieb:

Die SET-Funktion erweitert, so dass so, dass, wenn das erste Argument eine Liste ist (fn argl ... argn) eher als eine Variable, die Funktion fn in „Speichern“ -Modus genannt wird mit Argumenten argl ... argn und newvalue (das zweite Argument von SET). SETQ wird auch in naheliegender Weise erweitert, ist aber nicht besonders nützlich. Eine nützlichere Funktion ist (SETFQ (fn argl ... argn) newvalue) welche die Funktion zitiert und alles andere bewertet. So kann RPLACA beispielsweise als (LAMBDA (X Y) (SETFQ (CAR X) Y)) definiert werden.

(Hervorhebung von mir)

Gabriel und Steele erklären, wie diese SETF wurde:

Dieser Name abgekürzt wurde in Lisp-Maschine Lisp setf.

+0

Danke, dass du darauf hingewiesen hast, jetzt weiß ich, auf welche Begriffe ich achten muss :-)! –

+0

@GoloRoden Es gibt zwei widersprüchliche Antworten, woher weißt du, dass dieser richtig ist? – henginy

+0

Ich kann nicht * wissen *, dass es korrekt ist, aber ich googelte für beide Begriffe und fand einen anderen (ziemlich upvoted) [Antwort] (http://Stackoverflow.com/a/869693/1333873), die darauf hindeuten, dass es 'Feld' ist , nicht 'Form'. Abgesehen davon ist diese Antwort hilfreicher, da sie auch darauf hinweist, wofür das 'q' steht. –