如何在Chez Scheme中找到导致异常的线路

How to find line causing exception in Chez Scheme

提问人:brj 提问时间:7/14/2022 更新时间:11/30/2022 访问量:143

问:

我有几个用 Chez Scheme 编写的文件,每个文件大约有一千行。当我尝试将文件加载到 REPL 中时:

> (load "filexxx.scm")
...
Exception: variable A is not bound
Type (debug) to enter the debugger.

如何确定哪个文件中的哪一行触发了此异常?

我主要使用 Racket,DrRacket 会将我指向导致异常的行。有没有类似的方法可以查找 Chez 中使用未定义变量的位置?A

方案 undefined-reference chez-scheme

评论

0赞 alinsoar 7/14/2022
使用 grep 查找就足够了。我想这比调试更简单。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 处引用。Afilexxx.scm


或者,可以使用调试器来获取上下文,但可能不是行号或字符号。

如果发生在变量定义中...A

文件xxx.scm

(define my-var (+ A x))

...您可能会发现自己在编译器中,如下所示。(输入以检查延续,然后列出帧。isf

> (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>                                     : 

使用 和 走动并检查堆栈框架,直到您看到熟悉的东西。ds

#<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-proceduresA

#<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