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)'`

我知道这是因为.,但我的源将包含很多这种东西,那么问题是我怎样才能在球拍中阅读它们?

提前致谢...

4

1 回答 1

2

read-accept-dot您可以使用and禁用读取点read-accept-infix-dot,但如果有点,那只会使其成为错误。所以听起来你想在这里使用自定义可读表(也阅读指南部分):

#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))))
于 2012-09-28T21:22:43.187 回答