【问题标题】:Difference between symbol and variable name in emacs lispemacs lisp中符号和变量名的区别
【发布时间】:2009-11-23 02:35:22
【问题描述】:

我想知道有什么区别

(add-to-list 'flymake-allowed-file-name-masks
         '("\\.py\\'" flymake-pylint-init))

(add-to-list flymake-allowed-file-name-masks
         '("\\.py\\'" flymake-pylint-init))

这里撇号的明确含义是什么?

【问题讨论】:

    标签: emacs elisp


    【解决方案1】:

    撇号是一个引号,它告诉解释器不要解析下面的表达式(符号名称)。因此,'add-to-list 获取包含要评估的列表值的符号。

    要了解有关符号的更多信息,请阅读Symbol 文档(具体而言,Symbol Components 符号具有名称、值、函数定义和属性列表)。

    在不阅读文档的情况下,我是这样解释的:Emacs lisp 的evaluation strategy 是按值传递(而不是按名称或引用或其他方式传递)。如果报价不存在,flymake-allowed-file-name-masks 将被评估为一个值,add-to-list 必须直接在列表上工作。这将起作用,但有以下例外。如果列表为空,则无法更改原始变量指向的内容。出于同样的原因,您将无法将元素添加到列表的前面。

    为了使这两种情况有效,您实际上需要变量名,以便您可以修改 it 指向的内容。

    阅读以下内容可能会有所帮助:Introduction to EvaluationModifying List VariablesModifying Existing List Structures

    如果您熟悉box diagrams,也许这会有所帮助。

    假设some-var 指向一个列表:

    somevar
      |
      |
      v
     --- ---      --- ---      --- ---        
    |   |   |--> |   |   |--> |   |   |--> nil
     --- ---      --- ---      --- ---        
      |            |            |             
      |            |            |             
       --> rose     --> violet   --> buttercup
    

    而且你想把一些东西放在那个列表的前面。

    如果您只需要处理somevar 中指针的,那么您能做的最好的事情就是在列表的前面放置一个新元素,但实际上您不能修改somevar 指向的内容(因为你没有somevar,你有它的)。像这样:

                 somevar
                   |
                   |
                   v
     --- ---      --- ---      --- ---      --- ---        
    |   |   |--> |   |   |--> |   |   |--> |   |   |--> nil
     --- ---      --- ---      --- ---      --- ---        
      |            |            |            |             
      |            |            |            |             
       --> tulip     --> rose     --> violet   --> buttercup
    

    所以,要编写自己的'add-to-list 函数,您需要变量名。

    当然,如果你把'add-to-list写成macro,你就没有这个限制了。

    【讨论】:

    • 我现在有了完美的构想!可以比作其他语言的按值调用和按引用调用!谢谢!
    猜你喜欢
    • 2011-04-05
    • 2013-08-12
    • 2012-02-25
    • 2011-04-23
    • 2010-10-11
    • 1970-01-01
    • 1970-01-01
    • 2011-04-20
    • 1970-01-01
    相关资源
    最近更新 更多