计算函数被执行过的次数

使用“(list …)”和直接手写list哪种更好? 继续讨论:

一般把 "hello", '(1 2 3)[1 2 3]等视作「常量」,它们只会初始化一次,会在不同的函数调用间共享,所以一般应该避免修改「常量」。下面是一个例外,故意利用这种特性,来计算一个函数被执行过的次数:

(defun foo ()
  (let ((count '(0)))
    (cl-incf (car count))))

(foo)
;; => 1

(foo)
;; => 2

(foo)
;; => 3

每次 foo 调用都会修改自己的定义(self-modifying code),可用 symbol-function 查看函数定义。

其它可能更好的办法是用全局变量和 lexical-binding/closure。

6 个赞