Clojure > Archives > 2010/11/30

2010/11/30 06:52:16 UTCfatrow
#
再現しますね。
#
$ java -version
java version "1.6.0_20"
Java(TM) SE Runtime Environment (build 1.6.0_20-b02-279-10M3065)
Java HotSpot(TM) 64-Bit Server VM (build 16.3-b01-279, mixed mode)
$ uname -a
Darwin hozumiMac.local 10.4.0 Darwin Kernel Version 10.4.0: Fri Apr 23 18:27:12 PDT 2010; root:xnu-1504.7.4~1/RELEASE_X86_64 x86_64
#
$ wget http://media.pragprog.com/titles/shcloj/code/shcloj-code.tgz
$ tar xzf shcloj-code.tgz
$ cd code
$ bin/repl.sh 
Clojure 1.1.0-alpha-SNAPSHOT
user=> (use 'lancet.step-5-complete) 
nil
user=> (def sleep (instantiate-task ant-project "sleep" {:seconds 2}))
java.lang.ClassCastException (NO_SOURCE_FILE:2)
#
または lancet.step_4_complete.clj 内の step-2-complete を step-5-complete に変えて
#
$ bin/repl.sh                     
Clojure 1.1.0-alpha-SNAPSHOT
user=> (use 'lancet.step-4-complete)
nil
user=> (sleep {:seconds 2})         
java.lang.ClassCastException (NO_SOURCE_FILE:0)
2010/11/30 17:36:13 UTCshiro
#
ありがとうございます。確かにその手順だと再現しますね。
#
(use 'lancet.step-4-complete) (use 'lancet.step-5-complete) の順にロードするとエラーは出ない。
#
これはinstantiate-taskがマルチメソッド定義前に走るからかな。もしかすると原著者もこの順でロードすることを前提にしていたのかもしれない。
#
でもlancet本家のソースでもcoerceの定義は直ってないんだよなあ。こちらは先にcoerceが定義されちゃうと思うんだけど。 https://github.com/stuarthalloway/lancet/blob/master/lancet.clj
2010/11/30 18:11:08 UTCshiro
#
本家のlancetソースでもinstantiate-taskでエラーになることを確認しました。原著者の意図がわからないので、サポートページにて情報提供することにします。
2010/11/30 21:08:22 UTCfatrow
#
step-4-complete の最後に (define-all-ant-tasks) があるため、(use 'lancet.step-4-complete) (use 'lancet.step-5-complete) の順に use すると step-5-complete は作成された sleep 関数に反映されていないです。問題は単に Class オブジェクトが primitive 型を表していると cast ができないというところなので、
#
(defmethod coerce :default [dest-cls obj]
           (if (.isPrimitive dest-cls) obj (cast dest-cls obj)))
#
で大丈夫でした。
2010/11/30 22:13:12 UTCshiro
#
ありがとうございます。Stuartに伝えてupstreamに反映してもらうのがいいかな。
2010/11/30 22:17:39 UTCfatrow
#
本家にはもう伝えたので大丈夫だと思います。