提问人:brj 提问时间:7/14/2022 更新时间:11/30/2022 访问量:143
如何在Chez Scheme中找到导致异常的线路
How to find line causing exception in Chez Scheme
问:
我有几个用 Chez Scheme 编写的文件,每个文件大约有一千行。当我尝试将文件加载到 REPL 中时:
> (load "filexxx.scm")
...
Exception: variable A is not bound
Type (debug) to enter the debugger.
如何确定哪个文件中的哪一行触发了此异常?
我主要使用 Racket,DrRacket 会将我指向导致异常的行。有没有类似的方法可以查找 Chez 中使用未定义变量的位置?A
答:
1赞
Peter Winton
7/14/2022
#1
在 Chez Scheme 中获取异常的源位置可能会令人沮丧。在这种特殊情况下,为报告位置的标识符语法定义可能有效。A
文件xxx.scm
(define a 1)
(define b (+ A 1))
(define c 3)
(define-syntax A
(make-variable-transformer
(lambda (x)
(errorf #f "variable ~a is not bound at ~s"
(syntax->datum x) (annotation-source (syntax->annotation x))))))
(load "filexxx.scm")
Exception: variable A is not bound at #<source filexxx.scm[26:27]>
Type (debug) to enter the debugger.
这表示在从 0 开始的字符偏移量 26 处引用。A
filexxx.scm
或者,可以使用调试器来获取上下文,但可能不是行号或字符号。
如果发生在变量定义中...A
文件xxx.scm
(define my-var (+ A x))
...您可能会发现自己在编译器中,如下所示。(输入以检查延续,然后列出帧。i
sf
> (load "filexxx.scm")
Exception: variable A is not bound
Type (debug) to enter the debugger.
> (debug)
debug> i
#<system continuation in map> : sf
0: #<system continuation in map>
1: #<system continuation in compile>
2: #<system continuation in map>
3: #<system continuation in compile>
4: #<system continuation in compile>
5: #<system continuation in ksrc>
6: #<system continuation>
7: #<system continuation in dynamic-wind>
8: #<system continuation in dynamic-wind>
9: #<system continuation in $reset-protect>
10: #<system continuation in new-cafe>
#<system continuation in map> :
使用 和 走动并检查堆栈框架,直到您看到熟悉的东西。d
s
#<system continuation in map> : s
continuation: #<system continuation in compile>
frame and free variables:
0: #<procedure compile>
1: (#[#{Lsrc:Expr:call czsa1fcfzdeh493n-3-44} 44 #[...] #[...] (...)])
2: ()
#<system continuation in map> : d
#<system continuation in compile> : s
continuation: #<system continuation in map>
frame and free variables:
0: #[#{primref a0xltlrcpeygsahopkplcn-2} + 19834 (-1)]
#<system continuation in compile> : d
#<system continuation in map> : s
continuation: #<system continuation in compile>
frame and free variables:
0: #{my-var *top*:my-var}
1: ()
在这里,我们看到 ,这提供了一个线索。my-var
另一方面,如果发生在变量定义以外的某个地方......A
文件xxx.scm
(define (my-procedure x)
(+ A x))
(my-procedure 1)
...您可能会发现自己在引用的站点上。
> (load "filexxx.scm")
Exception: variable A is not bound
Type (debug) to enter the debugger.
> (debug)
debug> i
#<continuation in my-procedure> : sf
0: #<continuation in my-procedure>
1: #<system continuation in ksrc>
2: #<system continuation>
3: #<system continuation in dynamic-wind>
4: #<system continuation in dynamic-wind>
5: #<system continuation in $reset-protect>
6: #<system continuation in new-cafe>
在这里,我们看到,另一个线索。并显示框架揭示了其中发生的表达式。my-procedure
s
A
#<continuation in my-procedure> : s
continuation: #<system continuation in ksrc>
procedure code: (lambda (x) (+ A x))
call code: A
frame and free variables:
0. x: 1
评论
A