怎么读这个?

时间:2012-09-28 20:59:52

标签: scheme racket

我有以下测试示例可以使用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)'`

我知道这是因为.,但我的来源会包含很多此类内容,那么问题是如何在球拍中阅读它们?

提前致谢...

1 个答案:

答案 0 :(得分: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))))