cl-letf 疑惑

(defun init-roam ()
  (cl-letf (((symbol-function #'org-roam-db-sync) #'ignore))
    (org-roam-db-autosync-enable))
    ...)

我在加载 ‘org 后调用上面的函数。有几点疑惑:

  • org-roam-db-sync 似乎并没有被临时替换为 ignore. 从org-roam-db-sync中输出的消息可以判断。
  • 在编译初始化配置文件时,这里的 (org-roam-db-autosync-enable) 始终会被值。这是为什么? 编译的时候为什么会被求值呢?
  • 在编译的时候,同样存在第一点的问题。

求大大解惑。

我有 99% 以上的把握你没有准确定位到问题所在,出问题的地方在你没有展示的配置文件里。建议用 --no-init-file 来一个最小可复现配置先。

1 个赞

加了点消息输出:(org-roam-db-autosync-enable 和 org-roam-db-sync 定义在同一文件且都为autoload加载)

(defun init-roam()
    (message "->%s" (symbol-function #'org-roam-db-sync))
    (message "-%s" (symbol-function #'org-roam-db-autosync-enable))
    (cl-letf (((symbol-function #'org-roam-db-sync) #'ignore))
      (message "->>%s" (symbol-function #'org-roam-db-sync))
      (org-roam-db-autosync-enable)
      (message "--%s" (symbol-function #'org-roam-db-autosync-enable))
      (message "->>>%s" (symbol-function #'org-roam-db-sync))) ;;autoload 加载了org-roam-db-sync原有的定义
    (message "->>>>%s" (symbol-function #'org-roam-db-sync)) ;; letf之外,org-roam-db-sync 恢复为autoload
    (message "---%s" (symbol-function #'org-roam-db-autosync-enable))) ;; 而 org-roam-db-autosync-enable 并未恢复为autoload

以下是输出的结果:

->(autoload org-roam-db Synchronize the cache state with the current Org files on-disk.
If FORCE, force a rebuild of the cache from scratch.

(fn &optional FORCE) t nil)
-(autoload org-roam-db Activate `org-roam-db-autosync-mode'. nil nil)
->>ignore
Clearing removed files...done
Processing modified files...done
--#<subr org-roam-db-autosync-enable>
->>>#<subr org-roam-db-sync>
->>>>(autoload org-roam-db Synchronize the cache state with the current Org files on-disk.
If FORCE, force a rebuild of the cache from scratch.

(fn &optional FORCE) t nil)
---#<subr org-roam-db-autosync-enable>

letf 和 autoload 的机制在作祟。 我是从实验的结果推断的。autoload 和 letf 实现不太了解。 我这么推断对吗?@LdBeth

那你加个 require org-roam-db 呗

可是,为什么在编译时(org-roam-db-autosync-enable)会被求值?

编译的时候并没有求值,只是检测到了未声明的变量/方法。

消除编译警告的方法:

;; 1
(declare-function FUNCTION "FILE")
;; 2
(require 'FILE)
1 个赞