【问题标题】:What's difference between *var* and var when using defvar?使用 defvar 时 *var* 和 var 有什么区别?
【发布时间】:2015-10-19 05:57:32
【问题描述】:

在一些文档中,我发现他们说答案是 *var* 表示全局变量。

但是当我尝试时,我无法确定。

  FIRST-PACKAGE[27]> (defvar b 1)
  B
  FIRST-PACKAGE[28]> b
  1
  FIRST-PACKAGE[29]> (defun add_b (x) (+ x b))
  ADD_B
  FIRST-PACKAGE[30]> (add_b 3)
  4
  FIRST-PACKAGE[31]>

在我的示例中,如果答案正确,b 仍然不是全局的。

但是为什么add_b这个功能还能用呢?

如何理解这个例子和*var*

谢谢~

【问题讨论】:

    标签: lisp common-lisp


    【解决方案1】:

    我在这里谈论的是 Common Lisp:

    DEFVAR 声明一个全局变量并声明它使用动态绑定。它是一个特殊变量。我们使用*b* 和它周围的星号作为约定来提醒我们它是一个特殊变量 - 它使用动态绑定。任何其他名称都可以。这只是一个约定。在您的示例中,您使用名称b。我不建议这样做。请遵循 DEFVAR 声明为 *b* 的约定和命名变量。相同的规则对DEFPARAMETER 很有用。

    你的例子是什么意思不清楚。当然你可以在函数中使用全局变量。

    【讨论】:

    • 我知道 C++ 中的动态绑定。 lisp 中的动态绑定是什么?它们有多相似?谢谢~
    • @sam 我怀疑“不是很多”。在 Common Lisp 中,它是动态变量查找与静态变量查找。在 C++ 中,它是 vtable 调度与编译时方法的确定。
    • @sam:动态绑定在很多地方都有解释。 Lisp 书籍可以做到这一点。一个简单的谷歌搜索会带来很多点击...
    【解决方案2】:

    好的。在 Common Lisp 中,实际上有两种类型的变量:你一直使用的变量,它们是词法绑定的,以及“特殊”变量,它们是动态绑定的。 “特殊”变量是使用defvardefparameter 或声明创建的。 *earmuffs* 是一种约定,用于提醒 Lisp 程序员变量是特殊的。下面是一些例子:

    (defvar b 3)
    
    (defun add-to-b (x)
      (+ x b))
    
    (add-to-b 1)
      => 4
    
    (let ((b 4))
      (list (add-to-b 1) b))
    => (5 4)
    
    (let ((a 3))
      (defun add-to-a (x)
        (+ x a)))
    
    (add-to-a 1)
      => 4
    
    (let ((a 4))
      (list (add-to-a 1) a))
    => (4 4)
    

    如您所见,更改 let 中的特殊变量的值会使该值更改“涓滴”到该 let 中的所有函数调用,而常规的、词法绑定的值更改变量不会被向下传递,事实上,词法绑定的变量是通过向上移动位于函数 wan defined 的范围来查找的,而特殊变量是通过向上移动的范围来查找的该函数被调用*earmuffs* 对于阻止程序员意外重新绑定特殊变量很有用,因为它们使特殊变量看起来不同。

    【讨论】:

      【解决方案3】:

      首先:为了在 Common Lisp 中声明一个“特殊”变量,你必须通过defvar 引入它:

      (devar *variable* "initial value")
      

      变量名周围的“耳罩”(*) 只是一个约定,它告诉人类读者该变量是特殊的。这与告诉编译器该变量是特殊的无关。请注意,* 字符是变量名称的一部分(是的,Common Lisp 允许在符号名称中使用 * - 以及一大堆其他“不寻常”字符)

      【讨论】:

      • 其实,我想你只需要声明它为特殊的,然后设置它的值。
      猜你喜欢
      • 2019-09-21
      • 2018-12-07
      • 1970-01-01
      • 1970-01-01
      • 2013-06-28
      • 2011-06-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多