Racket 移除球拍';从字符的可读表中选择默认的读取器过程|

Racket 移除球拍';从字符的可读表中选择默认的读取器过程|,racket,Racket,我正在尝试编写一个racket reader扩展过程,该过程禁用对管道字符的特殊处理 我有两个文件:mylang/lang/reader.rkt用于实现lang阅读器,而mylang/testing.rkt用于尝试。我已经运行了racopkginstall--link来安装lang 这是reader.rkt: #lang s-exp syntax/module-reader racket #:read my-read #:read-syntax my-read-syntax (define (

我正在尝试编写一个racket reader扩展过程,该过程禁用对管道字符的特殊处理

我有两个文件:
mylang/lang/reader.rkt
用于实现lang阅读器,而
mylang/testing.rkt
用于尝试。我已经运行了
racopkginstall--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\|+3)中的
define:bad语法(标识符后有多个表达式)
,这是合理的,因为
parse pipe
生成的是语法对象,而不是字符串,所以它会提前终止符号的读取

<>我能做的就是一直读到符号的末尾,但是这是最坏的,因为我会重新执行符号解析,它不会修复符号在中间有管char,或者如果在字符串内,等等。
我想做的是从readtable中删除|的默认读取器过程,但我不知道如何/是否可以做到。

好的,我找到了一种方法。文件说明:

char like char readtable-以相同的方式解析char 像char一样的字符在readtable中解析,readtable可以是#f to 指示默认的可读表

因此,我可以让读者阅读
|
,就像阅读
a
这样的普通字符一样:

(define my-readtable
  (make-readtable #f #\| #\a #f))
它是有效的

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

我+1希望你的答案是这样的,但我无法想象你为什么要做这样的事情(除非你正在为一种定制的、非Scheme语言实现一个阅读器)。在Scheme中,在符号中使用
|
是一种“引用”符号的方式,以便它可以包含任意字符(例如,
|foo bar
作为与
(字符串->符号“foo bar”)
对应的符号读入);通过重新定义
|
,您就失去了读取带有任意字符的符号的能力。这是用于自定义语言的。我非常乐意采用racket的方式;)。