Macros 宏内部的RackUnit源位置

Macros 宏内部的RackUnit源位置,macros,racket,rackunit,Macros,Racket,Rackunit,我正在构建一组rackunit测试,其中实际和函数在宏中定义。代码如下所示: #lang racket (require rackunit rackunit/text-ui) (define-syntax (my-test=? stx) (syntax-case stx () [(_ case1 case2) (syntax/loc stx (test-case "tests" (check-equal? case1 c

我正在构建一组rackunit测试,其中实际和函数在宏中定义。代码如下所示:

#lang racket

(require rackunit
         rackunit/text-ui)

(define-syntax (my-test=? stx)
  (syntax-case stx ()
    [(_ case1 case2)
     (syntax/loc stx
       (test-case "tests"
         (check-equal? case1 case2)))]))

(define tests
  (test-suite "tests"
    (my-test=? 'a 'b)))

(run-tests tests)
但是,当我运行此代码时,会得到以下输出:

--------------------
tests > tests
tests
FAILURE
name:       check-equal?
location:   unsaved-editor:11:9
actual:     'a
expected:   'b
. Check failure
--------------------
0 success(es) 1 failure(s) 0 error(s) 1 test(s) run
其中第11行是宏内部的
检查相等?
函数的行:
(检查相等?案例1案例2)))]


是否有任何方法可以在使用
我的测试=?
的行上显示错误:
(我的测试=?'a'b))

您可以将语法位置直接放在
check equal?
表达式上以获得所需的行为。下面是一个例子:

(define-syntax (my-test=? stx)
  (syntax-case stx ()
    [(_ case1 case2)
     (quasisyntax
       (test-case "tests"
         #,(syntax/loc stx (check-equal? case1 case2))))]))
将语法位置放在外部表达式上通常不会自动传播它

通过此更改,我将位置报告为“15:4”(与“11:9”相反),这是
(我的测试=?'a'b)
表达式出现的位置。

是的,这是。事实证明,文档中的短语“立即语法对象”非常重要!