gpt4 book ai didi

emacs - clojure 社区是否有相当于 perltidy 的东西?

转载 作者:行者123 更新时间:2023-12-01 10:42:27 25 4
gpt4 key购买 nike

我有一个这样的函数定义:

(defn init-globals [] (def *board-width* 15))

我希望能够重新格式化,使其看起来像这样:

(defn init-globals []
(def *board-width* 15))

我希望格式化由一个智能代理完成,它不仅仅是将所有内容缩进固定数量,或者只是每行打印一个元素等。这是 perltidy 所做的事情。

perltidy 采用如下代码:

sub foo {
my $args = shift; $a = $args->{a}; $long_var = $args->{b}; }

并将其变成:

sub foo {
my $args = shift;
$a = $args->{a};
$long_var = $args->{b};
}

注意它如何将“子”定义视为一个整体,甚至最后两个赋值中的“=”也排成一行。虽然我不一定需要这种级别的格式设置,但我想要采用列表(或更准确地说,一种形式)的东西,这是一个带有 args 和子表达式的函数,并使其尽可能易于人类阅读。

我的函数定义是单行的原因是因为它是从宏生成的。我不想用格式化指令弄乱宏(如果我什至可以在不生成字符串而不是列表的情况下做到这一点),因为宏本身就够难了。虽然我可以很好地将列表评估到我的 REPL 中,但我还想将生成的代码写入一个文件,就像它是手动输入的一样,即您可以检查源代码控制的东西。

我看过 (clojure.pprint/pp) 之类的东西,并使用 emacs 'indent-sexp 和 smartparen's 'sp-indent-defun,但除其他外,它们不会将输出分成多行。

我可以与 emacs/elisp 命令互操作,所以如果有办法用 emacs 做到这一点,那也行。

最佳答案

如果这是你想要做的,那么我建议简单地打印你生成的代码(或者你想将它写入文件)然后抛出 cljfmt

存在一些工具,例如 bbloom 的 Fipp它可以从 Clojure 实例内部执行类似的代码 pretty-print ,但据我所知,cljfmt 做得更好。

我认为值得考虑为什么您尝试保存宏扩展代码,因为宏扩展的成本是名义上的,并且根据需要生成代码而不是生成代码被认为是更好的做法,保存它,然后像手写一样处理它。保留代码生成还意味着您的代码库更加灵活,因为您只需调整生成器并重新加载所涉及的命名空间,而不必重新生成生成的代码,然后重新格式化并重新编译。

关于emacs - clojure 社区是否有相当于 perltidy 的东西?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29002337/

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