Добавление списков с именами символов, указанными в списке строк - PullRequest
3 голосов
/ 13 декабря 2011

Это, вероятно, легко, но я не могу получить

Допустим, у меня есть a b и d

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

как получить список, содержащий (x y p q) с информацией, которую я имею с d

ОБНОВЛЕНИЕ;Хорошо, что я попробовал, это

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

, но я действительно не понимаю, что делает nconc.если оценить дважды, значение изменится.трижды Emacs идет без ответа

Ответы [ 4 ]

3 голосов
/ 13 декабря 2011

Это должно сделать это:

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

Можете ли вы изменить то, что d использовать символы вместо строк? Было бы намного проще сделать:

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

Если содержимое a и b известно во время установки d, вы можете даже сделать это:

(setq d `(,@a ,@b))
1 голос
/ 14 декабря 2011

См. mapcan :

(let ((a '(x y))
      (b '(p q))
      (d '("a" "b")))
  (mapcan (lambda (x) (symbol-value (intern x))) d))
0 голосов
/ 13 декабря 2011

Мой Emacs Lisp foo не очень силен, но, возможно, вы могли бы попробовать следующее

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

, который также должен работать для длинных списков.

0 голосов
/ 13 декабря 2011

Это должно быть близко:

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

Если d может быть длиннее, вы можете отобразить (eval (read-from-string x)) на свой список, а затем применить добавление к результату;Я оставлю это в качестве упражнения:)

...