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
Clojure 如何正确使用pprint换行符?_Clojure_Output_Pretty Print - Fatal编程技术网

Clojure 如何正确使用pprint换行符?

Clojure 如何正确使用pprint换行符?,clojure,output,pretty-print,Clojure,Output,Pretty Print,我试图打印一个序列,这样既不会将整个序列打印在一行上,也不会将序列的每个元素打印在自己的行上。例如 [10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29] 我在文档中找到了pprint换行符,这表明我可以确定如何打印换行符。不幸的是,我找不到任何关于如何将其与pprint结合使用的示例,文档字符串也没有提供太多的细节: ------------------------- clojure.pprint/pprint-newli

我试图打印一个序列,这样既不会将整个序列打印在一行上,也不会将序列的每个元素打印在自己的行上。例如

[10 11 12 13 14 15 16 17 18 19
 20 21 22 23 24 25 26 27 28 29]
我在文档中找到了pprint换行符,这表明我可以确定如何打印换行符。不幸的是,我找不到任何关于如何将其与pprint结合使用的示例,文档字符串也没有提供太多的细节:

-------------------------
clojure.pprint/pprint-newline
([kind])
  Print a conditional newline to a pretty printing stream. kind specifies if the 
newline is :linear, :miser, :fill, or :mandatory. 

This function is intended for use when writing custom dispatch functions.

Output is sent to *out* which must be a pretty printing writer.
pprint为编写器指定可选的第二个参数,默认设置为*out*。但是,在这种情况下,我不确定如何将pprint writer“发送”到*out*,例如,下面的示例似乎不起作用

(clojure.pprint/pprint [1 2 3 4] (*out* (clojure.pprint/pprint-newline :miser)))

正如帮助所说,该函数旨在用于自定义分派函数

为了更改序列的pprint行为,您需要为clojure.lang.ISeq提供一个新的分派函数

序列的当前调度函数可以在clojure/pprint/dispatch.clj中找到

由于打印是根据数据类型进行调度的,所以覆盖似乎是一种可行的方法


有关想法,请参见。

如帮助所述,该函数旨在用于自定义分派函数

为了更改序列的pprint行为,您需要为clojure.lang.ISeq提供一个新的分派函数

序列的当前调度函数可以在clojure/pprint/dispatch.clj中找到

由于打印是根据数据类型进行调度的,所以覆盖似乎是一种可行的方法


有关想法,请参阅。

虽然Guillermo解释了如何更改派送以进行一般的漂亮打印,但如果您只想以不同的方式打印一个集合,这也是可能的

例如,在使用“[clojure.pprint:as pp:

根据需要设置*打印右边距*

您不必为此使用format。如果需要,可以将format指令转换为它们各自的漂亮打印机函数。格式字符串说明:~建立一个逻辑块。块内有三个部分,用~;;分隔。第一部分和最后一部分是前缀和后缀,而元素是打印的在中间部分,使用~@ {和}}。对于每个元素,元素使用~A打印,后面跟着一个空格,如果需要的话,还有一个条件填充类型换行符。
在CL中,格式字符串可以简化为~~%,但这在Clojure 1.5中似乎不起作用。

而Guillermo通常解释了如何更改漂亮打印的分派,如果您只想以不同的方式打印一个集合,这也是可能的

例如,在使用“[clojure.pprint:as pp:

根据需要设置*打印右边距*

您不必为此使用format。如果需要,可以将format指令转换为它们各自的漂亮打印机函数。格式字符串说明:~建立一个逻辑块。块内有三个部分,用~;;分隔。第一部分和最后一部分是前缀和后缀,而元素是打印的在中间部分,使用~@ {和}}。对于每个元素,元素使用~A打印,后面跟着一个空格,如果需要的话,还有一个条件填充类型换行符。
在CL中,格式字符串可以简化为~~%,但在Clojure 1.5中似乎不起作用。

谢谢您的解决方案-它工作得非常好。但是,您能告诉我以下内容的含义吗:如果您愿意,格式指令可以翻译成各自漂亮的打印机函数。这是否需要编写dispatc正如Guillermo在下面指出的h函数?也许这将是奥术CL样式格式字符串的更好替代方案…格式指令和Guillermo答案中的函数之间存在对应关系:~<…~:>是pprint逻辑块,~@{…~}是打印长度循环等。请注意,我使用的是~:,对应于pprint换行符:fill,而不是:linear。您应该能够直接使用这些函数进行打印,而不仅仅是调度,但您必须正确设置所有内容,即使用带有*out*的get pretty writer等。不过,仅绑定它对我不起作用。我取得了一些成功使用set!,但这感觉有点黑客味,所以请查看文档或源代码。再次感谢。我可能必须打开常见的Lisp hyperspec并阅读CL格式…不客气。是的,阅读CL pretty打印机肯定会有所帮助。但是尽管Clojure pretty打印机深受it XP和通用c的影响概念应该是相同的,但在引擎盖下会有差异。就像上面提到的那样,正确设置*out*。如果你只想打印一个集合,cl格式的解决方案就足够了。当然,它看起来相当神秘,但另一方面,它是一个强大、紧凑的DSL,用于格式化输出。对于任何更复杂的东西,例如custom数据格式或语言
e、 我建议创建一个自定义调度表。感谢您的解决方案-它工作得非常好。但是,您能告诉我以下内容的含义吗:如果您愿意,可以将格式指令转换为各自的漂亮打印机功能。这是否需要编写一个调度函数,如Guillermo所示?也许这将是一个更好的替代奥术CL样式格式字符串的方法…在Guillermo的答案中,格式指令和函数之间存在对应关系:~<…~:>是pprint逻辑块,~@{…~}是打印长度循环,等等。请注意,我使用的是~:,对应于pprint换行符:fill,而不是:linear。您应该能够直接使用这些函数进行打印,而不仅仅是发送,但您必须正确设置所有内容,即使用带*out*的get pretty writer等。不过,仅绑定它对我不起作用。我在set方面取得了一些成功!,但这让人觉得有点黑客味,所以请查看文档或来源。再次感谢。我可能不得不打开公共Lisp hyperspec并阅读CL格式…不客气。是的,阅读有关CL pretty打印机的信息肯定会有所帮助。但是,虽然Clojure pretty打印机受到it XP的强烈影响,并且一般概念应该是相同的,但在幕后会有差异。如上文所述,正确设置*out*。如果您只想打印一个集合,那么cl格式的解决方案就足够了。当然,它看起来相当神秘,但另一方面,它是一个强大、紧凑的DSL,用于格式化输出。对于任何更复杂的内容,例如自定义数据格式或语言,我建议创建一个自定义调度表。谢谢。这似乎是最终的出路。但现在,丹雷的解决方案满足了我的要求。谢谢。这似乎是最终的出路。但就目前而言,danlei的解决方案满足了我的要求。
(use-method simple-dispatch clojure.lang.ISeq pprint-list) 
...
(defn- pprint-simple-list [alis]
    (pprint-logical-block :prefix "(" :suffix ")"
      (print-length-loop [alis (seq alis)]
        (when alis
      (write-out (first alis))
      (when (next alis)
        (.write ^java.io.Writer *out* " ")
        (pprint-newline :linear)
        (recur (next alis)))))))    
(binding [pp/*print-pretty* true
          pp/*print-miser-width* nil
          pp/*print-right-margin* 10]
  (pp/cl-format true "~<[~;~@{~a~^ ~:_~}~;]~:>~%" '[foo bar baz quux]))