Syntax 如何在本地更改racket中的阅读规则?

Syntax 如何在本地更改racket中的阅读规则?,syntax,racket,interpreter,evaluation,j,Syntax,Racket,Interpreter,Evaluation,J,我正在研究嵌入球拍,自从我发现了一个新的,我想在此基础上。 现在,通过传递一个: 由于J使用引号、双引号和其他ASCII字符,在作为字符串传递时需要转义,因此我想将求值策略更改为: > (j 4 * 1 + 4) > 20 这相当于评估球拍形式的cdr,显然需要。但是,当我尝试将评估函数更改为以下内容时: (define (j exp) (jeval #reader"jexp.rkt" exp)) 我得到一个“unboundidentifier”错误,因为输入端口“exp”没

我正在研究嵌入球拍,自从我发现了一个新的,我想在此基础上。 现在,通过传递一个:

由于J使用引号、双引号和其他ASCII字符,在作为字符串传递时需要转义,因此我想将求值策略更改为:

> (j 4 * 1 + 4)
> 20
这相当于评估球拍形式的cdr,显然需要。但是,当我尝试将评估函数更改为以下内容时:

(define (j exp)
  (jeval #reader"jexp.rkt" exp))

我得到一个“unboundidentifier”错误,因为输入端口“exp”没有用“exp”代替它的值而被随意解释。我怎样才能做到这一点呢?

像这样改变读取器不是在解析过程的后期可以完成的事情。在您给出的示例中,Racket如何知道嵌入式J程序何时结束

我想你应该看看球拍指南的“创造语言”部分:


这不是读者的工作方式。您需要在调用时调用读取器,例如读取器“jexp.rkt”(j4*1+4),因为在
j
的定义中包含它意味着
expr
是正在读取的部分。您可能应该编写一种语言,这样您就可以使用
#lang j
。然后,您的阅读器将读取整个文件,您可以将
(j-expression)
转换为
(j-expression)
(define (j exp)
  (jeval #reader"jexp.rkt" exp))