2012-03-15 12 views
6

イム取得恐ろしい*ここで簡単な数学関数でIFNエラーにキャストすることはできません。のClojure:整数型IFNにキャストすることはできません

(defn calc [sc1 m1 alpha beta gamma ta1 tb1 min_m1 min_tca tca_ratio x32] 
     (* 
      (max(0, 
       (+ 
       (* alpha log(sc1)) 
       (* beta log(m1)) 
       (* gamma (/ ta1 tb1)) 
       (- log(ta1) log(tb1))))) 

      (max(x32,(/ m1 min_m1))) 

      (max(x32,(/ tca_ratio min_tca))))) 

;;;;;;;;;;;;

argsが、単純に数字の集まりです:私はこのエラーを取得するとき

(calc 1 2 3 4 5 1 2 3 4 5 1) 

私の考え/私の質問

は通常、私はそれが

1によるものです見つけます)余分な括弧(つまり、私が誤って自分のコード内の余分な閉鎖を入れているとき)OR

2)misorderedされている引数(明らかにキャスト例外)。

私の質問は、このスニペットを修正する方法...単純で、必要に応じて - どのように私は一度、すべてこの共通の例外を倒すことができますか?私のClojureコーディングの探検隊では非常に頻繁に発生するようですが、私はまだ適切な開発スタイルをまだ持っていないかもしれないと思っています。

--------------------------------------------- ----------

UPDATE:

私はunregular構文を使用して自分のコードを吟味しました。エラーは内部関数にあり、 はJava/Cスタイルの関数を使用していました。例えばmax/log ...

答えて

6

log(sc1)などで問題があるようです。 、あなただけのJavaログを使用する場合は

(defn calc [sc1 m1 alpha beta gamma ta1 tb1 min_m1 min_tca tca_ratio x32] 
    (* 
    (max 0 
      (+ 
      (* alpha (log sc1)) 
      (* beta (log m1)) 
      (* gamma (/ ta1 tb1)) 
      (- (log ta1) (log tb1)))) 

    (max x32 (/ m1 min_m1)) 
    (max x32 (/ tca_ratio min_tca)))) 

java.lang.Mathの静的ログ機能を呼び出すMath/loglogを置き換える:

は(仮定ログがどこかで定義されている)のようなものを見てするべき

+0

ではなく、万人命じた引数の引数としてマップを渡すことを検討して '使用:keys'非構造マクロを。 –

14

問題のある表現が(x32、(/ m1 min_m1))、(x32、(/ tca_ratio min_tca))、そしてlog(..)のように見えます。

Clojureのは、引用符で囲まれていないリストの最初の要素が呼び出す関数で有するの標準Lispの規則に従います。言い換えれば、あなたの代わりに、ログの(ログ...)持っていると思います(...)と(最大...)の代わりに(MAX(...))の

これらのエラーをキャッチすることで非常に簡単ですあなたの特定のスタイル:。XXXは、非空間の任意の数、非括弧文字はエラーである「XXXを(」一致したすべて

0
how can I defeat this common exception once and for all 

時間で、あなたがdynamic typingで良くなる練習

1

この種のデバッグでは、clojure.stacktraceなどを使用することでメリットが得られます(Clojure 1.3で私が研究していないより良い/改善されたオプションがあるかもしれません)。Obtain a callstack in Clojure d http://tech.puredanger.com/2010/02/17/clojure-stack-trace-repl/

*eは、replで最新の例外にバインドされていることに注意してください。例えば

user=> (defn broken [x] 
     (let [internal (fn [y] (y))] 
      (internal x)))

user=> (broken 1) java.lang.ClassCastException: java.lang.Integer cannot be cast to clojure.lang.IFn (NO_SOURCE_FILE:0)

user=> (use 'clojure.stacktrace)

user=> (print-stack-trace (root-cause *e) 2) java.lang.ClassCastException: java.lang.Integer cannot be cast to clojure.lang.IFn at user$broken$internal__1206.invoke (NO_SOURCE_FILE:2) user$broken.invoke (NO_SOURCE_FILE:3)

関連する問題