問題タブ [gensym]
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 - この Lisp マクロは、それぞれの部分が機能しないのに、全体として機能するのはなぜですか?
私は Practical Common Lisp を読んだり作業したりしています。私は、Lisp でのテスト フレームワークの構築に関する章にいます。
以下のように機能「test-+」を実装しましたが、動作します:
覚えておいてください、私は言った、それは機能します.
「test-+」が参照するコードは次のとおりです。
今、私が行っていることは、Slime を使用して、これらを段階的にマクロ展開することです (マクロ展開 1 にマップされている ctrl-c RET を使用)。
したがって、「test-+」の「check」呼び出しは次のように展開されます。
そして、これをマクロ展開すると、次のようになります。
そして、この文の真上にあるそのコードが機能しません。これを REPL に貼り付けると、次のエラーが表示されます (Clozure Common Lisp を使用しています)。
アンバウンド変数: #:G2867 [タイプ UNBOUND-VARIABLE の条件]
同じコードを使用して、gensym を "x" などの変数名に置き換えると、問題なく動作します。
では、次の驚きをどのように説明できますか。
これらすべてを呼び出す「test-+」マクロは正常に動作します。
「combine-results」マクロのマクロ展開は実行されません。
「combine-results」のマクロ展開からgensymを削除すると、機能 します。
私が推測できる唯一のことは、gensyms の文字通りの使用を含むコードを使用できないということです。もしそうなら、それはなぜですか、そしてそれをどのように回避しますか? そして、それが説明でないなら、それは何ですか?
ありがとう。
clojure - ネストされた構文でのauto-gensymの調整-Clojureの引用符
gensym
Clojureでは、マクロを衛生的に保つために、マクロで内部的に使用するシンボルを作成するためにを使用する必要があります。ただし、ネストされた構文引用符で同じ記号を使用する必要がある場合があります。たとえば、値をシンボルにバインドlet
し、展開されたループで3回出力する場合は、次のようにします。
しかし、それは
x#
異なる構文引用符から作成されたため、フォーム内にネストされたフォームとは異なるシンボルをlet
フォームに生成します。println
それを解決するために、事前にシンボルを生成し、それを構文引用符に挿入することができます。
これにより、必要なすべての場所で同じ記号を使用して、正しい結果が生成されます。
これで、正しい結果が得られますが、コード自体は醜く冗長に見えます。シンボルを「宣言」する必要はありません。インジェクション構文により、マクロの外部から来たか、マクロのどこかで計算されたように見えます。auto-gensym構文を使用できるようにしたいと思います。これにより、これらがマクロ内部シンボルであることを明確にできます。
それで、ネストされた構文引用符でauto-gensymを使用して、それらに同じシンボルを生成させる方法はありますか?
lisp - 非インターン記号記号
Common Lisp について理解できないことがあります。
次のようなマクロを書いているとします。
私ができるよりも
これからどう展開していくのか見てみたい
Ok。uninterned として印刷された gensym で生成された一意のシンボルがあります。
したがって、私が知る限り、インターンされていないシンボルは、エバリュエーターがシンボルとデータのバインディングを内部的に作成しないシンボルです。
したがって、その形式にマクロ展開すると、(incf #:G4315) でエラーが発生するはずです。これをテストするには、REPL でそのフォームを評価するだけです。
では、なぜこの文字列に展開するマクロは完全に機能し、フォーム自体は機能しないのでしょうか?
macros - このマクロをclojureで作成するにはどうすればよいですか?
私はこの関数を持っています:
しかし、私は同じ名前の関数に解決されるページのリストを変更し続けており、次のように記述できるようにしたいと思います。
(def-handler善悪ニュートラル)
代わりは:
しかし、私は立ち往生しています。これまでの私のベストショットは次のようになります。
しかし、生成された呼び出しの要求はgensymではないため、完全には機能しません。そこでgensymを取得する方法がわかりません。
これは、新しいgensymが作成されたことに気付くまで、有望に見えました。
testing - gensyms を使用する clojure マクロをテストするには?
gensyms を使用するマクロをテストしたいと考えています。たとえば、これをテストしたい場合:
マクロ展開が使える...
...取得するため...
人が正しいことを確認するのは簡単です。
しかし、これを実用的でクリーンな自動化された方法でテストするにはどうすればよいでしょうか? gensym は安定していません。
(はい、特定のマクロの例が説得力がないことはわかっていますが、それでも問題は公正です。)
Clojure 式はデータとして扱うことができる (ホモイコニック言語です) ので、結果を次のように分解できます。
しかし、これは扱いにくいです。より良い方法はありますか?おそらく、便利なデータ構造の「検証」ライブラリがありますか? たぶん、破壊するとこれが簡単になりますか?ロジックプログラミング?
更新/解説:
「マクロ展開自体をテストしないでください」と言う経験豊富な人々のアドバイスに感謝しますが、それは私の質問に直接答えません。
マクロ展開をテストすることによってマクロを「単体テスト」することの何がそんなに悪いのですか? 展開をテストすることは理にかなっています -- そして実際、多くの人が自分のマクロをそのように REPL で「手作業で」テストしています -- では、それも自動的にテストしてみませんか? やらない正当な理由が見当たりません。マクロ展開をテストすることは、結果をテストすることよりも脆弱であることは認めますが、前者を実行することにはまだ価値があります。機能をテストすることもできます。両方を行うことができます。これはどちらかまたは両方の決定ではありません。
これが私の心理的な説明です。人々がマクロ展開をテストしない理由の 1 つは、現時点では少し面倒だからです。一般に、人は、本質的な価値とは無関係に、何かが難しいと思われる場合、それを行うことを正当化することがよくあります。はい - それがまさに私がこの質問をした理由です! もしそれが簡単だったら、人々はもっと頻繁にやると思います。もしそれが簡単なら、彼らは「やる価値がない」と答えて合理化する可能性は低いでしょう。
「複雑なマクロを書くべきではない」という議論も理解できます。もちろん。しかし、人々が「マクロをテストしないという文化を奨励すれば、複雑なマクロを書くことができなくなる」と考えないでほしいと思います。そのような議論はばかげているでしょう。複雑なマクロ展開がある場合、それが期待どおりに機能することをテストするのは賢明なことです。単純なミスからバグが発生する可能性があることにしばしば驚かされるため、私は個人的に単純なことでさえもテストを怠っていません。
clojure - 各特定の変数に gensym を適用する方法
init から end-1 までの x の body の値を 1 ずつ計算するマクロ (my-dotimes [x init end] & body) を書きたいと思います。捕獲問題」。次のように動作するはずです。
私のコードは:
しかし、macroexpand を使用してチェックすると、次のことがわかります。
どう変えようか迷ってます
python - 会話データを (Context 、 Response) のペアに分割する方法
Gensim Doc2Vec モデルを使用して、カスタマー サポートの会話の一部をクラスター化しようとしています。私の目標は、サポート チームに自動応答の提案を提供することです。
図 1:ユーザーの質問が次の会話行で回答される会話の例を示しており、データを簡単に抽出できます。
会話中に「こんにちは」と「私たちのオフィスはニューヨークにあります」と提案する必要があります
図 2:質問と回答が同期していない会話を説明する
会話中に「こんにちは」と「私たちのオフィスはニューヨークにあります」と提案する必要があります
図 3:回答のコンテキストが時間の経過とともに構築される会話を示しており、分類の目的で (私は推測していますが)、一部の行は冗長です。
会話中に「無料試用アカウントへのリンクはこちらです」と提案する必要があります
会話行ごとに次のデータがあります (簡略化):
誰が行を書いたか (ユーザーまたはエージェント)、テキスト、タイムスタンプ
次のコードを使用してモデルをトレーニングしています。
Q : トレーニング データをどのように構造化すればよいですか? また、生データからトレーニング データを抽出するために適用できるヒューリスティックは何ですか?