問題タブ [clos]
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.
class - 既存のクラスにもう 1 つのスーパー クラスを動的に追加することは可能ですか?
Common-Lisp CLOS で
既存のクラスにもう 1 つのスーパー クラスを動的に追加することは可能ですか。
アップデート:
同じ引数を使用してメソッド/関数にいくつかの動作を関連付けるdefassocのようなマクロを定義したかった
例えば
に展開
ここでは、 (gname (s (g group)) が呼び出されたときに、対応するタスクをグループに呼び出す必要があることを確認しています
このマクロを使用しました
しかし、問題はそれが上書きされることです
(ある場合は、あるかどうかを確認できます。)
しかし、上書きするメソッドがあるかどうかに関係なく、どのオブジェクトでも機能するようにしたい
したがって、基本的に、そのクラスとメソッドのコードを変更する必要があります。
したがって、親クラスを動的に追加してこのメソッドを定義することを決定した方法の1つです。
別の方法としてdefadvideまたはfwrapperを使用できますが、SBCLにはありません。
string - Lisp:CLOSクラスのデフォルトの文字列表現をオーバーライドするには?
Common Lisp では、CLOS クラスのデフォルトの文字列表現をオーバーライドして、そのクラスのオブジェクトがリストや配列などの他の型に埋め込まれている場合でも、CLOS クラスを呼び出したり、わかりやすいものを出力しformat
たりするにはどうすればよいでしょうか?princ
たとえば、(format t "~a~%" x)
x がソリューション クラスのインスタンスを保持しているときに呼び出すと、#<SOLUTION genes: #(1 2 3) scores: #(4 5) rank: 6>
の代わりに#<SOLUTION {BB7CD31}>
.
これまでのところ、このクラスのインスタンスを含むことがわかっている印刷構造を処理するカスタム関数を作成することしかできませんでしたが、これは面倒です。Lisp は、この機能を無料で入手する方法を提供しているのでしょうか?
common-lisp - CLOS は Common Lisp の弱点ですか?
私が言いたいのは、CLOS が Lisp の関数型プログラミングのやり方にとって悪い習慣であるということですか?
lisp - CLOSでの(:before /:after)メソッド呼び出しの順序?
次のコードの実行順序を理解するのに助けが必要です。
pie
以下を使用して、のインスタンスを作成します。
私はlispが最も具体的なものから最も具体的でないものまで関数を実行することを知っています。しかし、それ(defmethod cook ((p pie))
は呼び出された後に続いているようには見えません。
インスタンスはのであり、親クラスではないため、 (defmethod cook :after ((f food))
&(defmethod cook :after ((p pie))
は逆の順序で実行されると想定 します。pie
food
おかげで、どんな入力でも大歓迎です。
次のような出力を使用:
lisp - GNU clisp: no-applicable-method に関する警告メッセージの抑制
このコードは、警告メッセージを除いて、私が望むように機能します。GNU Common Lisp では、他の可能性のある警告メッセージを抑制せずにそのメッセージを抑制するにはどうすればよいですか?
Vatineの親切な返信に応じて編集します。
私はそれを試しましたが、状況は警告から致命的なエラーにエスカレートしました:
lisp - 重複を削除するときにキーとしてスロット値を指定する
次のコードは私が望むことをします:
しかし、13行目に関数を記述せずにこれを行う方法はありますか?クラスインスタンスのスロット値をキーとして指定する簡単な方法はありますか?
もちろん、以下は構文エラーで爆発しますが、それは私が探しているものの一般的な考えを与えます。
common-lisp - defgenericのオプションの引数?
さまざまな要素のHTMLを出力するためのメソッドをいくつか作成しています。各メソッドの出力は同じですが、必ずしも同じ入力が必要なわけではありません。
ニーズをエコーする方法も同様game-board
に取る必要がありplayer
ます(各プレイヤーは自分のピースしか見ることができないため)
ボードスペースをエコーする場合、プレーヤーごとに変更する必要はありません(ディスパッチは実際にはgame-board
メソッドで行われ、後でecho
スペースを呼び出します)。理想的には、私はできるだろう
後で、自分自身を正しく表示するために、プレーヤーだけでなく、それ以上のことを知る必要があるオブジェクトに遭遇することも考えられます。ただし、同じジェネリックに特化したメソッドがすでに存在するため、エラーが発生します。
echo-space
戻ってこれらのメソッドに名前を付けるのは理想的ではないようecho-board
です。
特殊なオブジェクトに基づいて他の引数を変更する標準的な方法はありますか?私は次のようなことをする必要があります
また
?より一般的には、誰かが私に具体的にまともなチュートリアルを教えてもらえdefgeneric
ますか?(関連するPCLの章といくつかのCLOSチュートリアルを読みましたが、ここで質問している状況については説明していません)。
lisp - Lispでクラスのパッケージを見つける方法は?
たとえば、(defclass x ()()) が p1 で定義されているとします。1 つの方法は、(symbol-package 'x) 経由でパッケージを取得することです。このソリューションの問題は、x が別のパッケージ p2 でエクスポートされることです。他の提案はありますか?
common-lisp - 特定のクラスのサブクラスのジェネリック関数を特殊化する方法
特定のクラスのサブクラスを指定するシンボルを取るジェネリック関数を特殊化するにはどうすればよいですか。例えば:
CLOSでそのようなディスパッチは可能ですか?もしそうなら、「のサブクラス」の代わりに何を書くべきですか?