問題タブ [hygiene]
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.
ruby - 衛生的な Ruby mixin を作成するにはどうすればよいですか?
サードパーティ クラスに機能を追加する mixin モジュールを作成しているとします。明らかに、サードパーティのクラスとそのクライアントがアクセスできるようにしたいメソッドとインスタンス変数の一部です。これらは mixin モジュールの公開インターフェースを構成します。
しかし、他の特定のメソッドとインスタンス変数をカプセル化する必要があります。私がミックスしているクラスからそれらにアクセスできるようにしたくありません。特に、誤ってオーバーライド、シャドー、競合、またはその他の方法で mixee クラスのメソッドまたはインスタンス変数を妨害したくありません。現在存在している可能性があるもの、またはサードパーティが私がミックスしているクラスを変更した場合に将来作成される可能性があるもの。
このように mixin が「衛生的」であることを確認するには、どのような予防措置を講じる必要がありますか?
macros - 誰かが私に「衛生」の概念を説明できますか(私はスキームプログラマーです)?
だから...私はスキームr6rsに不慣れで、マクロを学んでいます。誰かが「衛生」とはどういう意味かを私に説明できますか?
前もって感謝します。
lambda - マクロの一部だけを衛生的にする方法
lambda
という名前の のバージョンがlambda-r
欲しいのですが、そこから ができreturn
ます。例:
これにより、値が得られます6
。値が 7 であることを期待するかもしれませんが、2 に到達する前にラムダ式から 1 が返されるため、6 です。
これは、私が探している種類の変換の例です。次のように使用するlambda-r
とします。
私はそれを次のように変換したい:
これは、内部定義の代わりに let 式で表現することもできますが、わかりやすくするために定義を使用しています。
上記のコードは実際には期待どおりに機能することに注意してください。問題は、マクロlambda-r
として表現するのに苦労していることです。理由は、衛生的でありたいが、衛生的でありたくないからです。k
v
return
現時点での私のマクロは次のとおりです。
return
は衛生的に扱われ、その結果、使用時に直接見えないため、これは機能しませんlambda-r
。そのため、有効な識別子(lambda-r () (return 1))
ではないというエラーが表示されます。return
編集: Nathan Sanders の回答のおかげで、ここで何をしなければならないかを理解することに近づいています。ただし、次の手順を完全には理解していないため、これをまだ機能させることができていません。以下を説明するリソースについて説明/案内していただければ幸いです。
syntax
手順_datum->syntax
/syntax->datum
手順_
編集:気にしないでください-私は今それを手に入れました:)
macros - 非衛生的なマクロにつながる単一の名前空間についてはどうですか?(LISPで)
LISPの単一の名前空間が非衛生的なマクロにつながると主張する人もいます。 http://community.schemewiki.org/?hygiene-versus-gensym
http://www.nhplace.com/kent/Papers/Technical-Issues.html
マクロの衛生状態につながる単一、二重、または複数の名前空間を持つことについて、正確には何ですか?
macros - マクロを使用した優れたアプリケーションとプログラムのコレクション
私はマクロに非常に興味があり、その真の力を理解し始めたところです。マクロシステムの優れた使用法を収集するのを手伝ってください。
これまでのところ、次の構成があります。
パターンマッチング:
アンドリュー・ライトとブルース・デュバ。Scheme のパターン マッチング、1995 年
Prolog の精神に基づく関係:
ドライ・シタラム。schelog でのプログラミング。 http://www.ccs.neu.edu/home/dorai/schelog/schelog.html
ダニエル・P・フリードマン、ウィリアム・E・バード、オレグ・キセリョフ。合理的な策士。MIT プレス、2005 年 7 月
マティアス・フェライセン。Prolog を Scheme に音訳します。Technical Report 182、インディアナ大学、1985 年。
拡張可能なループ構造:
セバスチャン・エグナー。スキームの熱心な理解: SRFI-42 の設計。スキームと関数型プログラミングに関するワークショップ、13 ~ 26 ページ、2005 年 9 月。
オリン震える。ループの解剖学: 範囲と制御の物語。関数型プログラミングに関する国際会議、2005 年 2 ~ 14 ページ。
クラスシステム:
PLT。PLT MzLib: ライブラリ マニュアル。テクニカル レポート PLT-TR2006-4-v352、PLT スキーム社、2006 年 http://www.plt-scheme.org/techreports/
イーライ・バルジレイ。詐欺。 http://www.barzilay.org/Swindle。
コンポーネント システム:
ライアン・カルペッパー、スコット・オーエンズ、マシュー・フラット。コンポーネント インターフェイスにおける構文の抽象化。ジェネレーティブ プログラミングとコンポーネント エンジニアリングに関する国際会議、373 ~ 388 ページ、2005 年
ソフトウェア契約チェック
マシュー・フラットとマティアス・フェライセン。単位: HOT 言語用のクールなモジュール In ACM SIGPLAN Conference on Programming Language Design and Implementation, pages 236–248, 1998
オスカー ワデルと R. ケント ディブヴィグ。構文抽象化の範囲を拡張する。プログラミング言語の原理に関するシンポジウム、ページ 203–215、199
パーサージェネレーター
スコット・オーエンズ、マシュー・フラット、オリン・シヴァーズ、ベンジャミン・マクマラン。Scheme のレクサーとパーサーのジェネレーター。スキームと関数型プログラミングに関するワークショップ、41 ~ 52 ページ、2004 年 9 月。
エンジニアリング セマンティクスのツール:
マティアス・フェライセン、ロバート・ブルース・フィンドラー、マシュー・フラット。PLT Redex によるセマンティクス エンジニアリング。MIT プレス、2009 年 8 月。
コンパイラ変換の仕様:
Dipanwita Sarkar、Oscar Waddell、R. Kent Dybvig。コンパイラ教育のための nanopass フレームワーク。Journal of Functional Programming、15(5):653–667、2005 年 9 月。教育パール。
斬新な実行形態
シリアライズ可能な継続を持つサーブレット Greg Pettyjohn、John Clements、Joe Marshall、Shriram Krishnamurthi、Matthias Felleisen。一般化されたスタック検査からの続き。関数型プログラミングに関する国際会議、216 ~ 227 ページ、2005 年。
定理証明システム
セバスチャン・エグナー。スキームの熱心な理解: SRFI-42 の設計。スキームと関数型プログラミングに関するワークショップ、13 ~ 26 ページ、2005 年 9 月。
型による基本言語の拡張
Sam Tobin-Hochstadt と Matthias Felleisen 型付きスキームの設計と実装。プログラミング言語の原理に関するシンポジウム、ページ 395–406、2008 年。
怠惰
Eli Barzilay と John Clements。すべてのハードワークのない怠惰: 教育のための怠惰な言語と厳格な言語の組み合わせ。教育における関数型および宣言型プログラミング、9 ~ 13 ページ、2005 年。
機能的反応性
グレゴリー・H・クーパーとシュリラム・クリシュナムルティ。値による呼び出し言語に動的データフローを埋め込む。ヨーロッパプログラミングシンポジウム、2006年
参照:
macros - スキームの構文規則-(let)と(define)の間の変数バインディングの違い
R 5 RS仕様では、以下を使用して定義されたマクロの要件の一部として次のように規定されていsyntax-rules
ます。
マクロトランスフォーマーが識別子への自由参照を挿入する場合、その参照は、マクロの使用を取り巻く可能性のあるローカルバインディングに関係なく、トランスフォーマーが指定された場所に表示されていたバインディングを参照します。
私はこれが実際にどのように機能するかを理解しようとしています。たとえば、次のコードがある場合:
直後に実行された場合、次のように評価されると思いますoriginal
。
no-match
そして、これは、var
以前にスコープに導入されたものがマクロ定義でtest-var
のバインディングと一致しないためであると予想します。var
しかし、次の例は私を困惑させました:
チキンスキームでは、これはに評価されnew-var
ます。前の例no-match
と同じ理由であると思っていたでしょう。(let)
これは2回使用した場合の問題かもしれないと思いましたが、使用してもdefine
結果は変わりませんnew-var
(set! var 'new-var)
ここで何が起こっているのかについて誰かが何か洞察を持っていますか?R 5 RSごとに何が起こるべきですか?
scheme - スキームにおける構文オブジェクトの目的は正確には何ですか?
スキームをよりよく理解するために、Python で小さなスキームのような言語を書こうとしています。
問題は、私が構文オブジェクトに固執していることです。それらが何のためにあり、どのように機能するかを本当に理解していないため、それらを実装できません。
それらを理解するために、DrRacket の構文オブジェクトを少しいじってみました。
私が見つけたものから、評価することは評価することと#'(+ 2 3)
同じです。ただし、最上位の名前空間に'(+ 2 3)
レキシカル変数があり、その場合でも が返されますが、エラーがスローされます。+
(eval '(+ 2 3))
5
(eval #'(+ 2 3))
例えば:
(eval (top-sym))
、(eval (top-stx))
、および(eval (shadow-sym))
すべて return 5
、 while(eval (shadow-stx))
はエラーをスローします。それらのどれも戻りません6
。
私がよく知らなかった場合、構文オブジェクトの唯一の特別な点は (エラー報告を改善するためにコードの場所を保存するという些細な事実を除けば)、特定の状況でエラーをスローすることだけだと思います。対応するシンボルは、望ましくない可能性のある値を返します。
ストーリーがそれほど単純である場合、通常のリストやシンボルよりも構文オブジェクトを使用する利点はありません。
だから私の質問は: 構文オブジェクトを特別なものにするために欠けているものは何ですか?
macros - ラケットのマクロ定義マクロ?
Common Lisp では、マクロ定義マクロを作成するのは比較的簡単です。たとえば、次のマクロ
別のマクロに展開されるため、マクロ定義マクロです。
今置くと
私たちのプログラムでは、新しい関数を定義するたびにdef
代わりに書くことができます。defun
もちろん、abbrev
それ以外にも使えます。たとえば、
(/. (x) (+ x 1))
の代わりに書くことができます(lambda (x) (+ x 1))
。良い。(略語の詳細な説明については、http://dunsmor.com/lisp/onlisp/onlisp_20.htmlを参照してください)
さて、私の質問は次のとおりです。
- Racket でマクロ定義マクロを作成できますか?
- できる場合は、どうすればよいですか?(例えば、
abbrev
Racket でマクロに似たものを書く方法は?)
macros - 衛生的な `define-let` マクロの作成
ラケットでマクロを作成しようとしています。これは、のヘッダー、つまり部分だけdefine-let
を「保存」し、後で再利用できるようにします。(let ((var value) ...) ...)
(var value) ...
以下のコードは期待どおりに動作します。
問題は、マクロが健全性を損なうことです: 以下の例に示すように、マクロによって生成される ay
で宣言された変数define-let
は、健全性のために新しいインターンされていないシンボルである必要がありますが、マクロから漏れてしまいます。で、誤ってアクセスできます(displayln y)
。
define-let
最初の例のように動作するだけでなく、2 番目の例のように、マクロによって識別子が生成されたときに衛生状態を維持するようにマクロを作成するにはどうすればよい"okay"
でしょうか?