User Tools

Site Tools


lecture:nrepl:sources

Differences

This shows you the differences between two versions of the page.

Link to this comparison view

Both sides previous revision Previous revision
Next revision
Previous revision
lecture:nrepl:sources [2013/03/08 14:45]
psk810 [트랜스포트]
lecture:nrepl:sources [2013/03/08 15:55]
psk810 [comparator]
Line 798: Line 798:
     * handler : 클라이언트 메시지를 처리하기 위한 핸들러. 기본은 ​ defualt-handler.     * handler : 클라이언트 메시지를 처리하기 위한 핸들러. 기본은 ​ defualt-handler.
     * ack-port : 어떤 포트값이 주어진다면,​ 새로 구동되는 서버의 포트를 알려주기 위한 다른 서버 포트. 클로져 도구 구현시에만 유용.     * ack-port : 어떤 포트값이 주어진다면,​ 새로 구동되는 서버의 포트를 알려주기 위한 다른 서버 포트. 클로져 도구 구현시에만 유용.
-  - InetSocketAddress 자바 클래스를 사용하여 bind-address를 만들고 있다. bind가 참일 경우는 해당 ip주소를 사용하고 아닐겨웅에는 localhost가 된다.+  - InetSocketAddress 자바 클래스를 사용하여 bind-address를 만들고 있다. bind가 참일 경우는 해당 ip주소를 사용하고 아닐경우에는 localhost가 된다.
   - ServerSocket 자바 클래스를 서버 소켓을 생성하여 ss로 받는다.   - ServerSocket 자바 클래스를 서버 소켓을 생성하여 ss로 받는다.
   - Server는 server.clj에서 정의된 defrecord이다. Server 레코드 생성후 :ss 슬롯 추가.   - Server는 server.clj에서 정의된 defrecord이다. Server 레코드 생성후 :ss 슬롯 추가.
Line 932: Line 932:
   * add-stdin : "​eval",​ "​stdin"​ op 처리.   * add-stdin : "​eval",​ "​stdin"​ op 처리.
   * session : "​ls-sessions",​ "​close",​ "​clone"​ op 처리.   * session : "​ls-sessions",​ "​close",​ "​clone"​ op 처리.
 +  * pr-values : 메시지의 value 값을 프린트.
  
 linearize-middleware-stack 함수는 middleware.clj에서 정의된 함수로 미들웨어의 의존성에 따라 미들웨어들을 재배열시킨다. linearize-middleware-stack 함수는 middleware.clj에서 정의된 함수로 미들웨어의 의존성에 따라 미들웨어들을 재배열시킨다.
Line 937: Line 938:
 ======= 미들웨어 ======= ======= 미들웨어 =======
  
 +nREPL 서버는 작은 단위의 기능들을 조합해서 서버의 기능을 구성해 낸다. 미들웨어는 이러한 작은 단위의 기능을 구현한다. 하지만 미들웨어가 서로 연결되는 순서가 중요해진다. 예를 들어 세션 미들웨어는 사용자의 세션을 메시지에 추가하는데,​ 이런 후에야 평가 미들웨어가 세션 데이타를 참조할 수 있다. 미들웨어의 순서를 결정하기 위해 각 미들웨어에 미들웨어 설명자를 메타데이타로 정의한다.
 +
 +===== 미들웨어 설명자 =====
 +
 +===== 미들웨어 재배치 =====
 +
 +==== linearize-middleware-stack ====
 +
 +linearize-middleware-stack 함수는 미들웨어 리스트를 입력받아서,​ 각 미들웨어 설명자에 기술된 미들웨어 의존성 정보에 맞추어서 미들웨어의 순서를 정한다.
 +
 +<code clojure>
 +(defn linearize-middleware-stack
 +  [middlewares]
 +  (->> middlewares
 +    extend-deps
 +    (sort-by (comp count (partial apply concat) (juxt :expects :​requires)))
 +    reverse
 +    (reduce #​(conj-sorted % comparator %2) [])
 +    (map :​implemented-by)))
 +</​code>​
 +
 +이 함수는 크게 extend-deps 함수에 의존하고 있다.
 +
 +====  extend-deps ====
 +
 +이 함수는 각 미들웨어 설명자에 기술된 의존성을 확장한다.
 +
 +<code clojure>
 +(defn- extend-deps
 +  [middlewares]
 +  (let [descriptor #(-> % meta ::​descriptor)
 +        middlewares (concat middlewares
 +                            (->> (map descriptor middlewares)
 +                              (mapcat (juxt :expects :requires))
 +                              (mapcat identity)
 +                              (filter var?)))]
 +    (doseq [m (remove descriptor middlewares)]
 +      (binding [*out* *err*]
 +        (printf "​[WARNING] No nREPL middleware descriptor in metadata of %s, see clojure.tools.middleware/​set-descriptor!"​ m)))
 +    (let [middlewares (set (for [m middlewares]
 +                             ​(->​ (descriptor m)
 +                               ; only conj'​ing m here to support direct reference to
 +                               ; middleware dependencies in :expects and :requires,
 +                               ; e.g. interruptable-eval'​s dep on
 +                               ; clojure.tools.nrepl.middleware.pr-values/​pr-values
 +                               ​(update-in [:handles] (comp set #(conj % m) keys))
 +                               ​(assoc :​implemented-by m))))]
 +      (set (for [m middlewares]
 +             ​(reduce
 +               #​(update-in % [%2] into (dependencies middlewares % %2))
 +               m #{:expects :​requires}))))))
 +</​code>​
 +
 +==== dependencies ====
 +
 +<code clojure>
 +(defn- dependencies
 +  [set start dir]
 +  (let [ops (start dir)
 +        deps (set/select
 +               (comp seq (partial set/​intersection ops) :handles)
 +               set)]
 +    (when (deps start)
 +      (throw (IllegalArgumentException.
 +               ​(format "​Middleware %s depends upon itself via %s"
 +                       ​(:​implemented-by start)
 +                       ​dir))))
 +    (concat ops
 +            (mapcat #​(dependencies set % dir) deps))))
 +</​code>​
 +
 +==== comparator ====
 +
 +<code clojure>
 +(defn- comparator
 +  [{a-requires :requires a-expects :expects a-handles :handles}
 +   ​{b-requires :requires b-expects :expects b-handles :handles}]
 +  (or (->> (into {} [[[a-requires b-handles] -1]
 +                     ​[[a-expects b-handles] 1]
 +                     ​[[b-requires a-handles] 1]
 +                     ​[[b-expects a-handles] -1]])
 +        (map (fn [[sets ret]]
 +               (and (seq (apply set/​intersection sets)) ret)))
 +        (some #{-1 1}))
 +      0))
 +</​code>​
 +
 +===== 미들웨어 함수들 =====
 +
 +==== session ====
 +==== add-stdin ====
 +==== wrap-describe ====
 +==== interruptible-eval ====
 +==== wrap-load-file ====
 +==== pr-values ====
  
lecture/nrepl/sources.txt · Last modified: 2019/02/04 14:26 (external edit)