Exception 使用“错误”;套用;Clojure中的函数:“quot;Don';我不知道如何从:java.lang.Long“创建ISeq;

Exception 使用“错误”;套用;Clojure中的函数:“quot;Don';我不知道如何从:java.lang.Long“创建ISeq;,exception,clojure,higher-order-functions,first-class-functions,Exception,Clojure,Higher Order Functions,First Class Functions,在“Clojure in Action”(第63页)中处理以下示例: 对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] 在计算应用过程之后,似乎正在抛出异常。应用的最后一个参数应该是。在您的情况下,

在“Clojure in Action”(第63页)中处理以下示例:

对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]

在计算应用过程之后,似乎正在抛出异常。

应用的最后一个参数应该是。在您的情况下,用法可能更像这样:

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

谢谢-我现在明白了,在apply宏的情况下,序列应该是一个向量。在阅读了评估后的描述(doc apply)后,这一点并不清楚:“将fn f应用于参数列表,该列表是通过将插入的参数预先添加到args而形成的。”是的,一些doc字符串可能非常不透明。是一个很好的使用示例的地方。
apply
是一个函数,而不是宏。
(defn with-line-item-conditions [f price quantity] 
    {:pre [(> price 0) (> quantity 0)]
     :post [(> % 1)]} 
    (f price quantity))