求助一个emacs-lisp编程的小问题

CASE1:

(setq xlist '("/usr/bin/x0"
              "/usr/bin/x1"))
(message (car xlist))

执行没有问题

CASE2:
但是下面的语句为何不能执行,正确的做法应该如何实现

(setq base-dir "/usr/bin/")
(setq ylist '((concat base-dir "y0")
              (concat base-dir "y1")))
(message (car ylist))

C-x c-e 错误

Debugger entered--Lisp error: (wrong-type-argument stringp (concat "/usr/bin/" "y0"))
  message((concat "/usr/bin/" "y0"))
  eval((message (car ylist)) nil)
  elisp--eval-last-sexp(nil)
  eval-last-sexp(nil)
  funcall-interactively(eval-last-sexp nil)
  call-interactively(eval-last-sexp nil nil)
  command-execute(eval-last-sexp)

quote会使它里面不管多深的层次全部被quote(不求值),所以你这里ylist就成了有两个元素的quoted list,其中第一个元素是:有3个元素concat base-dir "y0"的quoted list.

我这个问题还真是典型哈哈:

1 个赞
(setq ylist (list (concat base-dir "y0")
                  (concat base-dir "y1")))