3

別のガイル プロセスでスキーム環境をエクスポートまたは複製したいと考えています。私が想像しているアルゴリズムは、シリアル化するために次のようなことをします:

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

そして、反対側でそれを読んだり評価したりします。

ただし、現在の環境を返す関数はありますが、それらは私が理解できない内部形式になっていmapます。上記のように環境を「歩く」にはどうすればよいですか?あるいは、環境を別のプロセスに複製するにはどうすればよいですか?

4

2 に答える 2

2

スキーム環境を実際にシリアル化することはできません。継続を(移植的に)シリアル化することが可能であるかどうかさえわかりません。ああ、FFIを忘れないでください。ポートとスレッドもシリアル化できません。

于 2011-05-09T06:17:32.437 に答える
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-current-binding-list) を呼び出して、current-module の変数バインディング リストを取得できます。このリストの各要素は、たとえば (symbol-name . variable-type) のように、シンボルと変数の型のペアであることに注意してください。したがって、次のように出力できます。インスタンスの場合、var バインディングが得られます。

(define abc 5)

それから:

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

==>#<variable 9bb5108 value: 5> この結果は変数「abc」の「変数型」です。variable-ref プロシージャでその値を取得できます。

したがって、すべてのバインディングをトレースして何かを行うことができます。コードでは、var-name と var-value を出力するだけです。

私の答えが簡潔すぎることは承知していますが、マニュアルで詳細を見つけるのに役立つ十分な情報があると思います。これがあなたを助けることを願っています。

于 2011-05-03T07:13:36.587 に答える