【问题标题】:How to increment local variables in elisp如何在elisp中增加局部变量
【发布时间】:2018-07-16 13:31:26
【问题描述】:

我正在尝试在 elisp 中编写一个循环来按顺序打印值。

我已尝试使用以下代码从 1.. 打印序列,但它不起作用。请指出代码中的错误。

(let ((inc_variable 0))
  (message "%S" inc_variable)
  (while t (let ((inc_variable (+ inc_variable 1)))
    (message "%S" inc_variable))))

【问题讨论】:

  • 还要注意,在 Elisp 的符号名称中使用下划线被认为是不好的风格。首选inc-variable 而不是inc_variable

标签: elisp


【解决方案1】:

此代码中有 两个 绑定 inc_variable。外部绑定的值为 0 并且永远不会改变。然后,每次循环时,您为inc_variable 创建一个新绑定,该绑定设置为外部绑定的值加一(始终为0)。所以内部绑定每次都取值 1。

记住let总是创建一个绑定:如果你想更新一个现有绑定的值,使用setq

(let ((inc-variable 0))
  (while t 
    (message "%S" inc-variable)
    (setq inc-variable (+ inc-variable 1))))

【讨论】:

  • 最后一行可以减少到(setq inc-variable (1+ inc-variable))))使用内置函数递增1+
  • 为了清楚起见,我在那行复制了原始海报。 (一次解决一个问题!)如果是我的代码,我会写(incf inc-variable)
  • 现在您应该使用 cl-lib 包中的 cl-incf 而不是已弃用的 incf
【解决方案2】:

另一种增加变量的方法是使用cl-incf from cl-lib:

(require 'cl-lib)
(let ((x 0))
  (cl-incf x)
  (message "%d" x)
)

循环可能如下所示:

(require 'cl-lib)
(let ((x 0))
  (while (< x 10) (cl-incf x)
         (insert (format "%d\n" x))
  )
)

【讨论】:

  • 请注意,在现代 Elisp 代码中,cl 已过时,取而代之的是 cl-libincf 已被 cl-incf 取代。
  • @RadonRosborough。我认为incf 没有被替换。它仍然可以毫无错误地使用。它在cl.el中别名为cl-incf
  • @azzamsa 我知道它仍然有效。关键是它已被弃用。 cl.el 永远不应该在新代码中使用。弃用的原因是正确命名函数。
猜你喜欢
  • 1970-01-01
  • 2016-11-11
  • 1970-01-01
  • 2015-03-03
  • 2011-08-26
  • 2013-10-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多