問題タブ [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.
macros - スキーム マクロについて学習するためのソース: define-syntax および syntax-rules
私はJRM の Syntax-rules Primer for the Merely Eccentric を読み、構文規則とそれが common-lisp の define-macro とどのように異なるかを理解するのに役立ちました。syntax-rules は、define-syntax 内で構文トランスフォーマーを実装する唯一の方法です。
私は 2 つのことを探しています。1 つ目は構文規則の例と説明であり、2 つ目は定義構文を使用する他の方法を学ぶための良い情報源です。どのリソースをお勧めしますか?
scheme - 式をネストするためのスキーム マクロ
次のような式を取るマクロをSchemeで(define-syntax
たとえば、を使用して)記述できますか?
そして、このような式を出力として生成しますか?
もちろん、任意の長さです。次のようなテンプレートを考えると、それを行う方法が思いつきません。
macros - ベクトル パターンは構文規則でどのように使用されますか?
私は Common Lisp マクロを書いてきたので、Scheme の R5Rs マクロは私にとって少し不自然です。シンタックスルールでベクトルパターンをどのように使用するか理解していないことを除いて、私はアイデアを得たと思います:
引数をベクトルとして記述する必要があるマクロを使用する方法がわかりません。
それらのパターンを使用する何らかのテクニックはありますか?
ありがとうございました!
scheme - Scheme の letrec のこの定義に誤りがあるとすれば、それは何ですか?
R5RS は、ライブラリ形式の構文に対して提案されたマクロ定義を示します。
http://schemers.org/Documents/Standards/R5RS/HTML/r5rs-ZH-10.html#%_sec_7.3
これはまた、非常に複雑な方法で letrec を定義します。確かに私がそれを定義する方法ではありません。
letrec のセマンティクスを理解している限り、名前付き let として頻繁に使用します。このように機能しますが、特殊相対性理論や確立された音韻論を反証できると考えている哲学者とのかなりの議論を行ってきたので、複雑な問題に対する単純な解決策があると考えるとき、それはおそらく違う。このマクロが letrec のセマンティクスを満たさない点がいくつかあるに違いありません。
この定義では、定義は letrec の本体に対してローカルであり、相互再帰のために相互に参照できます。何が間違っているのか (もしあれば) よくわかりません。
macros - スキーム内のこの define-syntax マクロの何が問題になっていますか?
私は SICP に取り組んでおり、いくつかの例をガイルで試してみたいと思っていました。私はストリームの例を試していて、この StackOverflow questionから得た cons-stream の実装が必要でした。ただし、これをguileに入力すると、次のようになります。
これの何が問題なのかわかりません - () を '() に置き換えて [ ] を削除しようとしましたが、有効な R5RSのように見えてもまだ機能しません。私は現在 guile 1.8.7 を使用しています。GNUドキュメントで言及されている v2.0.1 のパッケージが表示されません。これが機能しない理由でしょうか?
functional-programming - 「call/cc」を使用して「if」を実装できますか?
「call/cc」を使用して任意の制御フロー構造を実装できると聞いたので、「call/cc」を使用してそのようなすべての構造を実装しようとしていますが、問題が発生しています。「if」がないと仮定すると、「define-syntax」と「call/cc」を使用してどのように実装しますか? それは可能ですか、それとも私は誤解されていますか? 「call/cc」を使用して無条件ジャンプを実装する方法は知っていますが、マシンレベルでは、実行がプロセッサのステータスビットに依存する分岐命令で条件付き実行が実行されます。このタイプの構造がなければ、それがどのように行われるかわかりません。
macros - スキームマクロ拡張:define-syntax内にlet-syntaxをネストする
拡大したい
の中へ
私の試みは:
マクロステッパーを使用すると、マクロの最初のステージが次のように展開されることがわかります。
これは、単独で評価すると完全に機能しますが、全体として実行するとf
、未定義の識別子であるというエラーが発生します。これはスコープの問題だと思いますが、このタイプのマクロ展開は可能ですか?
scheme - スキームR5RS定義-構文は無視されますか?
スキームの学習を開始しました。私はコンパイラー/インタープリターとしてDr.Racketを使用しています。
いくつかの文字列関数(正確には文字列置換)が必要なので、SRFI13からコピーしました。
テストすると表示されます。
それはで定義されています
無視されているようですね。実際に何が起こっているのですか?
macros - ラケットマクロ-ペアを作る
私はRacketマクロに飛び込み始めたばかりで、簡潔な単純なマクロ定義マクロを作成しようとしています。次のような式を拡張したいと思います。
このようなものに:
したがって、元の式のcddrは式のペアに変換され(構文ルールの本文で使用するため)、idはこれらの各ペアの車に挿入されます。
構文規則によって提供されるパターンマッチングのみを使用すると、再帰的に考えるのに問題があります(式を通常のリストであるかのように操作したいと思っています)。どんなパターンを使うべきですか?または、どういうわけかそれを通常のリストとして操作し、展開で使用するために結果の引用を解除することはできますか?
どうもありがとう
編集-Taymonの回答によって通知された暫定的な解決策
ここでの私の好奇心の一部は、それらのペアの括弧を取り除くことでした。構文の場合を調べましたが、少し混乱したので、純粋にパターンマッチングサブ言語でそれを実行しようとしました。最終的に、Taymonのマクロを別のマクロと組み合わせて使用して、指定されたテンプレートを「ペアリング」しました(アキュムレータ関数のように機能します)。
macros - Chicken Scheme でマクロを展開中にエラーが発生しました
私は、Scheme のマクロ システムがどのように機能するかを学んでおり、自分のコードをより JavaScript らしく見せようとしています。function
というわけでマクロから始めようと思います。これは、関数定義を次のように表示する方法です。
次のように展開する必要があります。
そこで、次のようにマクロを書きます。
ただし、それを使用すると、次のエラーが発生します(チキンスキームで):
どこが間違っていますか?さらに、プログラムを自分でデバッグできるようにするには、このようなエラー メッセージをどのように読むのですか?