代码之家  ›  专栏  ›  技术社区  ›  Jesse Millikan

编写方案数据结构,以便它们可以是eval-d返回,或者是可选的

  •  2
  • Jesse Millikan  · 技术社区  · 15 年前

    我在写申请书 juggling pattern animator )在PLT方案中,接受方案表达式作为某些字段的值。我正试图写一个小的文本编辑器 让我将表达式“分解”为仍然可以进行eval'd但以文本形式包含数据的表达式 手动调整。

    例如,

    (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 回复  |  直到 12 年前
        1
  •  4
  •   Eli Barzilay    15 年前

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

    • 有一个没有文件的图书馆 scheme/fasl 可以以二进制格式读取和写入值(对大数据有用)。

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

    • 如果您想使用非常容易以可读形式编写的结构,那么可以使用“preab”结构。

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