방금 내 가정용 프로젝트 중 하나에서 log4j를 사용하기 시작했으며 큰 모듈의 모든 기능에 마우스를 잘라내어 붙여 넣기 (trace (str "entering: " function-name))
을 잘라 냈습니다. 이성의 목소리가 잡아 당기면서 "더 나은 방법이 될 수 밖에 없다"고 말했습니다 ... 나는 모든 기능 블록을 감싸고 그 흔적을 그들에게 추가하는 것을 생각할 수 있습니다. 현명한 Stack-Overflowing-Clojurians의 충고?clojure : 네임 스페이스의 모든 함수에 디버그 추적을 추가 하시겠습니까?
17
A
답변
17
매크로에 대한 필요가 없습니다 : 비슷한
(defn trace-ns
"ns should be a namespace object or a symbol."
[ns]
(doseq [s (keys (ns-interns ns))
:let [v (ns-resolve ns s)]
:when (and (ifn? @v) (-> v meta :macro not))]
(intern ns
(with-meta s {:traced true :untraced @v})
(let [f @v] (fn [& args]
(clojure.contrib.trace/trace (str "entering: " s))
(apply f args))))))
(defn untrace-ns [ns]
(doseq [s (keys (ns-interns ns))
:let [v (ns-resolve ns s)]
:when (:traced (meta v))]
(alter-meta! (intern ns s (:untraced (meta v)))
#(dissoc % :traced :untraced))))
... 또는 뭔가. 가장 가능성있는 추가 요구 사항은 ifn?
이 아닌 항목에 trace
을 호출하지 않으려면 filter
을 사용하는 것입니다. 업데이트 : 해당 솔루션 (매크로도 처리 중)에서 편집 됨. 업데이트 2 : 몇 가지 주요 버그가 수정되었습니다. 업데이트 4 : untrace 기능이 추가되었습니다.
업데이트 3 : 다음은 내 REPL에서 예입니다 :
user> (ns foo)
nil
foo> (defn foo [x] x)
#'foo/foo
foo> (defmacro bar [x] x)
#'foo/bar
foo> (ns user)
nil
user> (trace-ns 'foo)
nil
user> (foo/foo :foo)
TRACE: "entering: foo"
:foo
user> (foo/bar :foo)
:foo
user> (untrace-ns 'foo)
nil
user> (foo/foo :foo)
:foo
관련 문제
- 1. 특정 네임 스페이스의 모든 컨트롤러에 Rails 컨트롤러 필터를 적용 하시겠습니까?
- 2. 네임 스페이스의 모든 함수를 나열하는 방법은 무엇입니까?
- 3. Postsharp 애스펙트 솔루션을 적용하는 방법 (네임 스페이스의 모든 클래스)
- 4. 특정 Clojure 네임 스페이스 - 함수를 실행 하시겠습니까?
- 5. 네임 스페이스의 xmlns
- 6. 네임 스페이스의 클래스와 구조체
- 7. System.Windows.Automation 네임 스페이스의 문제점
- 8. 네임 스페이스의 기능을 나열하는 방법은 무엇입니까?
- 9. 카피스트라 네임 스페이스의 목적은 무엇입니까?
- 10. 네임 스페이스의 클래스 충돌 - 제안
- 11. halo와 mx 네임 스페이스의 차이점
- 12. 네임 스페이스의 이름은 어떻게 생겼습니까?
- 13. 시스템 네임 스페이스의 클래스 바꾸기
- 14. 다른 네임 스페이스의 변수 액세스
- 15. 네임 스페이스의 컴파일 오류가 발생 했습니까?
- 16. clojure 네임 스페이스 가져 오기
- 17. rake 명령을 사용하여 네임 스페이스의 모든 작업에 함수를 실행하는 방법
- 18. Clojure 네임 스페이스 관리 - Clojure repl 네임 스페이스, 가져 오기 등의 상태를 저장하고 복원하는 방법이 있습니까?
- 19. 주어진 네임 스페이스의 클래스에 대한 동적 액세스
- 20. C에서 네임 스페이스의 클래스 목록 가져 오기
- 21. 왜 MVA 네임 스페이스의 CompareAttribute가 아닌 DataAnnotations 네임 스페이스입니까?
- 22. 런타임에서 XAML 네임 스페이스의 기능은 무엇입니까?
- 23. ACPI 네임 스페이스의 개체 카탈로그는 어디에 있습니까?
- 24. 템플릿 함수가있는 중첩 네임 스페이스의 C++ ADL
- 25. 다른 .net 네임 스페이스의 클래스를 내 네임 스페이스의 클래스로 표시 할 수 있습니까?
- 26. XAML에서 다른 네임 스페이스의 메서드를 호출하는 방법
- 27. XElement를 사용하여 네임 스페이스의 노드를 쿼리합니다.
- 28. 네임 스페이스의 i18n과 양식 오류가 발생했습니다.
- 29. Java : 네임 스페이스의 클래스 선언 전달
- 30. 파이썬 : 네임 스페이스의 일부를 가져 오는 방법
당신은 단순히 최고입니다! 아마도 ns-resolve 부분을 설명 할 수 있습니까? –
:-)'ns-resolve'는 네임 스페이스 또는 네임 스페이스 - 네이밍 기호와 기호를 취하여 (두 번째) 기호로 주어진 이름으로 주어진 네임 스페이스에서 Var를 찾도록 시도합니다. 여기에서 중요한 점은 (1) Var의 루트 바인딩을 변경할 수 있다는 것입니다 (여러 가지 방법이 있지만 '인턴'은 여분의 메타 데이터를 처리하는 방법 때문에 특히 편리합니다.) trace-ns (2) Var의 메타 데이터를 변경할 수 있습니다 (그래서 'untraced-ns'가 가능합니다). –
위의 최신 버전을 보려면 http://gist.github.com/492764를 참조하십시오 (보다 유용한 docstring이 등장합니다!). –