2013-04-28 27 views
5

我想產生一個let塊接受局部變量的定義相同的結構,但我擊中牆壁:鑑於本parse功能:我在這裏錯過了關於make-symbol和assq的內容嗎?

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

我得到什麼看起來像Lisp的互動追捧輸出 - 模式:

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

鑑於...

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

...我期望下面有同樣的結果 - 我錯過了什麼?

(assq 'foo alist) 
nil 

雖然我會感到驚訝,如果Emacs的版本要緊,我一直在OSX的Emacs 24.2(9.0)測試此。

回答

6

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. 

assq是比較實習符號foo一些隨機uninterned符號恰好被命名爲foo,(當然),這將失敗,因爲它們不是同一個符號。

使用intern而不是make-symbol(如下所示)可能會解決您的問題。

(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")返回實習符號foo,這將被添加到您的ALIST,讓(assq 'foo alist)工作得很好。

(測試我的Emacs 24.2.1 Win7上。)

+0

謝謝!我剛剛發現,'(make-symbol「foo」)既不是'平等的',也不是''foo'的'eq',感覺更加混亂。 :-) – ecmanaut 2013-04-28 06:08:43

+0

@ecmanaut樂意幫忙。 – michaelb958 2013-04-28 06:11:39

相關問題