我正在尝试编写一个球拍阅读器扩展程序,该程序禁用对管道符|
的特殊处理。
我有两个文件: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的情况,或者如果|在字符串等中。
我想要删除|的默认阅读器程序从可读表,但我不知道如何/如果可以做到。
答案 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"