2013-04-28 19 views
5

Ben let blok yerel değişken tanımları için kabul aynı yapıyı üretmek için çalışıyorum ama bir duvara isabet ediyorum: Verilen bu parse işlevi:Marka sembolü ve assq hakkında ne kaçırdım?

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

Ben lisp-etkileşiminde aranan çıktı neye benzediğini olsun biçem:

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

göz önüne alındığında ...

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

… Aynı sonucun aşağıda olmasını beklerdim - neyi özlüyorum?

(assq 'foo alist) 
nil 

Emacs versiyonları önemliymiş çok şaşırırım iken

, ben OSX'te Emacs 24.2 (9.0) 'de bu test ettik. make-symbol belgelerine

cevap

6

:

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

Sizin assq olan (elbette) hangi edecek, foo adlandırılacak olur enterne sembol foo rastgele ile uninterned sembolü karşılaştıran Aynı sembol olmadıkları için başarısız olurlar.

make-symbol (aşağıdaki gibi) yerine intern kullanmak sorununuzu çözebilir.

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

(assq 'foo alist) sadece iyi çalışmasını sağlayan, sizin alist eklenecektir enterne sembolü foo döndürür.

(Win7 üzerinde Emacs 24.2.1 üzerinde test edilmiştir.)

+0

Teşekkürler! Ben sadece '(make-symbol "foo")' nun 'eşit' ya da 'eq' 'foo' olmadığını ve daha da karışık olduğunu hissetme noktasını bulmuştum. :-) – ecmanaut

+0

@ecmanaut Yardım etmekten mutluluk duyarım. – michaelb958