Wann werden Symboleigenschaften verwendet?

7

Angenommen, ich muss Verzeichnissen Symbole zuordnen, und dies muss nur für eine kleine Anzahl von boundpSymbolen durchgeführt werden.

So wie ich das sehe, gibt es zwei einfache Möglichkeiten, dies zu tun:

  1. Speichern Sie diese Zuordnung in einer separaten Variablen (Alist oder Hash-Map). Auf diese Weise wäre das Verzeichnis jedes Symbols mit zugänglich (cdr (assq SYMBOL my-alist)).
  2. Speichern Sie dies in einer Symboleigenschaft. Auf diese Weise wäre es mit zugänglich (get SYMBOL 'my-directory).

Welche davon wäre die idiomatische Methode, um diese Informationen im Auge zu behalten?

Malabarba
quelle
Es lohnt sich anzugeben, ob Sie mit Sicherheit wissen, dass es keinen Anwendungsfall für jemanden gibt, der die Werte in einem temporären Bereich dynamisch binden möchte (da dies Option 2 so gut wie ausschließen würde).
Phils
@phils guter Punkt. Von Natur aus ist es nicht dazu gedacht, gebunden zu werden, aber ich denke, es ist ein berechtigtes Anliegen. Sie wissen nie, welche Anwendungsfälle andere Personen für Ihre Funktionen finden könnten.
Malabarba
@phils: Was meinst du? Hier kommen nur die Symbolrequisiten in Frage, nicht die Symbolwerte, oder? (defvar s 5) (put 's 'd "c:/abc/") (let ((s 4)) (message "d: %s, val: %S" (get 's 'd) s)). Und OP: Warum sprechen Sie von "Funktionen", nicht von Symbolen? Mir muss etwas fehlen.
Drew
@ Draw meinte er, das mit einem Symbol verknüpfte Verzeichnis binden zu lassen. Es ist nicht möglich, wenn Sie Symboleigenschaften verwenden, aber es ist möglich, wenn Sie diese Informationen in einer Variablen wie einer Liste speichern (Sie lassen die Liste einfach binden). In Bezug auf Ihre zweite Frage habe ich "Funktionen" gesagt, da all dieses Verhalten natürlich von Funktionen umschlossen wird. Ich glaube nicht, dass ich jemals ein Paket ohne Funktionen gesehen habe. :-)
Malabarba
Wenn Sie sich verstehen, brauchen Sie sich nicht zu erklären, aber FWIW verstehe ich immer noch nicht. Mit "Binden eines Verzeichnisses" meine ich das Binden einer Variablen an eine Verzeichniszeichenfolge. Es ist durchaus möglich, dass der Wert einer Symboleigenschaft ein Symbol ist, dessen Symbolwert die Verzeichniszeichenfolge enthält. let-Das Binden des Dir-String-Symbols (das als Requisitenwert verwendet wird) sollte kein Problem sein. (Fühlen Sie sich frei zu ignorieren, wenn nicht relevant.)
Drew

Antworten:

7

Es kommt wirklich auf die Anwendungsfälle an.

Im Allgemeinen handelt es sich bei Symboleigenschaften um "Low-Level" / "interne" Funktionen, und man sollte sie nicht für "User-Level" verwenden. Es gibt jedoch Platz für alles :-)

Einige Punkte, die Sie berücksichtigen sollten, sind:

  1. Geschwindigkeit: Die Symboleigenschaften sind am schnellsten, dicht gefolgt von Hash-Tabellen. Alisten sind langsam .
  2. Es ist einfacher, Ihr System mit der Alist / Hash-Tabelle (Zurücksetzen der Variablen auf nil) zurückzusetzen (dh alle Überreste Ihres Pakets zu entfernen) als mit Symboleigenschaften (iterieren Sie über obarrayund entfernen Sie alle relevanten Eigenschaften aus allen Symbolen).
  3. Es ist einfach, die Einstellung mithilfe von Alist dynamisch zu schattieren. viel schwieriger mit Hash-Tabellen und Symboleigenschaften.

Eine weitere Option, die Sie möglicherweise in Betracht ziehen möchten, ist .dir-locals.el.

sds
quelle
Gute Antwort. Keine Ahnung von # 2. Was meinst du mit "System zurücksetzen"? Sprechen Sie über die relative Schwierigkeit, eine Eigenschaft aus einem Symbol zu entfernen (vs, z. B. einen Schlüssel aus einer Liste)?
Drew
@Drew: Ich habe meinen Standpunkt klargestellt. Es ist jetzt besser?
SDS
Ja, jetzt ganz klar. Ich habe mich gefragt, ob du das vielleicht nicht so gemeint hast.
Drew
0

Solange Sie den kanonischen Namen für das Verzeichnis verwenden, ist entweder eine Hashtabelle oder eine Liste funktionsfähig. Wenn Sie erwarten, dass der Benutzer die Daten ändert oder überprüft, verwenden Sie eine Liste. Andernfalls funktioniert eine Hashtabelle am besten und lässt sich viel besser skalieren.

Ted Zlatanov
quelle