2017-01-30 1 views
2

Clojure를 배워야하는 이유는, 때로는 함수가 각 단계에서 무엇을하는지 알아야합니다. 예를 들어 :Clojure에서 어떻게 코드 실행을 추적 할 수 있습니까?

(defn kadane [coll] 
    (let [pos+ (fn [sum x] (if (neg? sum) x (+ sum x))) 
     ending-heres (reductions pos+ 0 coll)] 
    (reduce max ending-heres))) 

나는 여기 저기 println를 삽입 (여기서, 방법)한다 또는 제안 된 워크 플로우/도구가 있습니까?

+2

덧붙여 말하자면 런타임시 변수의 값으로 자동 추적 및 Clojure 코드를 마크 업하는 것은 [라이트 테이블 편집기] (http://lighttable.com/)의 모든 약점에 대한 것 중 하나입니다 , 테이블에 가져온다. –

+0

IntelliJ의 디버거를 시작하고 중단 점을 배치하기 만하면됩니다. 나를 위해 잘 작동합니다. – Carcigenicate

답변

8

이것은 하나의 기능 수준 (아래의 Charles Duffy의 설명 참조)에서와 다를 수 있지만 네임 스페이스 수준에서 일어나는 일들에 대한 개요를 얻고 싶다면), 당신은 tools.trace (공개 사용할 수 있습니다 내가 기여를 해요) : 그것은 내부 기능을 잡을 것

(ns foo.core) 

(defn foo [x] x) 
(defn bar [x] (foo x)) 

(in-ns 'user) ; standard REPL namespace 

(require '[clojure.tools.trace :as trace]) 
(trace/trace-ns 'foo.core) 

(foo.core/bar 123) 
TRACE t20387: (foo.core/bar 123) 
TRACE t20388: | (foo.core/foo 123) 
TRACE t20388: | => 123 
TRACE t20387: => 123 

) 찰스에 의해 지적, 대형 코드 그래프 압도 될 수도 있지만으로 (예 : small-ish 코드 그래프를 탐색 할 때 매우 편리 할 수 ​​있습니다.

는 (그것은 관심의 그룹이 완벽 네임 스페이스와 일치하지 않는 경우 개별적으로 선택 바르를 추적 할 수도 있습니다.)

+0

나 자신을 제안했을 것이지만,이 글을 읽으면서, OP는 하나의 함수 호출 안을보고 싶어한다. –

+1

("단일 함수 호출 내부"는 인수와 반환 값뿐만 아니라 포함 된 익명 함수의 의미도 포함 함). –

+0

@CharlesDuffy 오, 참으로 네가 맞다고 생각해. +1 사이드. 감사! –

6

Sayid은 Clojure Conj 2016에서 제공되는 도구로서 목적에 적합하며 훌륭한 Emacs 플러그인과 함께 제공됩니다. the talk at which it was presented을 참조하십시오.

임시 함수의 내부 호출을 보려면 ws-add-inner-trace-fn (이전은 ws-add-deep-trace-fn)을 참조하십시오.

+1

여기에 sayid의 저자. 나는 단지 sayid를 시도하는 사람들이 어떤 질문이나 문제가 생기면 연락을 취할 수 있도록 격려하기 위해 메모를 남기고 싶다. 덕분에 –

4
나는 자주이 목적을 위해 the Tupelo library에서 spy-let 같은 spyx 및 관련 기능을 사용

:

(ns tst.clj.core 
    (:require [tupelo.core :as t])) 
(t/refer-tupelo) 

(defn kadane [coll] 
    (spy-let [ pos+ (fn [sum x] (if (neg? sum) x (+ sum x))) 
       ending-heres (reductions pos+ 0 coll) ] 
    (spyx (reduce max ending-heres)))) 
(spyx (kadane (range 5))) 

생산할 예정이다 출력 :

pos+ => #object[tst.clj.core$kadane$pos_PLUS___21786 0x3e7de165 ...] 
ending-heres => (0 0 1 3 6 10) 
(reduce max ending-heres) => 10 
(kadane (range 5)) => 10 

이럴 간단한 println 또는 유사한 위해를 이길 어렵다 디버깅. 로그 파일은 제작에 더 가까워 질수록 매우 중요합니다.

2

가장 Clojurians 할 당신이 CIDER 이맥스를 사용하는 경우, 당신은 이미 내장 된 디버거 :

https://github.com/clojure-emacs/cider/blob/master/doc/debugging.md

기회가 좋아하는 IDE/에디터 무언가 내장 또는 이미 플러그인을 가지고있다.

위의 내용을 먼저 살펴 보겠습니다.

, 당신은 추가 할 수 있습니다 그러나이 있었다 /는 다른 가능성있다 def 개발 시간에 내부를 들여다 보며 함수 내에서 주어진 시간에 바인딩.

관련 문제