6

ASCIIシーケンスをUnicode文字に変換するコードを単体テストすると、Clojureテストの出力に問題があることがわかりました。

私の端末がUnicode文字を出力できることをテストしました(テストファイルをカタログ化することにより)。これは正常に機能するため、問題はleiningen、Clojure、またはclojure.testに何らかの形で関連しているようです。

テストの例を次に示します(ユニコードのギリシャ語セクションを使用します。ギリシャ語拡張も使用しますが、同じ問題が当てはまると思います)。

(deftest bc-string-w-comma
  (is (= "αβγ, ΑΒΓ" (parse "abg,*a*b*g"))))

入力にスペースがないために失敗することを意味します。からの出力lein testは次のとおりです。

Testing parse_perseus.test.betacode
FAIL in (bc-string-w-comma) (betacode.clj:15)
expected: (= "???, ???" (parse "abg,*a*b*g"))
  actual: (not (= "???, ???" "???,???"))
Testing parse_perseus.test.core
Testing parse_perseus.test.pluralise
Ran 10 tests containing 59 assertions.
1 failures, 0 errors.

私はここで何が間違っているのですか?これはターミナルエミュレーションの問題ですか、それともclojureに関連する問題ですか?Slime / swank/emacsを使用してREPLでコードを実行するときに同じ問題が発生します。emacsのREPLは、Unicode出力の疑問符のみを出力します(ただし、emacsはUnicodeをかなり理解できます)。

ターミナルとiTerm(OS X)でこれを実行してみましたが、同じ結果になりました。

4

2 に答える 2

6

次のように、オプションをjavaに渡して、の出力エンコーディングを強制し、*out*Unicodeが機能するようにすることができます。

java -Dfile.encoding=utf-8 -cp lib/clojure-1.2.0.jar:lib/clojure-contrib-1.2.0.jar clojure.main -i src/whatever.clj

Leiningenを使用しているので、このプロパティをproject.cljファイルに追加しました。

(defproject project_name "1.0.0-SNAPSHOT"
  :description "A Clojure Project"
  :dependencies [[org.clojure/clojure "1.2.0"]
                 [org.clojure/clojure-contrib "1.2.0"]]
  :dev-dependencies [[swank-clojure "1.2.0"]]
  :jvm-opts ["-Dfile.encoding=utf-8"])
于 2011-01-30T22:45:51.830 に答える
2

Clojure自体は明確に見えます(これはUbuntu 10.10、gnome-terminal、OpenJDKです):

john@woc-desktop$ java -cp /home/john/.m2/repository/org/clojure/clojure/1.2.0/clojure-1.2.0.jar:/home/john/.m2/repository/org/clojure/clojure-contrib/1.2.0/clojure-contrib-1.2.0.jar clojure.main
Clojure 1.2.0
user=> (use 'clojure.test)
nil
user=> (defn parse [s] "αβγ,ΑΒΓ")
#'user/parse
user=> (deftest greek (is (= "αβγ, ΑΒΓ" (parse ""))))
#'user/greek
user=> (run-tests)

Testing user

FAIL in (greek) (NO_SOURCE_FILE:3)
expected: (= "αβγ, ΑΒΓ" (parse ""))
  actual: (not (= "αβγ, ΑΒΓ" "αβγ,ΑΒΓ"))

Ran 1 tests containing 1 assertions.
1 failures, 0 errors.
{:type :summary, :test 1, :pass 0, :fail 1, :error 0}
user=> 

しかし、それは emacs/swank/clojure-maven-plugin/maven を壊します

emacsのREPLで:

> (is "αβγ""αβγ")

slime-net-send: Coding system iso-latin-1-unix not suitable for "000052(:emacs-rex (swank:listener-eval \"(is \\\"αβγ\\\"\\\"αβγ\\\")

\") \"user\" :repl-thread 33)
"

Maven、以下の単純な pom ファイル、および mvn clojure:repl を使用すると、問題ありません。

[INFO] [clojure:repl {execution: default-cli}]
Clojure 1.2.0
user=> (use 'clojure.test) (is "αβγ""αβγ")
nil
"αβγ"
user=> (defn parse [s] "αβγ,ΑΒΓ")
#'user/parse
user=> (deftest greek (is (= "αβγ, ΑΒΓ" (parse ""))))
#'user/greek
user=> (run-tests)

Testing user

FAIL in (greek) (NO_SOURCE_FILE:3)
expected: (= "αβγ, ΑΒΓ" (parse ""))
  actual: (not (= "αβγ, ΑΒΓ" "αβγ,ΑΒΓ"))

Ran 1 tests containing 1 assertions.
1 failures, 0 errors.
{:type :summary, :test 1, :pass 0, :fail 1, :error 0}
user=> 

しかし、このスニペットを使用して jline ライブラリを追加すると:

<dependency>
  <groupId>jline</groupId>
  <artifactId>jline</artifactId>
  <version>0.9.94</version>
</dependency>

それから私は得る:

[INFO] [clojure:repl {execution: default-cli}]
[INFO] Enabling JLine support
Clojure 1.2.0
user=> (use 'clojure.test) (is "αβγ""αβγ")
nil
"���"
user=> (defn parse [s] "αβγ,ΑΒΓ")
#'user/parse
user=> (deftest greek (is (= "αβγ, ΑΒΓ" (parse ""))))
#'user/greek
user=> (run-tests)

Testing user

FAIL in (greek) (NO_SOURCE_FILE:3)
expected: (= "���, ���" (parse ""))
  actual: (not (= "���, ���" "���,���"))

Ran 1 tests containing 1 assertions.
1 failures, 0 errors.
{:type :summary, :test 1, :pass 0, :fail 1, :error 0}
user=> 

これはあなたのエラーのように見えます。したがって、問題は jLine にあるか、または jLine に関連付けられている Leiningen と Maven に共通する他の部分にある可能性があります。

またはもちろん、2 つの独立した Unicode 関連の障害が発生する可能性もあります。

誰かがこれをデバッグしようとしている場合に備えて、これが私の maven pom.xml ファイルです。

<project>

  <modelVersion>4.0.0</modelVersion>
  <groupId>com.aspden</groupId>
  <artifactId>maven-clojure-simple</artifactId>
  <version>1.0-SNAPSHOT</version>
  <name>maven-clojure-simple</name>
  <description>maven, clojure: simple project</description>

  <repositories>

    <repository>
      <id>clojure</id>
      <url>http://build.clojure.org/releases</url>
    </repository>
    <repository>
      <id>central</id>
      <url>http://repo1.maven.org/maven2</url>
    </repository>
  </repositories>

  <dependencies>
    <dependency>
      <groupId>org.clojure</groupId>
      <artifactId>clojure</artifactId>
      <version>1.2.0</version>
    </dependency>
  </dependencies>

  <build>
    <plugins>
      <plugin>
    <groupId>com.theoryinpractise</groupId>
    <artifactId>clojure-maven-plugin</artifactId>
    <version>1.3.5-SNAPSHOT</version>
      </plugin>
    </plugins>
  </build>

</project>

これが答えではないことを感謝しますが、役立つかもしれないと思いました。

于 2011-01-30T17:25:58.740 に答える