2012-09-28 69 views
1

我有以下的测试为例,可以使用read,但遇到一些问题:如何阅读?

#lang racket 
(struct test (num) #:prefab) 
(define s3 (read (open-input-string "((AK= #s(test .)) (AV))"))) 
(match s3 
    [`((AK= ,(struct test (val))) (AV)) (displayln val)]) 

它会发出read: unexpected)'`

我知道那是因为.的,但我的来源将包含很多这样的事情,那么问题是我如何在球拍中阅读它们?

在此先感谢...

回答

2

您可以read-accept-dotread-accept-infix-dot禁用阅读点,但只是使其成为一个错误,如果有一个点。所以,它听起来就像你想使用一个custom readtable这里(阅读guide section太):

#lang racket 
(struct test (num) #:prefab) 
(define rt:no-dots 
    (make-readtable (current-readtable) 
        #\. 'non-terminating-macro ( _ #'|.|))) 
(define (read-with-dots str) 
    (parameterize ([current-readtable rt:no-dots]) 
    (read (open-input-string str)))) 
(define s3 (read-with-dots "((AK= #s(test .)) (AV))")) 
(match s3 
    [`((AK= ,(struct test (val))) (AV)) (displayln val)]) 

或者,你可以点得到视为注释:

(define rt:no-dots 
    (make-readtable (current-readtable) 
        #\. 'non-terminating-macro 
        ( _ (make-special-comment #f)))) 
+0

谢谢!现在我想我需要扩展阅读表,以及以前无法阅读的所有内容...... – monica

+0

@monica:请记住,如果您有一些距离Racket语法足够的数据,那么你可以使用一些更简单的基于正则表达式的东西,或者,另一方面,你可以构建一个完整的解析器。 –

+0

我遇到了如何正确读取球拍中的'('或')'的问题...然后感谢您的建议,我放弃了可读取的扩展方法。相反,我从所有程序的不同运行中获取所有实例,并执行我之前所需的操作,而不是使用序列化/反序列化方法。 – monica