Emacs Lisp中符号和变量名的区别

13
我很想知道以下两者之间的差异:
(add-to-list 'flymake-allowed-file-name-masks
         '("\\.py\\'" flymake-pylint-init))
并且
(add-to-list flymake-allowed-file-name-masks
         '("\\.py\\'" flymake-pylint-init))

这里的撇号(apostrophe)的确切含义是什么?

1个回答

28
撇号是引用符,它告诉解释器不要解析接下来的表达式(符号名称)。因此,'add-to-list获取包含预期要被求值的列表值的符号。要了解更多有关符号的内容,请阅读Symbol文档(具体而言是Symbol Components符号有名称、值、函数定义和属性列表)。
没有阅读文档,我这样解释:Emacs Lisp的求值策略是按值传递(与按名称、引用或其他方式不同)。如果没有引用,flymake-allowed-file-name-masks将被求值为一个值,并且add-to-list必须直接在列表上工作。这会起作用,但有以下例外情况。如果列表为空,则无法更改原始变量指向的内容。同样的原因,您将无法将元素添加到列表的前面。
要使这两种情况起作用,实际上需要变量名称,以便可以修改它所指向的内容。
阅读以下内容可能很有用:求值入门修改列表变量修改现有列表结构
如果您熟悉框图,也许这会有所帮助。
想象一下,some-var指向一个列表:
somevar
  |
  |
  v
 --- ---      --- ---      --- ---        
|   |   |--> |   |   |--> |   |   |--> nil
 --- ---      --- ---      --- ---        
  |            |            |             
  |            |            |             
   --> rose     --> violet   --> buttercup

如果你只有 somevar 指针变量的值可用,那么你最好能做的就是把一个新元素加入到列表的开头,但你无法实际修改 somevar 指向的内容(因为你没有 somevar,只有它的值)。下面是示例代码:

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

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

当然,如果您将'add-to-list编写为,则不会有这种限制。


1
我现在有了完美的概念! 它可以类比其他语言中的按值调用和按引用调用!谢谢! - kjshim

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接