2015-08-26 11 views
7

के अंदर रैकयूनीट स्रोत स्थान मैं रैकुनिट परीक्षणों का एक सेट बना रहा हूं, जहां वास्तविक test-case और check-equal? फ़ंक्शन को मैक्रो में परिभाषित किया गया है। कोड इस तरह दिखता है:मैक्रोज़

#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 मैक्रो के अंदर check-equal? समारोह की लाइन है: (check-equal? case1 case2)))]))

क्या कोई तरीका है कि मैं उस लाइन पर त्रुटि दिखाने के लिए rackunit कर सकता हूं जहां my-test=? उपयोग किया जाता है: (my-test=? 'a 'b)))?

उत्तर

6

आप जो व्यवहार चाहते हैं उसे पाने के लिए आप सिंटैक्स स्थान सीधे 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" के विपरीत है) जहां (my-test=? 'a 'b) अभिव्यक्ति होती है।

+4

हां, यह [मुझे पहले से बाहर चला गया है] (http://www.greghendershott.com/2014/01/using-syntax-loc.html)। यह दस्तावेज में "तत्काल वाक्यविन्यास वस्तु" वाक्यांश महत्वपूर्ण है! –

संबंधित मुद्दे