有没有一种惯用的方法来避免长Clojure字符串文本?

有没有一种惯用的方法来避免长Clojure字符串文本?,clojure,idioms,Clojure,Idioms,各种Clojure风格指南建议避免使用超过80个字符的行。我想知道是否有一种惯用的方法来避免长字符串文本 虽然现在屏幕很宽很常见,但我仍然同意应该避免排长队 以下是一些示例(我很想遵循第一个示例): 我知道Clojure支持多行字符串文字,但使用这种方法会产生解释换行符的不良效果,例如使用repl: user=> (println "The quick brown fox #_=> jumps over the lazy dog") The quick brown fox

各种Clojure风格指南建议避免使用超过80个字符的行。我想知道是否有一种惯用的方法来避免长
字符串
文本

虽然现在屏幕很宽很常见,但我仍然同意应该避免排长队

以下是一些示例(我很想遵循第一个示例):

我知道Clojure支持多行
字符串
文字,但使用这种方法会产生解释换行符的不良效果,例如使用
repl

user=> (println "The quick brown fox
  #_=>   jumps over the lazy dog")
The quick brown fox
  jumps over the lazy dog

您可能应该将字符串存储在外部文本文件中,并从代码中读取该文件。如果仍然需要在代码中存储字符串,请继续使用
str

编辑:

根据要求,我将演示如何在编译时读取长字符串

(defmacro compile-time-slurp [file]
  (slurp file))
像这样使用它:

(def long-string (compile-time-slurp "longString.txt"))
(msgs/logged-in-msg (:user context))

您可以发明类似的宏来处理Java属性文件、XML/JSON配置、SQL查询、HTML或您需要的任何其他内容。

我发现使用
str
创建字符串并使用字符文本(如
\newline
\tab
而不是“\n”来打断它们很方便。
我很少以这种方式违反80列规则。

我所知道的最惯用的方式如下:

1)使用(str)将字符串拆分为多行

(str "User " (:user context)
     " is now logged in.")
这可能是最惯用的用法。我在多个库和项目中看到了这一点。它很快,因为(str)在引擎盖下使用StringBuilder。它还允许您透明地混合代码,就像我在示例中所做的那样

2)允许字符串在有意义时自行突破80个字符的限制

(format
  "User %s is now logged in."
  (:user context))
基本上,打破字符串的80个字符限制是可以的。在处理代码时,您不太可能关心读取字符串,偶尔您需要水平滚动

在这里,我将字符串包装为(格式),以便能够注入与前面示例类似的代码。你不需要


不那么惯用的方式是:

3)将字符串放入文件中,然后从文件中加载

(slurp "/path/to/userLoggedIn.txt")
(ns msgs)
(defn logged-in-msg [user]
  (format
"User %s is now logged in."
    user))
文件:
/path/to/userLoggedIn.txt
包含:

User logged in.
我建议不要这样做,因为:

  • 它引入了IO的副作用
  • 它有可能失败,比如路径错误、资源丢失或损坏、磁盘错误等
  • 它对性能有影响,磁盘读取速度慢
  • 如果需要,很难从代码中注入内容
我会说,只有当你的文本非常大的时候才这样做。或者如果字符串的内容需要由非开发人员更改。或者,如果内容是从外部获得的

4)有一个名称空间,您可以在其中定义所有字符串,并从中加载它们

(slurp "/path/to/userLoggedIn.txt")
(ns msgs)
(defn logged-in-msg [user]
  (format
"User %s is now logged in."
    user))
然后您可以这样使用:

(def long-string (compile-time-slurp "longString.txt"))
(msgs/logged-in-msg (:user context))
我喜欢这个胜过3个。您仍然需要允许在这里使用#2,在这里字符串可以突破80个字符的限制。事实上,这里您将字符串单独放在一行上,因此它们很容易格式化。如果使用checkstyle之类的代码分析,则可以从规则中排除此文件。它也不受#3问题的影响



如果你使用#3或#4,你可能会有一个特殊的字符串用例,比如国际化,或者让业务编辑它们,等等。在这些情况下,你可能会更好地构建一个更健壮的解决方案,可以从上述方法中得到启发,或者使用专门处理这些用例的库。

@Chiron:“有没有一种惯用的方法来避免长字符串文字?”这不是一个真正的问题?真的吗?我的初等教育都是谎言吗?你可能大部分时间都不应该把字符串放在文本文件中,除非我们谈论的是真正的大文本。它增加了操作成本、性能成本和代码复杂性。正确的答案是使用(str)。这是Clojure。
(slurp“myBigString.txt”)
不会增加代码的复杂性(并且没有字符串换行符复杂)。如果文件IO的性能存在问题,则该命令可能会在编译时通过宏运行。它会引入您现在需要考虑的不必要的可能故障,这是更高的代码复杂性。您是否认真建议人们在单个文本文件中放置超过80个字符的字符串?副作用的整个想法发生了什么t free函数?仅当文本非常大、外部提供或动态生成且需要持久化时才将其放入文件中。第二个注意事项是,在Clojure中不需要字符串中的换行符,字符串文本可以跨越多行,并将换行符保留为字符串的一部分。开发人员需要轻松编辑字符串.对于多行字符串,我自己的经验是,在文本文件中编辑它们比在源代码中编辑文本要容易得多。让代码读取该文件的额外复杂性是值得的,因为可以轻松地将文本编辑为单独的文件。