5

は、「アクションでのClojure」(P 63)で、次の例の作業:エラー

(defn basic-item-total [price quantity] 
    (* price quantity)) 

(defn with-line-item-conditions [f price quantity] 
    {:pre [(> price 0) (> quantity 0)] 
    :post [(> % 1)]} 
    (apply f price quantity)) 

REPL上の評価:スローされる次の例外で

(with-line-item-conditions basic-item-total 20 1) 

結果:

Don't know how to create ISeq from: java.lang.Long 
    [Thrown class java.lang.IllegalArgumentException] 

を例外が目され表示されます適用プロシージャが評価された後のrown。

+1

'apply'は関数であり、マクロではありません。 – amalloy

答えて

8

applyの最後の引数は、sequence of argumentsとします。あなたのケースでは、使用量がより次のようになります。あなたは引数のリストで作業しているとき

(defn with-line-item-conditions [f price quantity] 
    {:pre [(> price 0) (> quantity 0)] 
    :post [(> % 1)]} 
    (apply f [price quantity])) 

applyが有用です。あなたの場合、単に関数を呼び出すことができます:

(defn with-line-item-conditions [f price quantity] 
    {:pre [(> price 0) (> quantity 0)] 
    :post [(> % 1)]} 
    (f price quantity)) 
+1

ありがとう - 私は今、適用マクロの場合、シーケンスはベクトルでなければならないことがわかります。これは、評価後の説明を読んだ後ではっきりしませんでした(doc適用): "fn fをargsに介在する引数を前置することによって形成された引数リストに適用します。" – dtg

+2

ええ、いくつかのドキュメント文字列はかなり不透明である可能性があります。 [チートシート](http://clojure.org/cheatsheet)は、使用例のための素晴らしい場所です。 – Beyamor

関連する問題