这段代码如何将数字翻译成英文?

时间:2018-01-03 22:04:19

标签: clojure

我是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.~)"后面,但我找不到阅读它的线索。

任何帮助将不胜感激!

1 个答案:

答案 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!"