我是Clojure的新手,发现有一段代码如下
user=> (def to-english (partial clojure.pprint/cl-format nil
"~@(~@[~R~]~^ ~A.~)"))
#'user/to-english
user=> (to-english 1234567890)
"One billion, two hundred thirty-four million, five hundred sixty-seven
thousand, eight hundred ninety"
https://clojuredocs.org/clojure.core/partial#example-542692cdc026201cdc326ceb。我知道partial
做了什么,我检查了clojure.pprint/cl-format
doc,但仍然不了解它如何将整数翻译成英文单词。猜测秘密隐藏在"~@(~@[~R~]~^ ~A.~)"
后面,但我找不到阅读它的线索。
任何帮助将不胜感激!
答案 0 :(得分:4)
文档提到了它,但是有一个很好的资源来自Seibel的Practical Common Lisp A Few FORMAT Recipes。 另外,请检查HyperSpec中的§22.3 Formatted Output。
在Common Lisp中:
CL-USER> (format t "~R" 10)
ten
~@(...~^...)
是大小写转换,其中@
前缀表示大写(仅占第一个单词)。它包含一个向上转义操作~^
,在此上下文中标记了转换为case的结尾。当没有更多可用的参数时,它也会退出当前的上下文。~@[...]
是条件格式:内部格式仅在值为非零时应用于值。 ~A
表示该函数应该能够接受另一个参数并打印出来。事实上,您的示例与§22.3.9.2中的示例类似:
如果〜^出现在〜[或〜(构造,然后是所有命令) 〜^被正确选择或大小写转换,〜[或〜( 处理终止,向外搜索继续〜{或 〜<构造被终止。例如:
(setq tellstr "~@(~@[~R~]~^ ~A!~)")
=> "~@(~@[~R~]~^ ~A!~)"
(format nil tellstr 23) => "Twenty-three!"
(format nil tellstr nil "losers") => " Losers!"
(format nil tellstr 23 "losers") => "Twenty-three losers!"