2011-05-02 6 views
3

다른 guile 프로세스에서 스키마 환경을 내보내거나 복제하고 싶습니다.(guile) Scheme 환경을 검사/내보내기/직렬화하는 방법

(map (lambda (var val) (display (quasiquote (define ,var ,val)) 
         (newline)) 
    (get-current-environment)) 

을 그리고 나는/평가를 읽었다 다른 쪽 끝이 : 내가 상상하고있어 알고리즘은 직렬화 같은 것을 할 것입니다.

그러나 현재 환경을 반환하는 함수가 있지만 내부 형식은 map에 불과합니다. 위와 같이 환경을 "걷는"방법은 무엇입니까? 다른 방법으로 환경을 다른 프로세스로 복제 할 수 있습니까?

답변

2

는이 같은 소위 "현재 환경"분해 할 수 있습니다

(define (get-current-binding-list) 
     (let* ((e (current-module)) ;; assume checking current-module 

       (h (struct-ref e 0)) ;; index 0 is current vars hashtable 
      ) 
     (hash-map->list cons h) ;; return a vars binding list 
    )) 

을 당신은 현재 모듈의 목록을 바인딩 변수를 얻기 위해 (GET-현재 결합 목록)을 호출 할 수 있습니다. 이 목록의 각 요소는 기호 및 변수 형식 쌍 (예 : symbol-name. variable-type)입니다. 그래서이처럼 인쇄 할 수 있습니다 : 다음

(define abc 5) 

: 을 예를 들어, 당신은 바인딩 VAR을 가지고

(let ((vl (get-current-binding-list))) 
     (assoc-ref vl 'abc) 
    ) 

==>#<variable 9bb5108 value: 5> 이 결과는 변수의 "변수 타입"입니다 "알파벳". 변수 -ref 프로 시저로 값을 얻을 수 있습니다.

그래서 모든 바인딩을 추적하고 무언가를 할 수 있습니다. 코드에서 단순히 var-name 및 var-value를 인쇄합니다.

내 대답은 너무 짧다는 것을 알고 있지만 설명서에 자세한 내용을 찾을 수있을만큼 충분한 정보가 있다고 생각합니다. 희망이 도움이 될 것입니다.

+0

굉장한 답변입니다. 그것의 핵심이'(현재 모듈)'인 것 같아 보이기는하지만, 괜찮습니다. 나는 단지 이해하고 싶다. – drysdam

2

정말 Scheme 환경을 직렬화 할 수 없습니다. 나는 연속성을 (이식 가능하게) 직렬화하는 것이 가능하다는 것도 모른다. 오, 그리고 FFI를 잊지 마라. 포트와 스레드도 직렬화 할 수 없습니다.

+0

오, 그래, 나는 항구 등에 대해 생각하지 않았다. 그래도 내가하고있는 일에 내가 필요하다고 생각하지 않는다. 정말 RPC의 종류를 지원하기 위해 다른 환경에서 변수와 함수를 복제하려고합니다. – drysdam