Напишите структуры данных Scheme, чтобы они могли быть возвращены или альтернативны - PullRequest
2 голосов
/ 20 февраля 2010

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

Например,

(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))

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

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

1 Ответ

4 голосов
/ 20 февраля 2010

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

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

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

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

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

...