2013-04-28 9 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の相互作用で求めた出力のように見えるものを得ます-mode:

ことを考えると
(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)でこれをテストしてきました。 make-symbolドキュメントから

答えて

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. 

あなたassqは(もちろん)、foo名前を付けることを起こるいくつかのランダムインターンシンボルでインターンシンボルfooをします比較しているが彼らは同じシンボルではないので、失敗します。

make-symbol(下記)の代わりにinternを使用すると、問題が解決する場合があります。

(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)がうまく動作することができ、あなたの連想リストに追加されます インターンシンボル fooを返します。

(私のEmacs 24.2.1 Win7でテスト済み)

+0

ありがとう!私はちょうど '(make-symbol" foo ")'が '' foo'に '' equal 'でも 'eq'でもなく、さらに混乱していることを発見したところに達しました。 :-) – ecmanaut

+0

@ecmanaut喜んでお手伝いします。 – michaelb958

関連する問題