2016-02-12 27 views
4

看來,如果我爲一個文件寫入一個集合,它不是一種可以輕鬆地作爲一個集合讀取的格式。這裏有一個例子:如何從球拍中的文件中讀取一套?

#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 "打印到文件中,然後用空格打印所有整數,然後關閉")"。超級醜陋,我想盡可能使用閱讀器。

回答

6

您可以使用球拍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))))