2011-12-13 64 views
3

列表這可能是容易的,但我不能似乎得到在字符串

指定符號名追加名單可以說我有abd

(setq a '(x y)) 
(setq b '(p q)) 
(setq d '("a" "b")) 

怎樣才能得到含有(x y p q)列表與我的信息d

UPDATE; 好吧我曾試圖爲這種

(apply 'nconc (mapcar (lambda (x) 
       (symbol-value (intern x))) 
      d)) 

,但我真的不明白nconc做什麼。如果評估兩次,價值改變。三次emacs的 不用響應

+1

C-H˚F`nconc` - > nconc改變的最後一個元素。改用`concat`。 – Daimrod 2011-12-13 19:49:08

+0

你爲什麼不止一次評價它? – 2011-12-13 19:50:10

+1

@Daimrod`concat`返回一個字符串而不是一個列表。 – 2011-12-13 19:50:48

回答

3

這應做到:

(apply 'append (mapcar (lambda (name) (symbol-value (intern name))) d)) 

你能不能改變什麼d用符號代替的字符串?這將是簡單得多的事情:

(setq d '(a b)) 
(apply 'append (mapcar 'symbol-value d)) 

如果ab內容在您所設定d時已經知道,你甚至可以做到這一點:

(setq d `(,@a ,@b)) 
-1

這應該是接近:

(append (eval (read-from-string (car d))) (eval (read-from-string (cadr d)))) 

如果d可以長一些,你可以映射(EVAL(讀從字符串X))在你的清單,然後申請追加到結果;我會離開,作爲一個練習:)

-1

我的Emacs Lisp foo是不非常強大,但也許你可以嘗試以下內容:

(reduce 'append 
     (map 'list 
      '(lambda (l) (eval (read l))) 
      d)) 

它應該也適用於長列表。

1

參見mapcan

(let ((a '(x y)) 
     (b '(p q)) 
     (d '("a" "b"))) 
    (mapcan (lambda (x) (symbol-value (intern x))) d))