2011-08-20 3 views
5

Clojure 시간 매크로에 "message"옵션을 추가하려고합니다. 기본적으로 시간의 출력에 선택적 사용자 지정 메시지를 추가하려고합니다. 내 프로그램에서 병목 현상을 발견하려고 노력 중이며 시간 출력에 첨부 된 설명 메시지가 도움이 될 것입니다.매크로에 선택적 인수 추가

;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

MSG가 목록이기 때문에 예외를 throw,

는 매크로

(time (+ 1 1) "asd") 

MSG가 실패 함수 호출 ("ASD를")이되고, 당신이 그것을 호출 말한다. 그냥 destructure MSG,

[expr & [msg]] 

하고, 또한 macroexpand로 확장하는 방법 매크로를 테스트 할 수 있습니다

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

점 또한 몇

  • 시간을

    ~msg 
    

    를 사용 이미 핵심에있다.

  • 귀하의 버전은 단일 표현식 만 허용하고 시간을 계산합니다.

편집 : 선택적인 메시지와 시간, 내가 코어 버전을 사용하고

 

(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 네가 맞다. 나쁜 코어 버전도 단일 인수를 허용한다. 또한 선택적 인수가있는 버전을 추가했습니다. –

관련 문제