cl-labels 怎么不使用匿名函数运行

(defun idle-agenda()
  ;; [[https://emacs.stackexchange.com/questions/46750/defun-in-defun-is-not-local][defun in defun is not local?]]
  (interactive)
  (cl-labels (
              (show-agenda ()
                (org-agenda nil "n")
                )
              )
        ;; (run-with-idle-timer 5 t #'show-agenda)
        (with-timeout (3
                ;; (funcall #'show-agenda) 没有执行
                        )
          )
    )
  )

没看懂你这个代码。首先,cl-labels 定义的本地函数,是可以“当作”正常函数调用的。用 (func xxx) 或者 #'func 都可以。

(cl-labels ((func (x)
              (+ x 42)))
  (func 20) ;; => 62
  (mapcar #'func (list 1 2 3 4 5 6)))
;; => (43 44 45 46 47 48)

其次 with-timeout 这个宏,其实是一种类似 negative acknowledgement 的机制。比如

(with-timeout (20 (progn (nack)))
  (some-thing))

这个效果是,如果 (some-thing) 在 20 秒内没有结束,那么中断他,然后执行 (nack)

1 个赞