سؤال

عند اختبار الوحدة لبعض التعليمات البرمجية التي تترجم تسلسلات ascii إلى أحرف Unicode، وجدت مشكلة في إخراج اختبارات Clojure.

لقد اختبرت أن الجهاز الطرفي الخاص بي يمكنه إخراج أحرف unicode (عن طريق فحص ملفات الاختبار) وهذا يعمل بشكل جيد، لذا تبدو المشكلة مرتبطة بـ leiningen أو Clojure أو clojure.test بطريقة ما.

فيما يلي مثال للاختبار (باستخدام القسم اليوناني من Unicode - سأستخدم أيضًا اللغة اليونانية الموسعة ولكني أفترض أن نفس المشكلات ستنطبق):

(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.

ما الخطأ الذي أفعله هنا؟هل هذه مشكلة مضاهاة نهائية أو شيء متعلق بالغلق؟أواجه نفس المشكلة في تشغيل التعليمات البرمجية في REPL باستخدام Slime/swank/emacs.يقوم REPL في emacs بإخراج علامات الاستفهام فقط لمخرجات Unicode (على الرغم من أن emacs قادر تمامًا على فهم Unicode).

لقد حاولت تشغيل هذا في Terminal وiTerm (OS X) بنفس النتائج.

هل كانت مفيدة؟

المحلول

اتضح أنه يمكنك تمرير الخيارات إلى 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"])

نصائح أخرى

يبدو 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/wank/clojure-maven-plugin/maven

في 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، أو في قطعة أخرى مشتركة بين Leiningen وmaven والتي ترتبط بـ jLine.

أو بالطبع، قد يكون هناك فشلان مستقلان متعلقان باليونيكود.

إليك ملف 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>

أقدر أن هذه ليست إجابة، لكنني أعتقد أنها قد تكون مفيدة.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top