2013-04-28 11 views
5

Sto cercando di produrre la stessa struttura di un blocco let accetta per le definizioni locali variabili ma sto colpire un muro: data questa funzione parse:Cosa mi manca di make-symbol e assq qui?

(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))) 

ottengo quello sembra come l'uscita ricercato in Lisp-interazione -mode:

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

Dato che ...

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

... Mi aspetto lo stesso risultato qui sotto - cosa mi manca?

(assq 'foo alist) 
nil 

Mentre io sarei sorpreso se le versioni di Emacs importava, ho provato questo in Emacs 24.2 (9.0) su OSX.

risposta

6

Dalla documentazione make-symbol:

(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. 

tuo assq è confrontando il internati simbolo foo con un po 'casuale uninterned simbolo che succede ad essere nominato foo, che (ovviamente) sarà fallire, poiché non sono lo stesso simbolo.

Utilizzare intern anziché make-symbol (come di seguito) può risolvere il problema.

(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") restituisce il internati simbolo foo, che verrà aggiunto al vostro alist, permettendo (assq 'foo alist) funzionare bene.

(Testato su Emacs 24.2.1 su Win7.)

+0

Grazie! Avevo appena raggiunto il punto di scoprire che '(make-symbol" foo ")' non era né 'uguale' né' eq' a ''foo', e si sentiva ancora più confuso. :-) – ecmanaut

+0

@ecmanaut Felice di aiutare. – michaelb958

Problemi correlati