Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/clojure/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sockets/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Emacs clojure社区是否有一个perltidy的等价物?_Emacs_Clojure - Fatal编程技术网

Emacs clojure社区是否有一个perltidy的等价物?

Emacs clojure社区是否有一个perltidy的等价物?,emacs,clojure,Emacs,Clojure,我有这样一个函数定义: (defn init-globals [] (def *board-width* 15)) 我希望能够重新格式化,使其看起来像: (defn init-globals [] (def *board-width* 15)) 我希望格式化是由一个智能代理完成的,它不仅仅是将所有内容缩进一个固定的数量,或者每行只打印一个元素等等。这是perltidy所做的事情 perltidy采用如下代码: sub-foo{ my$args=shift;$a=$args->{a};$

我有这样一个函数定义:

(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{
我的$args=班次;
$a=$args->{a};
$long_var=$args->{b};
}
注意它是如何将“sub”定义作为一个整体考虑的,甚至最后两个赋值中的“=”也是如此。虽然我不一定需要这种级别的格式,但我希望有一个列表(或者更准确地说,是一个表单),这是一个带有参数和子表达式的函数,并尽可能让人可读

我的函数定义之所以是单行,是因为它是从宏生成的。我不想用格式化指令把宏弄得乱七八糟(如果我真的不需要生成字符串而不是列表的话),因为宏已经够硬了。虽然我可以很好地将列表计算到REPL中,但我也希望将生成的代码编写到一个文件中,就好像它是手工输入的一样,即您可以检查到源代码管理中的东西

我研究过(clojure.pprint/pp)和使用emacs的indent sexp和smartparen的sp indent defun,但它们没有将输出拆分为多行


我可以与emacs/elisp命令进行互操作,因此,如果有一种方法可以与emacs进行互操作,那也可以。

如果这是您想要做的,那么我建议您只需打印生成的代码(或者以您希望的方式将其写入文件),然后抛出它

有一些工具,比如bbloom,可以在Clojure实例中进行类似的代码漂亮打印,但据我所知,cljfmt做得更好

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

还有一个-my扩展,它带有简短的常规绑定 LISP编程

它支持任何LISP,甚至有Clojure内联eval、内联args、内联doc和goto符号 苹果酒

它还有一个简单的多行快捷方式,可以实现您想要的效果 特殊功能

lispy模式
打开时,您需要将光标定位在
defn
之前或之后的参数上 排在这一行末尾的那一列。然后按M键将表达式格式化为多个 台词

要将其重新格式化为一行,请按O

要改进格式不正确的表达式,请执行以下操作:

(defn init globals[](def*板宽*15
)
)
导航到适当的参数并按i

如果您碰巧对某个M的结果不完全满意,您 可以使用h、j、k、l和
f、 d用于按参数导航。

def在其他表单中通常是一个坏消息idea@noisesmith我认为这里的外部def应该是一个发出列表(def…)的宏,后面的引号在翻译过程中丢失了。只需使用以下列表中任何合适的clojure代码编辑器:
[:emacs]
,它就可以帮您完成;)非常感谢。这些正是我一直在寻找的东西。我现在正在测试它们。我还发现了“elisp格式”,它似乎做得很好(但您必须使用clomacs与elisp进行互操作)。当我完成后,我将尝试发布我的最终解决方案。关于,为什么我要这样做。真的,我只是在学习宏。如果这是真的,我只会签入宏并每次生成它。但是如果我能看到gen’d代码是什么样子的话,它将真正帮助我——宏代码很难阅读。此外,我可能在一家不允许使用gen’d代码的商店工作,但我可以生成代码,然后假装自己是手工编写的!我知道,愚蠢的想法,我只是想探索什么对宏有效/无效的可能性。