2016-03-29 12 views
1

Ich habe eine zweifache Frage und hoffe auf Rat von den Experten hier.Plist Erstellen mit Backticks schlägt in Ausdruck

1) Bei einer syntaktischen Analyse eines Codes muss ich die gefundenen Komponenten für die spätere Verwendung speichern. Ich überlege nun, diese als Eigenschaftsliste zu speichern (eine isolierte Liste, nicht die der Zeichenfolge, die den Code enthält, da mir das wie ein Missbrauch erscheinen würde, obwohl es praktisch wäre). Ist dies gegen alle Konventionen oder einen vernünftigen Weg, mit dieser Situation umzugehen?

2) Ich kann eine Eigenschaftsliste in einer (let ...) Anweisung nicht erstellen.

Dies funktioniert:

(setq x "BAR") 
(setq pl `(bar ,x)) 
(setq pl (plist-put pl 'foo "FOO")) 
(plist-get pl 'foo) ; returns "FOO" 

Aber dies nicht:

(let (pl `(bar ,x)) 
    (setq pl (plist-put pl 'foo "FOO")) 
    (plist-get pl 'foo)) 

Emacs beschwert sich über die Leere Funktionsleiste. Es versucht offensichtlich (bar ...) trotz des Backticks auszuwerten. Warum?

Antwort

2

Aus Mangel an Klammern. Lassen Sie uns die besondere Graviszeichen Notation erweitern:

(let (pl (\` (bar (\, x)))) 
    (setq pl (plist-put pl 'foo "FOO")) 
    (plist-get pl 'foo)) 

eine variable pl Dies erklärt (ohne Anfangswert und somit initialisiert nil) sowie eine Variable mit dem Namen `(das ist richtig: der Name„Graviszeichen“ist) initialisiert auf den Wert von (bar (\, x)).

So, möchten Sie die folgende Stelle schreiben:

(let ((pl `(bar ,x))) 
    ...)