【问题标题】:How do I read a set from a file in Racket?如何从 Racket 中的文件中读取集合?
【发布时间】:2016-02-12 07:34:17
【问题描述】:

似乎如果我将一个集合写入一个文件,它的格式不是可以作为一个集合轻松读回的格式。这是一个例子:

#lang racket

(let ([out (open-output-file "test.rkt" #:exists 'replace)])
  (write (set 1 2 3 4 5) out)
  (close-output-port out))

这会生成一个带有#<set: 1 3 5 2 4> 的文件,读者对此感到不满。邮件列表here 上有一个相关的未回答问题。

我现在解决它的方法是将字符串"(set " 打印到文件中,然后是所有带空格的整数,然后是结束")"。超级丑陋,如果可能的话我想使用阅读器。

【问题讨论】:

    标签: serialization deserialization racket


    【解决方案1】:

    您可以使用 Racket serialization library 来执行此操作。这是一个例子:

    Welcome to Racket v6.4.0.7.
    -> (require racket/serialize)
    -> (with-output-to-file "/tmp/set.rktd"
         (lambda () (write (serialize (set 1 2 3)))))
    -> (with-input-from-file "/tmp/set.rktd"
         (lambda () (deserialize (read))))
    (set 1 3 2)
    

    请注意,序列化值只是一种特殊的 s 表达式,因此您可以像其他值一样操作它(例如将其存储在数据库中、将其写入磁盘、通过网络发送等):

    -> (serialize (set 1 2 3))
    '((3)
      1
      (((lib "racket/private/set-types.rkt")
        .
        deserialize-info:immutable-custom-set-v0))
      0
      ()
      ()
      (0 #f (h - (equal) (1 . #t) (3 . #t) (2 . #t))))
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-03-14
      • 1970-01-01
      • 2015-08-01
      • 2012-06-23
      • 2015-08-18
      相关资源
      最近更新 更多