問題タブ [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.
lisp - CLOS: スロット値を使用して別のスロットを初期化する
私はCLOSの使用にかなり慣れていません。ここでは、CLOS を使用して Queue を定義する 1 つの可能な方法を書きました。
ご覧のとおり、スロットの値を使用してqueue-size
、スロット内の配列を作成しelements
ます。しかし、残念ながら、これにより次のエラーが発生します。
私が言ったように、私はCLOSにかなり慣れていません。これを行う方法はありますか?ある種の init メソッドを上書きすることは可能ですか? はいの場合、どうすればよいですか?
common-lisp - CLOS クラス インスタンスをハッシュ テーブル キーとして使用しますか?
私は次のクラスを持っています:
ここで、このクラスをハッシュ テーブルのキーとして使用したいと思います。インスタンスのアドレスは、 と簡単に比較できますeq
。ただし、問題は、このcategory
クラスの同一のインスタンスが複数存在する可能性があることです。ハッシュ テーブルにこれもキーとして認識させたいと考えています。
だから、私はこのように関数の:test
引数を上書きしようとしていました:make-hash-table
残念ながら、これは許可されていません。:test
関数 eq、eql、equal、または equalp のいずれかの指定子である必要があります。
これを解決する 1 つの方法は、クラスcategory
を構造体に変換することですが、クラスにする必要があります。これを解決する方法はありますか?
class - Common Lispの構造体とクラスの違い
構造体についての私の理解では、構造体にはデータを格納するためのスロットがあり、型がmake-X
あり、スロットアクセサー関数があり、(型があるため) メソッドによって特殊化できるということです。
クラスについての私の理解は、それがすべて同じ多重継承を持っているということです。この質問に対する一番上の回答は、構造体は単一の継承を持つことができ、CLOS の初期実装は構造体よりも「はるかに遅い」と述べています。
人々が CLOS と構造体についてどのように話しているかに基づいて、他にもいくつかの違いがあるに違いないと思いますが、私の些細な Google 検索は役に立ちませんでした。だから私は尋ねます: CLOS と構造体の実際的な違いは何ですか?
methods - 標準関数でメソッドオブジェクトを呼び出す方法
メソッドオブジェクトを関数として呼び出すにはどうすればよいですか?
Closer-mopとclosパッケージはどちらも、メソッド オブジェクトを関数に変換するためのメソッド関数を提供します。ただし、別のパッケージを含めずにそれを行う方法はありますか? そうでない場合、どのパッケージですか?(SBCLを使用)しかし、パッケージが必要な場合、識別機能はどのようにそれを行いますか?
これは、find-method を使用してメソッド オブジェクトを取得する例です。問題は、method-to-be- call を呼び出す方法です。
二次的な質問として、ドキュメントによると、識別関数は最初にクラスごとに計算してメソッドオブジェクトを見つけようとし、それが失敗した場合はcompute-applicable-methodsを使用します。なぜこの 2 層アプローチを採用するのでしょうか。find-methodがこの 2 層のアプローチを行っていると仮定するのは正しいので、 find- methodを使用する方がよいでしょうか?
-- 付録 -- 以下のコメントで、Rainer Joswig は、この検索メソッドの形式は実装に依存していると指摘しました。
彼は、指定子リストはクラスであるべきだと言い、代わりに次のように提案します:
だから私は自分のクラスをそこに置くことを考えました:
どうやら(defclass a ... )はaをクラスに設定していません。実際、それは何にも設定されていません!
... 変数 A はバインドされていません。
ただし、これは機能します。
したがって、クラスは、defclass に提供されるシンボルの値ではなく、defclass からの戻り値です。