問題タブ [define-syntax]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
list - リストがラムダの引数になるラケットでマクロを作成する方法は?
define-syntax-ruleリストを引数として受け入れ、リスト(単一の要素の場合は引用符)をラムダの本体として受け入れるにはどうすればよいでしょうか。私は次のようなことをしたいと思います:
と をいじってみましたが、define-syntax-ruleそれ自体はプロシージャではなくマクロのように見えるため、見つけようとして困惑しました...applylambda
evalああ...そして、それは悪質なので、使用しないソリューションが欲しいです...
アップデート
答えてくれてありがとう、ライアン...それはほとんどそれでした! =) eval の問題は、現在のスコープをキャッチするのがうまくいかないことでした...このようにして、次のようなことができます
これはevalで惨めに失敗します...これは単なる学術的な例ですが、正しさの良いテストだと思います.
macros - Racket またはその他のスキームでコンパイル時 (展開時) マクロ変数を定義する方法はありますか?
簡単な例を挙げると:
そのような与えられた:
以下はすべて に評価され#tます。
define-macro-variable上記の例で想定されていることを実行する実際のラケット機能はありますか?
編集:
回避策を見つけました:
しかし、マクロ変数を使用するすべてのマクロを 1 つの式にする必要のないソリューションを希望します。
macros - スキームでのマクロのキャプチャ
define-syntaxラケットを使用して、またはdefine-syntax-ruleラケットでキャプチャ マクロを定義する最も簡単な方法は何ですか?
具体的な例として、aifCL スタイルのマクロ システムの簡単な例を次に示します。
アイデアは、and句itの結果にバインドされるということです。素朴な音訳(オプションの代替を差し引いたもの)はtestif-trueif-false
これは問題なく評価されますitが、句で使用しようとするとエラーになります。
anaphora卵は次のように実装さaifれます
ir-macro-transformerしかし、Racket は定義も文書化もしていないようです。
objective-c - Objective Cで#define変数をメソッドパラメータとして使用する方法
私はObjective-Cにかなり慣れていません。やりたいことは、EntityNameConstants.hすべてのエンティティ名を保存するファイルに変数を定義することです。
また、ManagedObjectContext に関連するすべてのメソッドについて、リポジトリ内のすべての定義を使用します。
例えば。これは .h ファイルにあります
リポジトリでは、この定数を次のように使用したい
しかし、私はこれを行うことができません.Parse Issueエラーが発生します.
私はここで何か悪いことをしていますか?
for-loop - スキームでの for ループの定義
注: これは Gauche Scheme バージョン 0.9.3.3 のようです。
私はこれらの Lisp 言語に頭を悩ませているようには見えません :/.
Scheme で for ループ構文を定義しようとしています。これが再帰関数で実行可能かどうかはわかりませんが (可能だと思います)、この時点で本当にdefine-syntax作業を開始したいと考えています。
次のコードを使用して、ループを 1 回実行することができます (その後、ループが終了したように見えます)。
省略記号で定義することもできればいいのですが、これでは「テンプレートに一定の形式の繰り返しが含まれる」ことになります。R5RS 仕様のマクロ セクションを読みましたが、すぐにテンプレート セクションを読み直す予定です。
私はこれを最初に試しましたが、出力なしで失敗する前に約10秒間実行されます...私はcompileonline.comを使用しているので、何か関係があるかもしれません:
forloop を呼び出さなくても問題はありません (マクロを展開する必要がないためだと思います)。したがって、これらをテストするために使用したコードは次のとおりです。
私は何を間違っていますか?私はステートメントを正常に実装しましたwhen(私自身ですが、そこには何十もの例があり、私はすでにそれらの多くを見てきました)。私がやりたいことの再帰的な性質と省略記号が私を台無しにしていると思います。
macros - 衛生的な `define-let` マクロの作成
ラケットでマクロを作成しようとしています。これは、のヘッダー、つまり部分だけdefine-letを「保存」し、後で再利用できるようにします。(let ((var value) ...) ...)(var value) ...
以下のコードは期待どおりに動作します。
問題は、マクロが健全性を損なうことです: 以下の例に示すように、マクロによって生成される ayで宣言された変数define-letは、健全性のために新しいインターンされていないシンボルである必要がありますが、マクロから漏れてしまいます。で、誤ってアクセスできます(displayln y)。
define-let最初の例のように動作するだけでなく、2 番目の例のように、マクロによって識別子が生成されたときに衛生状態を維持するようにマクロを作成するにはどうすればよい"okay"でしょうか?
macros - Schemeマクロ展開の順序を制御するには?
私は、Racket マクロ拡張機能を使用しています。syntax-id-rulesこれは、他のスキームの実装が という名前で提供していますidentifier-syntax。これらにより、定義された識別子が先頭位置にない場合でも発生するマクロ展開を指定できます。たとえば、次のようになります。
は、識別子proxyを のプロキシに設定しhiddenます。これは役に立たない例ですが、使用法を示しています。
fooのような識別子マクロを使用している場合にオーバーライドしたい、グローバルな通常のマクロが必要な状況に陥っています。これを と呼びましょうproxy。つまり、次のようなことができるようになりたいです。
しかし実際には、マクロが 1 つ前に展開される'defaultため、最後の行は を返します。fooproxy
これらの行に沿って何かを達成する方法はありますが、proxy識別子マクロがデフォルトのマクロ定義をオーバーライドしますfooか? 私は特に上記のアーキテクチャに専念しているわけではありません。
追加: これは実際に使用するためのものではありませんが、正式なセマンティクスの理論的ポイントのデモンストレーションの一部です。
scheme - 定義構文の引数と使用法
Scheme での define-syntax の引数と使い方がよくわかりません。価値のあるものとして、私はプチシェケムを使用しています. 私はいくつかの情報源を見てきました:
http://docs.racket-lang.org/guide/pattern-macros.html
しかし、彼らは私が求めている理解を私に与えてくれませんでした。新しい構文が適用されたときに何が起こっているかについての明確な説明を探しています。構文が定義されているときの省略記号 ("...") の使用に特に興味があります。