能写出不用全局变量的下一次调用一定返回另一个数的函数吗

我想写一个函数

第一次调用一定返回 1, 第二次调用一定返回 2 ,

第三次调用一定返回 1 ,第四次调用一定返回 2 … 如此反复

这种函数存在不使用全局变量的实现吗?

(let ((x 2))
  (defun counter ()
    (if (eql 2 x)
        (setq x 1)
      (setq x 2))))

如果失败的话,记得设置 lexical-binding 的值为 t

闭包

(defun test ()
  (let ((r 1))
    (lambda ()
      (if (= r 1)
          (setq r 2)
        (setq r 1)))))

(setq inner (test))

(funcall inner)
(funcall inner)
(funcall inner)

可以利用elisp中的bug。

思路神奇。。。

原本想着的全局变量做toggle 函数

现在可以通过这样的函数做

这样不好,还是应该用变量。

生成器: