如何从 Racket 中的文件中读取集合?
How do I read a set from a file in Racket?
似乎如果我将一个集合写入一个文件,它不是一种可以作为一个集合轻松读回的格式。这是一个例子:
#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>
的文件,reader 对此表示不满。邮件列表 here.
上有一个相关的未回答问题
我现在绕过它的方法是将字符串 "(set "
按字面打印到文件中,然后是所有带空格的整数,然后是结束符 ")"
。超级丑,如果可能我想使用 reader。
您可以使用 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))))
似乎如果我将一个集合写入一个文件,它不是一种可以作为一个集合轻松读回的格式。这是一个例子:
#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>
的文件,reader 对此表示不满。邮件列表 here.
我现在绕过它的方法是将字符串 "(set "
按字面打印到文件中,然后是所有带空格的整数,然后是结束符 ")"
。超级丑,如果可能我想使用 reader。
您可以使用 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))))