【问题标题】:Translate System.out.format to Clojure将 System.out.format 翻译成 Clojure
【发布时间】:2016-08-18 07:24:40
【问题描述】:

我已经用 Java 编写了一些实用程序,现在我只想 将其翻译成 Clojure。我遇到了一些障碍 类。 Clojure 吹捧它与 Java 具有无缝互操作性, 但我无法从谷歌找到好的解决方案。请 帮助。谢谢。

我想直接使用 Java 类(我不想使用 clojure “格式”功能,因为我只是想看看如何 clojure-java-interop 成功):

System.out.format("Enter number of points: ");

我所做的是:

(def x (. System out))

但是我尝试使用格式所做的一切都失败了:

(. x format "foo")
(. x (format "foo"))
(.format x)
(.format "foo")
(. x format)
(. x #(format))
(. x #(format %) "s")
(.format x "foo")
((.format x) "foo")
(x/format "foo")
(x. format "%s" "foo")
(. x format "%s" "s")
(. x format "%s" ["s"])
(def y (System.out.))
(def y (System.out.format.))
(format x "s")

那么将 System.exit(0) 翻译成 clojure 怎么样?

(. System exit 0) 

似乎确实有效。但是为什么类似的翻译对“System.out.format”不起作用?

我就像一只在键盘上打字的猴子,希望能产生哈姆雷特!

请帮忙!谢谢。

【问题讨论】:

    标签: java class clojure format interop


    【解决方案1】:

    System.out.format 接受可变参数。 java 调度 var args 函数的方式是将其余的参数放入一个 Object 数组中。这可以像这样在 clojure 中实现:

    (. System/out format "abc" (into-array []))
    (. System/out format "abc %d" (into-array [12]))
    
    ;; or use the more intuitive
    (.format System/out "abc %d" (into-array[12]))
    

    实际上你的很多尝试都非常接近:

    (def x (. System out))
    (. x format "foo" (into-array[]))
    (. x (format "foo" (into-array[])))
    (.format x "foo" (into-array[]))
    (. x format "%s" (into-array["foo"]))
    

    但是,请注意,这将打印到 repl 控制台,而不一定是您的 ide 显示的内容。

    要像 clojure 一样显示它,不要使用 java 的 System.out 对象,而是使用 clojure 的 *out*

    (. *out* format "abc %d" (into-array [12])) 
    ;; "abc 12"
    

    编辑

    您的*out* 似乎被定义为OutputStreamWriter,它没有format 方法。不知道为什么,但您可以使用绑定来克服这个问题,例如:

    user=> (binding [*out* System/out]
             (. *out* format "abc %d" (into-array[12])))
    abc 12#object[java.io.PrintStream 0x4efb0c88 "java.io.PrintStream@4efb0c88"]
    

    【讨论】:

    • 非常感谢!我专门尝试测试 Cjoures 声称它可以“无缝”与 Java 一起使用。一般来说,如何将 Java 代码:object1.object2.object3.object4.object5.objectnth.method(arg1, arg2, argn) 翻译成 Clojure?
    • 我有一个答案给你,它的例子很长:) 但是我认为你应该问一个新问题,如果这回答了你当前的问题,那么请接受它。
    • 好的,太好了!非常感谢您的帮助!我将发布另一个问题并将其命名为:“将 java 对象和方法调用转换为 Clojure 代码。”
    • 我回家测试了*out*;它没有按预期工作:user=> (. *out* (format "%d" (into-array [3]))) IllegalArgumentException 找不到匹配的方法:类 java.io.OutputStreamWriter clojure.lang.Reflector 的格式.invokeMatchingMethod (Reflector.java:53) user=> (format "%d" 3) "3" 我必须在没有 *out* 的情况下这样做;
    • @lisprogtor 那是因为你不小心用括号包裹了格式部分。如果您将它们排除在外,则意味着“使用这些参数在对象 /*out/* 上执行格式方法”
    【解决方案2】:

    Clojure 已经有一个 printf 函数,它与 PrintStream.format 做同样的事情,除了它专门打印到 *out*

    (printf "Enter number of points: ")
    ;; Enter number of points: 
    
    (printf "abc %d" 12)
    ;; abc 12
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-10-13
      • 1970-01-01
      • 2014-01-30
      • 2010-11-07
      • 1970-01-01
      相关资源
      最近更新 更多