2011-08-20 29 views
5

पर वैकल्पिक तर्क जोड़ना मैं क्लोजर टाइम मैक्रो में एक विकल्प "संदेश" विशेषता जोड़ने की कोशिश कर रहा हूं। असल में मैं समय के आउटपुट में एक वैकल्पिक कस्टम संदेश जोड़ना चाहता हूं। मैं अपने कार्यक्रम में एक बाधा खोजने की कोशिश कर रहा हूं और समय के आउटपुट से जुड़े कुछ वर्णनात्मक संदेश बहुत उपयोगी होंगे।मैक्रो

;optional argument 
(defmacro time 
    "Evaluates expr and prints the time it took. Returns the value of 
expr." 
    {:added "1.0"} 
    [expr & msg] 
    `(let [start# (. System (nanoTime)) 
     ret# ~expr] 
    (prn (str "Elapsed time: " (/ (double (- (. System (nanoTime)) start#)) 1000000.0) " msecs. " (first ~msg))) 
    ret#)) 

और

(defmacro time 
    "Evaluates expr and prints the time it took. Returns the value of 
expr." 
    {:added "1.0"} 
    ([expr] (time expr "")) 
    ([expr msg] 
    `(let [start# (. System (nanoTime)) 
     ret# ~expr] 
    (prn (str "Elapsed time: " (/ (double (- (. System (nanoTime)) start#)) 1000000.0) " msecs. " ~msg)) 
    ret#))) 

दोनों फेंक अपवाद:

मैं निम्नलिखित की कोशिश की है। मैं यह काम कैसे पूरा कर सकता हूं?

उत्तर

4

यह एक अपवाद फेंकता है क्योंकि संदेश एक सूची है,

कहते हैं कि तुम से कॉल करने, मैक्रो में

(time (+ 1 1) "asd") 

संदेश एक समारोह कॉल, ("asd") जो विफल रहता हो जाता है। बस destructure संदेश,

[expr & [msg]] 

और

~msg 

का उपयोग तुम भी परीक्षण कर सकते हैं कि कैसे मैक्रो macroexpand साथ विस्तार कर रहे हैं,

(macroexpand '(time (+ 1 1) "asd")) 

अंक के अलावा जोड़ी,

  • समय पहले से ही कोर
  • में है
  • आपका संस्करण केवल एक अभिव्यक्ति स्वीकार करता है और समय देता है।

संपादित करें: वैकल्पिक संदेश के साथ समय,

 

(defmacro time 
    "Evaluates expr and prints the time it took. Returns the value of 
expr." 
    {:added "1.0"} 
    [expr & [msg]] 
    (let [msg (if (nil? msg) "" msg)] 
    `(let [start# (. System (nanoTime)) 
     ret# ~expr] 
     (prn (str "Elapsed time: " (/ (double (- (. System (nanoTime)) start#)) 1000000.0) " msecs. " ~msg)) 
     ret#))) 
 
(time (+ 1 1)) 
"Elapsed time: 0.068 msecs. " 
2 

(time (+ 1 1) "asd") 
"Elapsed time: 0.067 msecs. asd" 
2 
+0

मैं मूल संस्करण का उपयोग किया गया है, लेकिन इस मामले के लिए एक डीबग संदेश वास्तव में मेरे लिए उपयोगी होगा। क्या ऐसा करने के लिए इससे अच्छा तरीका है? शायद कुछ प्रकार के रैपर मैक्रो? क्या मूल संस्करण केवल एक अभिव्यक्ति को स्वीकार नहीं करता है? – erikcw

+0

@erikcw हाँ आप सही हैं मेरे खराब कोर संस्करण भी एक तर्क स्वीकार करता है। एक वैकल्पिक तर्क के साथ एक संस्करण भी जोड़ा –