5

:Clojure में समारोह "लागू करें" का उपयोग कर त्रुटि: "से ISeq बनाने का तरीका जानते हैं नहीं: java.lang.Long" (पी। 63) "एक्शन में Clojure" में निम्न उदाहरण पर कार्य करना

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

आरईपीएल पर मूल्यांकन:

निम्न अपवाद में
(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

'लागू' एक फ़ंक्शन है, मैक्रो नहीं। – 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 लागू) स्पष्ट नहीं था: "तर्क सूची आर्ग के बीच बहस prepending द्वारा गठित करने के लिए च fn लागू होता है।" – dtg

+2

हाँ, डॉक तार के कुछ बहुत अपारदर्शी हो सकता है। [Cheatsheet] (http://clojure.org/cheatsheet) उदाहरण के उपयोगों के लिए एक महान जगह है। – Beyamor