Я пишу приложение (аниматор шаблонов жонглирования) в схеме 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))
Я придумал как минимум три возможных решения, ни одно из которых мне не очень нравится.
Помогите мне, прежде чем мне снова начнут сниться плохие рекурсивные сны.