请问如何在scratch buffer 中遍历elisp所有顶级函数

如题11111111

(mapc (lambda (sym)
            (when (fboundp sym)
              (do something with sym)))
          obarray)
2 个赞

错误的, 你不应该直接在 obarray 上迭代, 这样的结果会有遗漏. ELisp 手册上特地指出了这一点及其原因.

正确的做法:

3 个赞

我不需要所有函数,只要所有顶级函数就行了,不过可以遍历所有函数也挺好

问题在于 obarray 压根不能保证遍历所有的符号, 它可能会遗漏你想要的. 它也不是 vector, 它是 C 实现的 vector-like 的数据结构, 是一种哈希表

1 个赞

那好,用你的方法

同样作用直接用 obarray-map 效率更高

1 个赞

你去看一下 obarray-map 的函数定义, 我突然好奇这个函数存在的意义是啥

因为先有 mapatoms,但是这个名字不容易让人发现它和 obarray 有关系,就定义了对应的 alias

obarray-get obarray-put 都是同理

1 个赞

我的感觉是 怎么不用 ctrl+h f tab,不比scratch更好,我这显示是 26529 possible completions, 不知道是否包含emacs中的所有函数。

标题存在歧义。如果不看回帖,我以为是:

你在 strach buffer 中写了一堆 elisp 代码,你想遍历其中的顶级(即缩进为0)函数。如果不是这个意思,没必要强调【在scratch buffer 中】。

1 个赞