Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/assembly/5.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 漂亮的打印和扩展_Emacs_Macros_Clojure_Read Eval Print Loop_Pretty Print - Fatal编程技术网

Emacs 漂亮的打印和扩展

Emacs 漂亮的打印和扩展,emacs,macros,clojure,read-eval-print-loop,pretty-print,Emacs,Macros,Clojure,Read Eval Print Loop,Pretty Print,编辑我的问题不仅仅是“缩进”每一行代码,而是“漂亮的打印”和/或更广泛的“缩进”定义,即根据代码所包含的内容对行进行分组/拆分 这里有一个函数(我写这个函数是为了解决一个Euler问题,但这不是问题的关键:我本可以用不同的方式编写它),我正试图将它打印出来: 手动缩进的版本: (apply max (flatten (for [x (range 100 1000)] (map #(if (= (str (* x %)) (a

编辑我的问题不仅仅是“缩进”每一行代码,而是“漂亮的打印”和/或更广泛的“缩进”定义,即根据代码所包含的内容对行进行分组/拆分

这里有一个函数(我写这个函数是为了解决一个Euler问题,但这不是问题的关键:我本可以用不同的方式编写它),我正试图将它打印出来:

手动缩进的版本:

(apply max
       (flatten
        (for [x (range 100 1000)]
          (map
           #(if (= (str (* x %)) (apply str (reverse (str (* x %)))))
              (* x %)
              0)
           (range x 1000)))))
显然,这不是一种真正的Lisp缩进/打印样式,而且,由于我想从一开始就养成良好的习惯,我尝试“漂亮地打印”它,在Emacs的slime repl clojure repl中执行以下操作:

所以我试着做:

user> (pprint '(apply max
       (flatten
        (for [x (range 100 1000)]
          (map
           #(if (= (str (* x %)) (apply str (reverse (str (* x %)))))
              (* x %)
              0)
           (range x 1000))))))
我得到了以下信息:

(apply
 max
 (flatten
  (for
   [x (range 100 1000)]
   (map
    (fn*
     [p1__13958#]
     (if
      (=
       (str (* x p1__13958#))
       (apply str (reverse (str (* x p1__13958#)))))
      (* x p1__13958#)
      0))
    (range x 1000)))))
据我所知,lambda的#(…)符号是一个“reader宏”。那么,如何在不触发宏扩展的情况下进行漂亮打印呢?更一般地说:我如何漂亮地打印“我在文本编辑器中看到的内容”

另外,几乎所有的东西都在一条新的线路上,这是正常的吗?例如:

(apply
 max
 (flatten
  (for
   [x (range 100 1000)]
   (map
    ...
似乎是浪费了相当多的垂直屏幕房地产。这是Lisp代码缩进的方式吗

最后一个相关的问题是:Emacs是否可以配置为“漂亮地打印”选定的区域或整个.clj缓冲区?

没有“正式”的方式缩进lisp代码,但我喜欢clojure模式缩进clojure代码的方式(见下文)

我不知道为什么pprint会以这种方式打印代码,但据page称,这是一个早期版本,功能尚未完成


对于emacs缩进部分,您可能想看一看。

我所看到的最接近共识的是“像emacs一样缩进”,我认为这是正确的,我应该包括推论“像vim一样缩进”。其他编辑器(如eclipse+CCW)似乎与此非常匹配。虽然默认的漂亮打印机添加了更多的换行符

以下是我目前正在做的事情:

(defn pprint-code [code]
  (with-pprint-dispatch code-dispatch
    (binding [*print-suppress-namespaces* true]
      (pprint code))))
注意:查看clojure.pprint以解析可用变量

这当然是一个进步。我仍然不知道如何调整
*打印miser width*
和/或
*打印右边距*
,以获得更好的输出。YMMV。我现在的牛肉是(自动)gensyms的——我希望在某些情况下打印时需要它们

理想情况下,表单/函数可以定义自己的格式规则,例如,let绑定应始终位于单独的行上。我不知道能用clojure.core做这件事


如需参考,请参见此。

“没有“官方”方式缩进lisp代码没有“官方”方式缩进lisp代码”。。。啊。。。我以为有一个。或者至少是一种“文化上”接受的方式。例如,人们似乎普遍认为不应该在换行符上加上右括号:没有一个“漂亮的打印机”这样做,而且几乎没有任何由有知识的Lisp程序员编写的Lisp代码这样做。如果没有“官方”标准,那么我会采用“最常用”的方式来格式化Lisp代码;)Clojure模式的缩进可能接近于此。它与clojure.org和许多图书馆中使用的缩进差不多。。。为什么pprint会扩展lambda?这就是它的工作原理吗?
(defn pprint-code [code]
  (with-pprint-dispatch code-dispatch
    (binding [*print-suppress-namespaces* true]
      (pprint code))))