【问题标题】:How can I dereference an emacs lisp variable?如何取消引用 emacs lisp 变量?
【发布时间】:2015-07-15 12:18:43
【问题描述】:
  (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 的缓冲区并输入

M-x save-interface-file

发生的情况是变量节点名称将包含值“CustomerAgencyDataLoad”。在消息中,我想从节点名中取消引用它并打印“CALI”。如果我打印节点名,我会得到“CustomerAgencyDataLoad”。我知道这种取消引用在 perl 中使用 $$var 有效,但是如何在 emacs LISP 中实现这一点?

【问题讨论】:

    标签: pointers emacs lisp elisp


    【解决方案1】:

    虽然您可以使用 (symbol-value (intern "my-string")) 来引用变量(除非您的代码是使用词法绑定编译的),但在这种情况下,我建议您使用 alist(“关联列表”的缩写)来代替:

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

    assqshorter-names 中搜索与node-name 的值匹配的条目。使用cdr,我们得到条目的后半部分,在本例中为"CALI"

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-11-18
      • 1970-01-01
      • 2013-11-28
      相关资源
      最近更新 更多