2015-08-26 15 views
7

Bir grup gerçek bir test-case ve check-equal? işlevinin bir makroda tanımlandığı bir dizi site testi oluşturuyorum. AncakRackUnit makrolar içinde kaynak konumu

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

Ben şu çıktıyı almak bu kodu çalıştırdığınızda: Kod şöyle görünür

hat 11 makro iç check-equal? fonksiyonunun hattıdır
-------------------- 
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 

: (check-equal? case1 case2)))]))

my-test=?'un kullanıldığı satırdaki hatayı göstermek için herhangi bir yol gösterebilir miyim? (my-test=? 'a 'b)))?

cevap

6

İstediğiniz davranışı almak için sözdizimi konumunu doğrudan check-equal? ifadesine koyabilirsiniz.

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

otomatik genel olarak değil yayıldığından dış ifadeye sözdizimi konumunu koymak: İşte bir örnek.

Bu değişiklikle, konum, (my-test=? 'a 'b) ifadesinin oluştuğu yer olan ("11: 9" yerine) "benim için 15: 4" olarak bildirilir.

+4

Evet, bu [beni daha önce düşürdü] (http://www.greghendershott.com/2014/01/using-syntax-loc.html). Belgelerindeki "anında sözdizimi nesnesi" ifadesi önemli! –

İlgili konular