What am I missing about make-symbol and assq here?

elisp

Solution

From the `make-symbol` documentation:

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

Your `assq` is comparing the interned symbol `foo` with some random uninterned symbol which happens to be named `foo`, which (of course) will fail, as they are not the same symbol.

Using `intern` instead of `make-symbol` (as below) may solve your problem.

(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")` returns the interned symbol `foo`, which will be added to your alist, allowing `(assq 'foo alist)` to work just fine.

(Tested on my Emacs 24.2.1 on Win7.)

Problem

I am trying to produce the same structure a `let` block accepts for local variable definitions but am hitting a wall: given this `parse` function: ``` (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))) ``` I get what looks like the sought output in lisp-interaction-mode: ``` (setq alist (parse "foo=bar\nbaz=quux\n")) ((foo "bar") (baz "quux")) ``` Given that… ``` (assq 'foo '((foo "bar") (baz "quux"))) (foo "bar") ``` …I would expect the same result below – what am I missing? ``` (assq 'foo alist) nil ``` While I'd be surprised if Emacs versions mattered, I've been testing this in Emacs 24.2 (9.0) on OSX.

Original source