从角色的可读表中删除球拍的默认阅读器程序

时间:2015-10-18 15:17:48

标签: racket

我正在尝试编写一个球拍阅读器扩展程序,该程序禁用对管道符|的特殊处理。

我有两个文件:mylang/lang/reader.rkt来实现lang阅读器,mylang/testing.rkt来试用它。我已经运行raco pkg install --link来安装lang。

以下是reader.rkt

#lang s-exp syntax/module-reader
racket
#:read my-read
#:read-syntax my-read-syntax

(define (parse-pipe char in srcloc src linum colnum)
  #'\|)

(define my-readtable
  (make-readtable #f #\| 'terminating-macro parse-pipe))

(define (my-read-syntax src in)
  (parameterize ((current-readtable my-readtable))
    (read-syntax src in)))

(define (my-read in)
  (syntax->datum
   (my-read-syntax #f in)))

testing.rkt就像这样:

#lang mylang
(define | 3)
(+ 3 2)

按预期运行并生成5。但下一个不会:

#lang mylang
(define |+ 3)
(+ |+ 2)

抱怨define: bad syntax (multiple expressions after identifier) in: (define \| + 3)这是合理的,因为parse-pipe会生成语法对象,而不是字符串,所以它会过早地终止符号的读取。

我可以做的一件事就是继续阅读直到符号的结尾,但这至多是hackish,因为我将重新实现符号解析,它不会修复符号在中间有管道char的情况,或者如果|在字符串等中。

我想要删除|的默认阅读器程序从可读表,但我不知道如何/如果可以做到。

1 个答案:

答案 0 :(得分:6)

好的,我找到了办法。 make-readtable的文档说:

  

char like-char readtable - 导致char以相同的方式解析   like-char在readtable中被解析,其中readtable可以是#f to   表示默认的可读表。

所以我可以让读者像|这样的普通字符读取a

(define my-readtable
  (make-readtable #f #\| #\a #f))

它有效

(define hawdy|+ "hello")    
(string-append hawdy|+ "|world")
; => "hello|world"