Macros 将“make at reader”生成的函数与“include/reader”一起使用时出现问题`
编辑:我已经确定了问题所在,并找到了解决方法(请参见最后的更新2),但似乎应该有一种更简单的方法来解决这个问题-我希望有人能想出一种方法 当我试图使用我使用Racket/Scribble生成的函数作为Macros 将“make at reader”生成的函数与“include/reader”一起使用时出现问题`,macros,include,racket,scribble,Macros,Include,Racket,Scribble,编辑:我已经确定了问题所在,并找到了解决方法(请参见最后的更新2),但似乎应该有一种更简单的方法来解决这个问题-我希望有人能想出一种方法 当我试图使用我使用Racket/Scribble生成的函数作为include/reader或include at/relative/reader(from)的读卡器expr时遇到了麻烦,我希望有人能解释我做错了什么 我已经使用了一些参数来make at reader来定义@-forms的不同用法(基本上是模板系统),基本上如下所示: (define cmd-r
include/reader
或include at/relative/reader
(from)的读卡器expr时遇到了麻烦,我希望有人能解释我做错了什么
我已经使用了一些参数来make at reader
来定义@-forms的不同用法(基本上是模板系统),基本上如下所示:
(define cmd-readtable
(make-readtable #f #f 'non-terminating-macro <<myExtensionProcHere>>))
(define at-template-reader
(make-at-reader #:syntax? #t
#:inside? #t
#:command-char #\ƒ
#:command-readtable cmd-readtable
#:syntax-post-processor <<myFunctionHere>>))
我有点像
'(string-append "string foo"
"\n"
(expression "bar")
"string baz")
使用eval
和namespace-anchor->namespace
对其进行正确的计算。为了明确起见,所有语法对象要么对应于文字字符串,要么对应于计算结果为字符串的表达式;但是,外部文件中的表达式需要能够访问模块上下文中的参数和一些其他定义
但是,我更愿意使用类似于include/reader
或include at/relative/reader
(可能更类似于include/template
from)的方法,以便在编译时解释外部文件。不过,我尝试在其中一种形式中使用Myat template reader
的尝试完全失败:更糟糕的是,它们只是在内存耗尽之前运行,没有结果,所以我甚至不知道如何调试它们。我想我在这方面有点不知所措,我很感激任何人对如何使这项工作发挥作用的想法
更新1:明日香Takikawa在评论中问它是否与
#:内部兼容#f
。我现在已经试过了,它确实做到了——或者至少是更接近于使用:inside进行工作#t
,它会进入“永不着陆”,直到我杀死它或者它的内存耗尽。#:内部#f
version成功并返回值。(在我定义的一些逻辑中,它确实表现得很奇怪,有时只返回最后一个值,但我认为这可能是因为我做了一些只适用于:inside?#t
-模式的假设;我现在正在研究这个。)
这是否让任何人都知道内部的#:可能出了什么问题#t
版本?我想知道这是否与以下事实有关::内部#t
,它只返回一个表示整个外部文件的语法对象
更新2: 我已经发现了这个问题,现在我有了一个非常简单的解决方法,但我希望有人能向我解释一下正确的方法是什么 首先,让我给
#起个名字:里面#f
我在Asumu Takikawa的建议下尝试过的函数,因此我可以简单地参考它:
(define at-template-reader-OUTSIDE
(make-at-reader #:syntax? #t
#:inside? #f
#:command-char #\ƒ
#:command-readtable cmd-readtable
#:syntax-post-processor <<myFunctionHere>>))
但是,这感觉很笨拙-我希望有人能告诉我这样做的“正确”方法。如果您将
:inside?
参数设置为\f
,是否有效?是的,至少是这样。我正在添加上面的细节。
(define at-template-reader-OUTSIDE
(make-at-reader #:syntax? #t
#:inside? #f
#:command-char #\ƒ
#:command-readtable cmd-readtable
#:syntax-post-processor <<myFunctionHere>>))
(include/reader (file "/path/to/source-file")
(lambda (stx in)
(cond [(eof-object? (peek-char in))
eof]
[else
((lambda (stx)
(syntax-case stx ()
[(a ...)
#'(string-append a ...)]))
(syntax->list
(at-template-reader stx in)))])))