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 15:13]
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 939: Line 940:
 nREPL 서버는 작은 단위의 기능들을 조합해서 서버의 기능을 구성해 낸다. 미들웨어는 이러한 작은 단위의 기능을 구현한다. 하지만 미들웨어가 서로 연결되는 순서가 중요해진다. 예를 들어 세션 미들웨어는 사용자의 세션을 메시지에 추가하는데,​ 이런 후에야 평가 미들웨어가 세션 데이타를 참조할 수 있다. 미들웨어의 순서를 결정하기 위해 각 미들웨어에 미들웨어 설명자를 메타데이타로 정의한다. nREPL 서버는 작은 단위의 기능들을 조합해서 서버의 기능을 구성해 낸다. 미들웨어는 이러한 작은 단위의 기능을 구현한다. 하지만 미들웨어가 서로 연결되는 순서가 중요해진다. 예를 들어 세션 미들웨어는 사용자의 세션을 메시지에 추가하는데,​ 이런 후에야 평가 미들웨어가 세션 데이타를 참조할 수 있다. 미들웨어의 순서를 결정하기 위해 각 미들웨어에 미들웨어 설명자를 메타데이타로 정의한다.
  
-===== linearize-middleware-stack ​=====+===== 미들웨어 설명자 ===== 
 + 
 +===== 미들웨어 재배치 ===== 
 + 
 +==== linearize-middleware-stack ====
  
 linearize-middleware-stack 함수는 미들웨어 리스트를 입력받아서,​ 각 미들웨어 설명자에 기술된 미들웨어 의존성 정보에 맞추어서 미들웨어의 순서를 정한다. linearize-middleware-stack 함수는 미들웨어 리스트를 입력받아서,​ 각 미들웨어 설명자에 기술된 미들웨어 의존성 정보에 맞추어서 미들웨어의 순서를 정한다.
Line 956: Line 961:
 이 함수는 크게 extend-deps 함수에 의존하고 있다. 이 함수는 크게 extend-deps 함수에 의존하고 있다.
  
-=====  extend-deps ​=====+====  extend-deps ====
  
 이 함수는 각 미들웨어 설명자에 기술된 의존성을 확장한다. 이 함수는 각 미들웨어 설명자에 기술된 의존성을 확장한다.
Line 985: Line 990:
                m #{:expects :​requires}))))))                m #{:expects :​requires}))))))
 </​code>​ </​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)