Clojure <> ClojureScript; 例如:"format" 函数

29

在Clojure中有一个非常方便的函数,名为format。 它以易于模板化字符串而著称。大多数编程语言都提供了这个函数。

令人不爽的是发现ClojureScript没有实现这个函数。据我所知,旧版本中实现了该函数,但最新版本中并不包含该函数。

是否有人知道这是出于何种原因?


2
我本以为 clojure.pprint/cl-format 在 Clojurescript 中也可以使用。它是 Clojure 的基于 Java 的 format 的替代品。在我进行的一个快速测试中,似乎 clojure.pprint 在 Clojurescript 中不可用,但我不知道为什么会这样。 - Mars
2
如果我没记错的话,cl-format 在 ClojureScript 的 cljs.pprint 命名空间中。 - leetwinski
2个回答

31

format 在 ClojureScript 中存在。它来自于 Google Closure Library(GCL),是 ClojureScript 的基本组成部分。不幸的是,使用它可能有些棘手。常规方法是要求同时引入 [goog.string :as gstring][goog.string.format],然后使用 gstring.format。例如:

(ns rostering.components.services
  (:require 
    [goog.string :as gstring]
    [goog.string.format]))

(str "$" (gstring/format "%.2f" 2.5))

在这个简短页面的底部有一个几乎相同的例子,文档中也有相关内容。

GCL是ClojureScript的一部分,这点我再怎么强调都不过分。这里还有另外一个参考资料。这意味着format是ClojureScript的一部分。

下面是引用该参考资料的话:

Google Closure Library是谷歌开发的JavaScript库,基于模块化架构,提供跨浏览器的DOM操作和事件、Ajax和JSON等功能。

它是专为利用Closure Compiler(ClojureScript编译器内部使用的编译器)而编写的。

ClojureScript是建立在Closure Compiler和Closure Library之上的。事实上,ClojureScript名称空间就是Closure模块。


1
你的最后一行为什么不直接写成(gstring/format "$%.2f" 2.5)呢? - gfredericks
format函数的第一个参数是“格式字符串”。与“%”不同,“$”不是“格式字符串”的一部分。 - Chris Murphy
2
为什么它不能成为格式字符串的一部分呢?那似乎是更简单的方法。 - gfredericks
2
很可能它可以成为格式字符串的一部分。然而,使用任何超出其明确定义限制的函数都会让我感到非常不舒服。事实上,测试任何硬件或软件超出其目的是在自找麻烦,并会引起维护问题。例如,在这里,我可以想象有人查阅文档以查看“$”是否实际上是格式化字符,而我并不知道它是否是! - Chris Murphy
4
我认为在这份遗产中,所有格式函数的约定(gstring/format文档直接引用printf)都是以“%”开头,因此任何其他字符都可以。如果不能依赖这一点,它们将会不太有用。另一个例子是java.util.Formatter的文档(作为clojure.core/format的基础),其中提供了一个带有美元符号的示例:"Amount gained or lost since last statement: $ %(,.2f" - gfredericks
显示剩余2条评论

20

这个相关的jira票据上的评论可能会有所帮助:

撤销这个操作,goog.string.format不符合高级优化,并且它提供的能力少于Clojure的format——因为它使用了java.util.Formatter。对于它实际提供的功能来说,人们可以自己替换一下它,这很简单。对于引起混乱的问题,我们表示歉意。


请参考另一个答案,了解应该使用什么(goog.string.format)。 - Joaquin

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接