2017-08-20 4 views
3

カスタム言語で生成された文字列を表示するなど、何かをしたいです。私はモジュールを作成しました。次のようなものから始めてください:カスタム#%module-beginで機能を定義する方法は?

(define-syntax (module-begin stx) 
    (syntax-case stx() 
    [(_ EXPR ...) 
    #'(display (apply string-append (filter string? (list EXPR ...))))])) 

しかし、これは私が言語で定義を使うのを妨げています。私はエラー "定義:式のコンテキストで許可されていません"を取得します。

defineやその他のトップレベル式を使用する能力を失うことなく文字列を取得するにはどうすればよいですか?私はすべての定義を事前に把握し、それらを最初に移動する必要がありますか?

答えて

3

短い答え

あなたのために懸命に仕事をするためにmake-wrapping-module-beginを使用してください。

(require syntax/wrap-modbeg) 
(define-syntax module-begin (make-wrapping-module-begin #'wrap-expression)) 
(define-syntax (wrap-expression stx) 
    (syntax-case stx() 
    [(_ expr) #'(println expr)])) 

wrap-expressionには、式で必要なものを変更します。定義、requireフォームなどには適用されません。一度に1つずつ、一度に1つずつモジュール本体式を取得することに注意してください。

長い答え

あなただけのマクロエクスパンダとプリミティブ#%plain-module-beginフォームはそれを行うことができますなど、モジュールレベルの定義を登録する力を持っているrequireフォームを解釈しません。したがって、module-beginマクロはに協力してと一致させる必要があります。

あなたのマクロを使用すると、次の区別できるように、部分的に各モジュールレベルのフォームを展開するlocal-expandを使用する必要があります。

  • モジュールレベルの定義
  • requireprovideフォーム
  • beginシーケンス、どのモジュール本体に接続する必要があります。

requireまたはprovideという形式を取得した場合は、#%plain-module-beginプリミティブに投げてください。あなたが扱う表現。もう一度、あなたは好きです。 beginフォームの場合は、サブフォームにあなたの再発があります。コードは次のようになります。

(define-syntax (module-begin stx) 
    (syntax-case stx() 
    [(_ form ...) 
    #'(#%plain-module-begin (wrap-module-form form) ...)])) 

(define-syntax (wrap-module-form stx) 
    (syntax-case stx() 
    [(_ form) 
    (let ([e-form (local-expand #'form 'module #f)]) 
     (syntax-case e-form (begin define-syntaxes define-values #%require #%provide) 
     [(define-syntaxes . _) 
      e-form] 
     [(define-values . _) 
      e-form] 
     [(#%require . _) 
      e-form] 
     [(#%provide . _) 
      e-form] 
     [(begin inner-form ...) 
      #'(begin (wrap-module-form inner-form) ...)] 
     [expr 
      #'(wrap-expression expr)]))])) 

(define-syntax (wrap-expression stx) 
    (syntax-case stx() 
    [(_ expr) #'(println expr)])) 

すべての新しいコードはmake-wrapping-module-beginが自動的にやっていることは基本的です。

+0

その詳細で包括的な答えをありがとう。私にはフォローアップの質問がありますが、これは私の無知を示​​していますが、私は恐れています。私の質問によれば、式をリストにまとめるにはどうしたらいいですか?あなたが言うように、wrap-extensionマクロは式を一度に1つしか扱うことができません。 –

関連する問題