構文パラメーターを使用して構文を置き換えることはできますか?

ガブリン

挿入する必要のある場所に新しい構文を挿入するために、構文パラメーターを使用しようとしています。この結果は、他の構文で使用されます。ただし、期待どおりに機能していません。最小限の作業例を次に示します。

(require racket/stxparam)
(require (for-syntax racket/stxparam))

;; declare parameter to be replaced with code
(define-syntax-parameter placeholder
  (lambda (stx)
    (raise-syntax-error
     (syntax-e stx)
     "can only be used inside declare-many-commands")))

;; this is just to print what 'arg' looks like
(define-syntax (print-syntax stx)
  (syntax-case stx ()
    [(_ arg)
     #'(displayln 'arg)]))

;; this is the top-level entity invoked to produce many commands
(define-syntax-rule (declare-many-commands cmds)
  (begin
    (let ([X 10])
      (syntax-parameterize
       ([placeholder (make-rename-transformer #'X)])
       cmds))
    (let ([X 20])
      (syntax-parameterize
       ([placeholder (make-rename-transformer #'X)])
       cmds))))

(declare-many-commands
 (print-syntax placeholder))

これを実行したときに結果として取得したいのは次のとおりです。

10
20

しかし、私が得るものは次のとおりです。

placeholder
placeholder

編集:

問題を改善するための新しい質問を投稿しました:Racketの構文パラメーターを使用してコンパイル時に構文を挿入しますか?

アレクシスキング

ここでの問題は、print-syntaxマクロがその入力を引用し、マクロトランスフォーマーへの入力が拡張されていない構文であるということです。これは、の展開(print-syntax placeholder)が常にであり(displayln 'placeholder)、の下quoteマクロ展開が発生しないことを意味しplaceholderます。したがって、スコープ内バインドは関係ありません。

構文パラメーターを使用する場合は、実際にplaceholderバインディングへの参照を作成する必要がありますこの場合、の使用を削除する必要がありますquoteに変更print-syntaxすることもできます(displayln arg)が、その時点でprint-syntaxは、displayln関数と同等であるため、マクロになる理由は実際にはありません代わりにそれを使用してください:

(declare-many-commands
 (displayln placeholder))

これは1020期待どおりに印刷されます。

あなたが本当に欲しがっている可能性がありますquote、そして私はあなたの質問を理解していません。ただし、その場合、追加のコンテキストがないと、何が得られているのかを理解するのは難しいと思います。

この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。

侵害の場合は、連絡してください[email protected]

編集
0

コメントを追加

0

関連記事

分類Dev

可変置換構文を統一することはできますか?

分類Dev

GHC書き換えルールは、糖衣構文を認識することを知っていますか?

分類Dev

不変(通常はConcurrentHashMap)データ構造の公式パターンがあり、間隔を置いて置き換えることができますか?

分類Dev

maketransを使用して1文字を2文字に置き換えることは可能ですか?

分類Dev

Appleがネストされた構造体タイプを使用して「String」タイプのパラメータを置き換えることを選択するのはなぜですか?

分類Dev

メソッドのパラメーターとしてC ++ lamda式の構文を理解することができません

分類Dev

仮想関数を自動パラメーターに置き換えることはできますか?

分類Dev

SML:構文エラー:FUNをVALに置き換えます

分類Dev

Roslyn-構文ルートのテキストスパンを置き換えることでドキュメントのエラーを修正

分類Dev

アクセス構文を変更せずに属性をラムダに置き換えることはできますか?

分類Dev

再帰を使用してパワー演算子 (**) を置き換えることはできますか?

分類Dev

vimは特別なPython式を生の文全体として置き換えることができますか?

分類Dev

linq(クエリ構文)の範囲変数をパラメーターとして使用することは可能ですか?

分類Dev

このextensionmethodを変更して、よりクリーンな構文にすることはできますか?

分類Dev

INは、構造体コンストラクター構文を使用してマルチパートキーで使用できますか?

分類Dev

host:port構文を使用してサーバーにSSH接続することはできません

分類Dev

Spring aopの側面:「..」を使用してもパラメーターを置き換えることができませんか?

分類Dev

AWS Cloudformation CLIは、パラメーターをjsonファイルとして渡すときに省略構文を使用します

分類Dev

ICUメッセージ構文を使用する場合、複数形の「オフセット」パラメータをコードに置き換える必要がありますか?

分類Dev

構造体メソッドを介してポインターを置き換えることはできません

分類Dev

PyTorchの不明なPython構文:インスタンスはパラメーターを直接受け取ることができます

分類Dev

Javascriptは++を置き換えます。--変数を更新して返す関数呼び出しでパラメーターとして使用する場合

分類Dev

パラメータ付きのUPDATE句は、構文が原因でエラーを返します

分類Dev

MYSQLクエリで複数のパラメータ置換を使用する場合の構文エラー

分類Dev

レコード構文とHaskellデータ型の列挙を混在させることはできますか?

分類Dev

pretty-config.xml構成をアノテーションに置き換えることはできますか?

分類Dev

文字列propertyNameパラメーターをラムダ式に置き換えることはできません

分類Dev

Excel関数は、並べ替えられたデータをソースとして使用できますか?構文?

分類Dev

Python SyntaxError:構文が無効です。python3の関数パラメーターで角かっこを使用できますか?

Related 関連記事

  1. 1

    可変置換構文を統一することはできますか?

  2. 2

    GHC書き換えルールは、糖衣構文を認識することを知っていますか?

  3. 3

    不変(通常はConcurrentHashMap)データ構造の公式パターンがあり、間隔を置いて置き換えることができますか?

  4. 4

    maketransを使用して1文字を2文字に置き換えることは可能ですか?

  5. 5

    Appleがネストされた構造体タイプを使用して「String」タイプのパラメータを置き換えることを選択するのはなぜですか?

  6. 6

    メソッドのパラメーターとしてC ++ lamda式の構文を理解することができません

  7. 7

    仮想関数を自動パラメーターに置き換えることはできますか?

  8. 8

    SML:構文エラー:FUNをVALに置き換えます

  9. 9

    Roslyn-構文ルートのテキストスパンを置き換えることでドキュメントのエラーを修正

  10. 10

    アクセス構文を変更せずに属性をラムダに置き換えることはできますか?

  11. 11

    再帰を使用してパワー演算子 (**) を置き換えることはできますか?

  12. 12

    vimは特別なPython式を生の文全体として置き換えることができますか?

  13. 13

    linq(クエリ構文)の範囲変数をパラメーターとして使用することは可能ですか?

  14. 14

    このextensionmethodを変更して、よりクリーンな構文にすることはできますか?

  15. 15

    INは、構造体コンストラクター構文を使用してマルチパートキーで使用できますか?

  16. 16

    host:port構文を使用してサーバーにSSH接続することはできません

  17. 17

    Spring aopの側面:「..」を使用してもパラメーターを置き換えることができませんか?

  18. 18

    AWS Cloudformation CLIは、パラメーターをjsonファイルとして渡すときに省略構文を使用します

  19. 19

    ICUメッセージ構文を使用する場合、複数形の「オフセット」パラメータをコードに置き換える必要がありますか?

  20. 20

    構造体メソッドを介してポインターを置き換えることはできません

  21. 21

    PyTorchの不明なPython構文:インスタンスはパラメーターを直接受け取ることができます

  22. 22

    Javascriptは++を置き換えます。--変数を更新して返す関数呼び出しでパラメーターとして使用する場合

  23. 23

    パラメータ付きのUPDATE句は、構文が原因でエラーを返します

  24. 24

    MYSQLクエリで複数のパラメータ置換を使用する場合の構文エラー

  25. 25

    レコード構文とHaskellデータ型の列挙を混在させることはできますか?

  26. 26

    pretty-config.xml構成をアノテーションに置き換えることはできますか?

  27. 27

    文字列propertyNameパラメーターをラムダ式に置き換えることはできません

  28. 28

    Excel関数は、並べ替えられたデータをソースとして使用できますか?構文?

  29. 29

    Python SyntaxError:構文が無効です。python3の関数パラメーターで角かっこを使用できますか?

ホットタグ

アーカイブ