2013-04-28 8 views
5

Ich versuche, die gleiche Struktur ein let Block übernimmt für die lokale Variablendefinitionen zu produzieren, sondern eine Wand am Schlagen: Da diese parse Funktion:Was fehlt mir an Make-Symbol und Assq hier?

(defun parse (string) 
    (mapcar (lambda (line) 
      (let* ((k_v (split-string line "=")) 
        (key (make-symbol (first k_v))) 
        (val (second k_v))) 
       (list key val))) 
      (split-string string "\n" t))) 

ich bekommen, was wie die gesuchte Ausgabe in Lisp-Interaktion aussieht -Mode:

(setq alist (parse "foo=bar\nbaz=quux\n")) 
((foo "bar") (baz "quux")) 

dass Gegeben ...

(assq 'foo '((foo "bar") (baz "quux"))) 
(foo "bar") 

... Ich würde unten dasselbe Ergebnis erwarten - was fehlt mir?

(assq 'foo alist) 
nil 

Während ich wäre überrascht, wenn Emacs-Versionen wichtig, ich habe diese 24,2 (9,0) auf OSX in Emacs getestet.

Antwort

6

Von der make-symbol Dokumentation:

(make-symbol NAME) 

Return a newly allocated uninterned symbol whose name is NAME. 
Its value and function definition are void, and its property list is nil. 

Ihre assq ist Vergleichen der interniert Symbol foo mit einem zufälligen uninterned Symbol, das foo genannt werden geschieht, die (natürlich) wird scheitern, da sie nicht das gleiche Symbol sind.

Mit intern anstelle von make-symbol (wie unten) kann Ihr Problem lösen.

(intern STRING &optional OBARRAY) 

Return the canonical symbol whose name is STRING. 
If there is none, one is created by this function and returned. 
A second optional argument specifies the obarray to use; 
it defaults to the value of `obarray'. 
(defun parse (string) 
    (mapcar (lambda (line) 
      (let* ((k_v (split-string line "=")) 
        (key (intern (first k_v))) ; change here 
       (val (second k_v))) 
       (list key val))) 
      (split-string string "\n" t))) 

(intern "foo") gibt die interniert Symbol foo, die auf Ihre alist hinzugefügt werden, so dass (assq 'foo alist) gut funktionieren.

(Getestet auf meinem Emacs 24.2.1 auf Win7.)

+0

Vielen Dank! Ich hatte gerade den Punkt erreicht, an dem ich entdeckte, dass '(make-symbol" foo ")' weder 'equal' noch' eq' zu "foo" war und sich noch verwirrter anfühlte. :-) – ecmanaut

+0

@ecmanaut Glücklich zu helfen. – michaelb958

Verwandte Themen