如何从Racket中的文件中读取集合?

Chr*_*oks 4 serialization racket deserialization

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

#lang racket

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

这使得一个文件#<set: 1 3 5 2 4>,读者抱怨.还有就是邮件列表上相关的悬而未决的问题在这里.

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

Asu*_*awa 7

您可以使用Racket 序列化库来执行此操作.这是一个例子:

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)
Run Code Online (Sandbox Code Playgroud)

请注意,序列化值只是一种特殊的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))))
Run Code Online (Sandbox Code Playgroud)