2012-12-04 17 views
5

構文例外をテストするマクロでsrfi-78を拡張したいとします。私はこのようなものが欲しい:構文例外をキャッチする方法

#! /usr/bin/env scheme-script 
#!r6rs 

(import (rnrs) (srfi :78 lightweight-testing)) 

; the macros I want to test 
(define-syntax some-macros 
    (syntax-rules() 
    [(_) 'ok])) 

; the extension to srfi-78 
(define-syntax check-exception 
    (syntax-rules() 
     ; ... some code ... 
     )) 

; tests 

; prints "correct" or someting like that 
(check (some-macros) => 'ok) 

; should print "correct" (i. e. the test passed) 
(check-exception (some-macros 'arg)) 

; should print "error" 
; (i. e. the exception was not thrown as expected) 
(check-exception (some-macros)) 

それはまったく可能ですか?そうでない場合は、マクロのテストをどのように記述しますか?

私は約test-read-eval-stringからsrfi-64を知っています。文字列を受け取り、それをフォームに変換し、初期の環境でこのフォームを評価します。現在の環境で与えられたフォームを評価し、例外をキャッチするマクロが必要です。

答えて

3

これを実行する唯一のポータブルな方法は、eval経由でコードを呼び出してガードにラップすることです。

例:

(define (safe-eval code env) 
    (guard [e [(syntax-violation? e) (display e)]] 
    (eval code env))) 

使用法:

> (safe-eval '(let a v) (environment '(rnrs))) 
&who: let 
&message: "invalid syntax" 
&syntax: 
    form: (let a v) 
    subform: #f 
+0

マクロ展開はそれが動作 '安全eval' – amakarov

+0

フム、評価の前に行くと、マクロのために働くべきではありません。ありがとうございました。理由を理解しようとします。 – amakarov

+1

コードは引用符で囲まれているので、展開はevalでのみ行われることに注意してください。 – leppie

関連する問題