Печать хеш-таблиц на схеме (Chez)

Я использую довольно много (стандартных R6RS) хеш-таблиц в Chez Scheme, но работать с ними в REPL не очень приятно, потому что они просто печатаются как #<eq hashtable>, Я написал print-table функция, но это немного раздражает, чтобы продолжать вызывать его каждый раз, когда я хочу проверить свои данные.

Похоже, что в Racket есть способ сделать пользовательскую печать для данного типа. Есть ли способ сделать что-то подобное в схеме?

1 ответ

Решение

Chez Scheme позволяет настраивать чтение и запись большинства записей, включая хеш-таблицы. Схема Chez обеспечивает record-writer а также record-reader Процедура, позволяющая настроить функции, используемые для записи и чтения записей:

http://cisco.github.io/ChezScheme/csug9.5/objects.html

На этой странице есть несколько хороших примеров, но важной деталью является то, что вы можете указать #f как писатель, по умолчанию для новых типов записей, которые будут использовать формат, который может быть прочитан читателем по умолчанию. Это не будет работать 100% времени, так как есть некоторые типы, которые не имеют сериализуемого представления, такие как функции.

Когда я отключаю специальный принтер для eq-hashtables и специальный принтер для базовых hashtables, я вижу представление по умолчанию:

> (record-writer (record-rtd (make-eq-hashtable)) #f)
> (record-writer
    (record-type-parent
      (record-type-parent (record-rtd (make-eq-hashtable)))) #f)
> (make-eq-hashtable)
#[#{eq-ht icguu8mlhm1y7ywsairxck-0} eq #t #(0 1 2 3 4 5 6 7) 8 0 0]
> (define ht (make-eq-hashtable))
> (eq-hashtable-set! ht 'a "a")
> ht
#[#{eq-ht icguu8mlhm1y7ywsairxck-0} eq #t #(0 #<tlc> 2 3 4 5 6 7) 8 1 0]

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

Другие вопросы по тегам