Напишите структуры данных Scheme, чтобы их можно было снова eval-d или альтернативными

Я пишу приложение (аниматор шаблонов жонглирования) в схеме PLT, которая принимает выражения Scheme в качестве значений для некоторых полей. Я пытаюсь написать небольшой текстовый редактор, который позволит мне "взорвать" выражения в выражения, которые все еще могут быть оценены, но содержат данные в виде литералов для ручной настройки.

Например,

(4hss->sexp "747")

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

(((7 3) - - -) (- - (4 2) -) (- (7 2) - -) (- - - (7 1)) ((4 0) - - -) (- - (7 0) -) (- (7 2) - -) (- - - (4 3)) ((7 3) - - -) (- - (7 0) -) (- (4 1) - -) (- - - (7 1)))

который можно «прочитать» как строку, но он не будет «вычисляться» так же, как функция. Для этого утверждения, конечно, мне нужно было бы так же просто, как

(quote (((7 3...

но другие примеры нетривиальны. Этот, например, содержит структуры, которые печатаются как векторы:

pair-of-jugglers
; -->
(#(struct:hand #(struct:position -0.35 2.0 1.0) #(struct:position -0.6 2.05 1.1) 1.832595714594046) #(struct:hand #(struct:position 0.35 2.0 1.0) #(struct:position 0.6 2.0500000000000003 1.1) 1.308996938995747) #(struct:hand #(struct:position 0.35 -2.0 1.0) #(struct:position 0.6 -2.05 1.1) -1.3089969389957472) #(struct:hand #(struct:position -0.35 -2.0 1.0) #(struct:position -0.6 -2.05 1.1) -1.8325957145940461))

Я придумал как минимум три возможных решения, ни одно из которых мне не очень нравится.

Помогите мне, прежде чем мне снова начнут сниться плохие рекурсивные сны.


person Jesse Millikan    schedule 20.02.2010    source источник


Ответы (1)


Я не уверен, что вы пытаетесь сделать. В частности, попытка создать файл с eval-кодом кажется странным выбором. В любом случае создание сериализации случайных значений является проблемой, когда вы имеете дело со структурами, поскольку могут быть разные структуры с одним и тем же именем. Некоторые моменты, которые могут быть важны для вас:

  • Существует недокументированная библиотека scheme/fasl, которая может читать и записывать значения в двоичном формате (полезно для больших данных).

  • Существует также mzlib/pconvert -- библиотека, которую DrScheme использует для печати значений в виде выражений, которые можно вычислить (но это не будет работать со всеми типами данных).

  • Если вы хотите использовать структуры, которые очень легко написать в удобочитаемой форме, вы можете использовать «готовые» структуры.

(Для получения более подробной информации, вероятно, лучше спросить в списке рассылки.)

person Eli Barzilay    schedule 20.02.2010
comment
Что ж, без подробностей сложно сказать, но я думаю, что сборный вариант вполне может сработать. (Попробовал вашу штуку - графика впечатляет, но не смог разобраться в интерфейсе. Я ж не жонглер...) - person Eli Barzilay; 20.02.2010
comment
Спасибо, что посмотрели! Интерфейс правда пока не очень. Я все еще думаю об этом. - person Jesse Millikan; 20.02.2010
comment
Если вам все еще интересно, на что он способен, я наконец-то оставил несколько инструкций и примеров на странице Wiki на github. - person Jesse Millikan; 20.02.2010