我正在尝试编写一种Racket读取器扩展过程,以禁用管道字符|
的特殊处理。
我有两个文件:mylang/lang/reader.rkt
用于���现语言读取器和mylang/testing.rkt
用于尝试它。 我运行了raco pkg install --link
来安装该语言包。
以下是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 \| + 3)
存在"bad syntax (multiple expressions after identifier)",这是合理的,因为parse-pipe
生成的是语法对象而不是字符串,所以它会过早地终止符号的读取。
我可以做的一件事是一直读到符号结尾,但这最多也只是一个hack,因为我将重新实现符号解析,并且这并不能解决符号中间包含管道字符或者|在字符串中等情况。
我想要做的是从读取表中删除管道符的默认读取程序,但我不知道如何做或是否可以这样做。
|
作为符号的一种方式是“引用”符号,以便它可以包含任意字符(例如,|foo bar|
被读取为对应于(string->symbol"foo bar")
的符号);通过重新定义|
,您剥夺了读取具有任意字符的符号的能力。 - C. K. Young