gpt4 book ai didi

emacs:如何在宏中定义的代码上使用 edebug?

转载 作者:太空宇宙 更新时间:2023-11-03 18:35:04 24 4
gpt4 key购买 nike

我什至不知道这个 lisp 语法的正确术语,所以我不知道我用来问问题的词是否有意义。但我敢肯定,这个问题是有道理的。

所以让我告诉你。 cc-mode (cc-fonts.el) 有一些叫做“匹配器”的东西,它们是运行的代码位来决定如何对代码区域进行字体化。这听起来很简单,但是匹配器代码是我不完全理解的形式,有反引号和逗号标记,只有逗号等等,而且它嵌入了一个 c-lang-defcost,它本身就是一个宏。我不知道如何称呼所有这些,但我想对该代码运行 edebug。

看:

 (c-lang-defconst c-basic-matchers-after
"Font lock matchers for various things that should be fontified after
generic casts and declarations are fontified. Used on level 2 and
higher."

t `(;; Fontify the identifiers inside enum lists. (The enum type
;; name is handled by `c-simple-decl-matchers' or
;; `c-complex-decl-matchers' below.
,@(when (c-lang-const c-brace-id-list-kwds)
`((,(c-make-font-lock-search-function
(concat
"\\<\\("
(c-make-keywords-re nil (c-lang-const c-brace-id-list-kwds))
"\\)\\>"
;; Disallow various common punctuation chars that can't come
;; before the '{' of the enum list, to avoid searching too far.
"[^\]\[{}();,/#=]*"
"{")
'((c-font-lock-declarators limit t nil)
(save-match-data
(goto-char (match-end 0))
(c-put-char-property (1- (point)) 'c-type
'c-decl-id-start)
(c-forward-syntactic-ws))
(goto-char (match-end 0)))))))

我正在阅读 lisp 语法以弄清楚这些东西是什么以及如何调用它们,但除此之外,我如何在读取 ;; 的注释后面的代码上运行 edebug字体化枚举列表中的标识符。 ?

我知道如何在 defun 上运行 edebug - 只需在函数定义中调用 edebug-defun,然后我就可以开始了。我需要做相应的事情来调试 cc-mode 匹配器代码形式吗?

def-edebug-spec 有什么作用,我会在这里使用它吗?如果是这样,如何?

最佳答案

根据 (elisp)Top > Debugging > Edebug > Edebug and Macros 你必须告诉 Edebug 如何通过使用 debug 语句定义它或使用def-edebug-spec。这告诉它应该评估哪些参数,哪些不应该。所以可以做到。事实上,它看起来好像 c-lang-defconst 已经适用于 edebug。如果您有兴趣,这里是定义:

(def-edebug-spec c-lang-defconst
(&define name [&optional stringp] [&rest sexp def-form]))

但是,如果您只想查看主体的计算结果,那么执行此操作的方法是使用类似下面的 macro-expand-last-sexp 的内容来查看结果。将光标放在您想要扩展的 sexp 之后(就像您对 C-x C-e 所做的那样)并运行 M-x macro-expand-last-sexp RET。这将向您展示它扩展到什么。如果您尝试扩展诸如 ,(....) 之类的内容,您可能会遇到麻烦,因此您可能必须将该 sexp 复制到其他地方并删除 ,@.

(defun macro-expand-last-sexp (p)
"Macro expand the previous sexp. With a prefix argument
insert the result into the current buffer and pretty print it."
(interactive "P")
(let*
((sexp (preceding-sexp))
(expanded (macroexpand sexp)))
(cond ((eq sexp expanded)
(message "No changes were found when macro expanding"))
(p
(insert (format "%S" expanded))
(save-excursion
(backward-sexp)
(indent-pp-sexp 1)
(indent-pp-sexp)))
(t
(message "%S" expanded)))))

我想这完全取决于您要做什么。

关于emacs:如何在宏中定义的代码上使用 edebug?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2704382/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com