编写Scheme数据结构,以便它们可以重新进入或替代

时间:2010-02-20 04:48:20

标签: scheme eval racket

我正在PLT Scheme中编写一个应用程序(A juggling pattern animator),它接受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)))

可以作为字符串“读取”,但不会与函数“eval”相同。当然,对于这个陈述,我需要的就像

一样简单
(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 个答案:

答案 0 :(得分:4)

我不确定你要做什么。具体来说,尝试生成具有eval能力代码的文件似乎是一个奇怪的选择。在任何情况下,当您处理结构时,创建随机值的序列化是一个问题 - 因为可能存在具有相同名称的不同结构。一些可能与您相关的要点:

  • 有一个未记录的库scheme/fasl,可以读取和写入二进制格式的值(对大数据有用)。

  • 还有mzlib/pconvert - DrScheme用来将值打印为可以计算的表达式的库(但这不适用于所有类型的数据)。

  • 如果您想使用易于以可读形式书写的结构,那么您可以使用“预制”结构。

(有关详细信息,最好在邮件列表中询问。)