2015-07-15 3 views
0
(defun save-interface-file() 
     (interactive) 
     (let* ((xml (buffer-string)) 
      (root (with-temp-buffer (insert xml) (xml-parse-region (point-min) (point-max)))) 
      (request (car root)) 
      (nodename (xml-node-name request)) 
      (CustomerAgencyDataLoad "CALI") 
      ) 
      (message "%s.CRM66898.VZCRMCAR%s.%s" (number-to-string (random 100000000)) (derefernce nodename) (number-to-string (random 100000))) 

     ) 
    ) 

У меня есть функция, определенная выше в моем emacs.init файл открыть буфер, содержащий XML и типКак можно разыменовать переменную emacs lisp?

M-x save-interface-file 

Что происходит это имя переменной узла будет содержать значение «CustomerAgencyDataLoad». В сообщении я хочу разыменовать это из nodename и напечатать «CALI». Если я печатаю nodename, я получаю «CustomerAgencyDataLoad». Я знаю, что такие виды разыменований работают в perl, используя $$ var, но как мне это достичь в emacs LISP?

ответ

2

В то время как вы можете почтительное переменную с помощью (symbol-value (intern "my-string")) (за исключением, если ваш код скомпилирован с использованием лексического связывания), в данном случае я хотел бы предложить, используя ассоциативный список (сокращенно «ассоциативного списка») вместо:

(let ((shorter-names '((CustomerAgencyDataLoad . "CALI") 
         (SomethingElse . "FOO"))) 
     (node-name 'CustomerAgencyDataLoad)) 
    (cdr (assq node-name shorter-names))) 

assq осуществляет поиск по shorter-names для записи, которая соответствует значению node-name. С cdr мы получаем вторую половину записи, которая в этом случае равна "CALI".