Как проверить / экспортировать / сериализовать (guile) среду Scheme - PullRequest
3 голосов
/ 02 мая 2011

Я хотел бы экспортировать или реплицировать среду схемы в другом процессе хитрости. Алгоритм, который я представляю себе, будет делать что-то вроде этого для сериализации:

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

А потом я прочитал бы / оценил это на другом конце.

Однако, хотя есть функции, которые возвращают текущую среду, они находятся в каком-то внутреннем формате, который я не могу просто передать map. Как я могу "ходить" по окружающей среде, как указано выше? В качестве альтернативы, как еще можно реплицировать среду в другой процесс?

Ответы [ 2 ]

2 голосов
/ 09 мая 2011

Вы не можете сериализовать среду Scheme. Я не знаю даже, что можно (переносимо) сериализовать продолжения. О, и не забывайте о FFIs. Порты и потоки тоже не поддаются сериализации.

2 голосов
/ 03 мая 2011

вы можете разложить так называемую «текущую среду» следующим образом:

(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. Обратите внимание, что каждый элемент в этом списке представляет собой пару символов и тип переменной, скажем, (имя-символа. Тип-переменной). Таким образом, вы можете напечатать это так: например, вы получили привязку к переменной:

(define abc 5)

тогда:

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

==> #<variable 9bb5108 value: 5> Этот результат представляет собой «тип переменной» переменной «abc». Вы можете получить его значение с помощью процедуры variable-ref.

Таким образом, вы можете отследить все привязки и сделать что-то в своем коде, просто выведите имя-переменной и значение-переменной.

Я знаю, что мой ответ слишком краткий, но я думаю, что достаточно информации, чтобы помочь вам найти более подробную информацию в руководстве. Надеюсь, это поможет вам.

...