Frage Was ist der Vorteil eines Symbols, das gleichzeitig an einen Wert und eine Funktion bindet?


In Lisp kann ein Symbol gleichzeitig an einen Wert und eine Funktion gebunden werden. Beispielsweise,

Symbol f ist an eine Funktion gebunden

(defun f(x)
    (* 2 x))

Symbol f ist an einen Wert gebunden

(setq f 10)

Also schreibe ich so etwas:

(f f)

=> 20

Was ist der Vorteil einer solchen Funktion?


5
2017-11-13 09:38


Ursprung


Antworten:


Das Symbol kann sowohl eine Funktion als auch einen Wert haben. Die Funktion kann mit SYMBOL-FUNCTION und der Wert mit SYMBOL-VALUE abgerufen werden.

Dies ist nicht die vollständige Ansicht. Common Lisp hat (mindestens) zwei Namespaces, einen für Funktionen und einen für Variablen. Globale Symbole nehmen daran teil. Aber für lokale Funktionen sind die Symbole nicht beteiligt.

Was sind also die Vorteile?

  • Keine Namenskonflikte zwischen Bezeichnern für Funktionen und Variablen.

    Schema: (definieren (foo lst) (Liste lst))

    CL: (defun foo (Liste) (Liste Liste))

  • Keine Laufzeit prüft, ob etwas wirklich eine Funktion ist

    Schema: (definieren (foo) (bar))

    CL: (defun foo () (bar))

    In Schema ist nicht klar, was BAR ist. Es könnte eine Nummer sein, die beim Aufruf von FOO zu einem Laufzeitfehler führen würde.

    In CL BAR ist entweder eine Funktion oder undefiniert. Es kann niemals etwas anderes sein. Es kann zum Beispiel niemals eine Nummer sein. Es ist nicht möglich, einen Funktionsnamen an eine Zahl zu binden, daher muss dieser Fall zur Laufzeit nicht überprüft werden.


12
2017-11-13 10:56



Es ist nützlich für alltägliche Aufgaben, aber der Hauptgrund ist wegen der Makros, Sie werden verstehen, warum, sobald Sie es studieren.


-1
2017-11-30 09:20