【问题标题】:Scheme: Data serializing, efficient [and functional]方案:数据序列化,高效[和功能]
【发布时间】:2011-03-22 03:39:12
【问题描述】:

我正在序列化可能是整数、带有其他嵌套对象的对象(列表)的数据,并尝试选择要使用的方法。两种,第一种是递归创建字节向量,并在调用函数中将它们复制到更大的单个字节向量中;第二个是使用某种我可以写入的流。最终,尽管有选择,我将能够在任何可能发生的进一步处理中使用生成的二进制数组,例如。 G。我会压缩输出数据并通过网络发送,或者只是将部分数据写入文件。

我希望在实现快速序列化程序的同时保持足够的功能(或完全)。我正在使用Racket,尽管任何其他 Scheme 实现也可以。

谢谢。

更新:

以下是我找到解决方案后添加的示例,以便用户节省一些时间来寻找如何写入数据的方式:]

write-bytewrite-bytes 在您需要编写八位字节时特别有用。

> (bytes? (with-output-to-bytes (lambda () (write-byte 42))))
#t
> (bytevector? (with-output-to-bytes (lambda () (write-byte 42))))
#t
> (bytevector->u8-list (with-output-to-bytes (lambda () (write-byte 42))))
{42}
> (bytes->list (with-output-to-bytes (lambda () (write-byte 42) (write-bytes (integer->integer-bytes #x101CA75 4 #f #t)))))
(42 1 1 202 117)

【问题讨论】:

    标签: performance serialization functional-programming scheme racket


    【解决方案1】:

    open-bytevector-output-port 可能就是我要找的东西:

    #lang scheme
    
    (require rnrs/bytevectors-6)
    (require rnrs/io/ports-6)
    
    (define-values (oup ext-proc) (open-bytevector-output-port))
    (write 4 oup)
    (write 2 oup)
    (ext-proc)
    (make-bytevector 3 1)
    

    结果:

    Добро пожаловать в DrScheme, версия 4.2.5 [3m].
    Язык: scheme; memory limit: 128 MB.
    #"42"
    #"\1\1\1"
    > 
    

    【讨论】:

      【解决方案2】:

      您可以只使用write 将数据写入端口。您可以对所有值执行此操作,作为包含所有内容的列表。如果您遇到循环数据等问题,可能需要对其进行微调,将print-graph 设置为#t 可以很好地处理它。如果你想输出到一个字节串,那么你可以使用open-output-bytes,或者方便的with-output-to-bytes函数:

      (with-output-to-bytes (lambda () (write (list value1 value2 value3))))
      

      这不会像二进制表示那样紧凑——但如果你打算无论如何压缩输出,这并不重要。

      【讨论】:

      • with-output-to-bytes 和朋友们通常会创建一个输出端口并调用一些 proc [将该端口作为其一个参数]。但是 - 如果我使用你的方法 - 我希望能够将任何其他参数传递给我的自定义 proc,因为它在我当前的实现 paste.lisp.org/display/113007 (proc write-any) 中完成。
      • 不,with-output-to-bytes 需要一个 thunk -- 一个没有参数的函数。至于参数,Scheme 有词法作用域,这个函数可以使用任何绑定的名称。
      • 我想如果我这样做,我的函数将不再是组合子,因为它将依赖于其主体中未绑定但绑定在后者之外的变量。
      • (a) 这有什么问题? (b) 请注意,如果您使用严格的组合符,您可以做的非常很少——即使+ 是您从词法环境中获得的东西。 (在 Scheme 中,lambda 是一样的。)
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-06-21
      • 1970-01-01
      • 1970-01-01
      • 2012-02-03
      • 2023-04-04
      • 2010-12-02
      • 2013-08-22
      相关资源
      最近更新 更多