問題タブ [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.
inheritance - オブジェクトの親クラスの確認
オブジェクトが特定のクラスのものか、それから派生したものかを確認する方法を知りたいです。例えば:
あるいは、特定のオブジェクト (またはクラス) のすべての基本クラスのリストを返す関数も高く評価されます。
common-lisp - Common Lisp CLOSディスパッチ
リストの車にディスパッチするジェネリック関数を取得する良い方法はありますか?
私は記号代数プログラムに取り組んできましたが、現在、car
タイプを示す s とは異なるキーワードを持つリストとして多くのデータを保存しています。たとえば、 として保存されているシンプリスが'(:simplex #(0 1 2))
あり、 として保存されている当分の間ステップと呼んでいるものがあります'(:step #(0 1 0 1))
。理想的には、組み込みのディスパッチメカニズムを使用して、これらの両方の次元と境界を取得できるようにしたいと考えています。
oop - Common Lisp (CLOS) でオブジェクト メソッドを一覧表示する
オブジェクトに定義されたすべてのメソッドを取得し、オブジェクトが指定されたメソッドに応答するかどうかを確認する方法はありますか?
Rubyの「foo」.methodsのようなものを探しています
また、Ruby の "foo".respond_to? のようなものもあります。:方法
スロットには がありますがslot-exists-p
、メソッドには何がありますか?
ありがとう。
validation - CLOS: initarg, slot-writer?
CLOS でスロットのタイプを強制するにはどうすればよいですか。
それが答えになることはわかってい(locally (declare (optimize safety))) (defclass foo () ((num :type number...
ますが、移植性が十分ではないと思います。(CLISP 2.49 ではなく、SBCL のみ)
または、それらを実装する必要がありますか?(指定された s に続く各スロットをチェックするため:type
。)
- デフメソッド
:after (setf SLOT)
。 - デフメソッド
:after initialize-instance
。
それを行う簡単な方法はありますか?
また、フック「スロット更新」用の「MOP」またはメタクラスはありますか?
ありがとう。
編集:CLOSと同じ質問ではないと思います:スロットにシンボルのベクトルの型を強制的に持たせる方法は? 、その「メタクラス」などについてさらに情報が必要だからですslot-value-with-class
。
編集:私closer-mop
は、好ましいポータブルな方法を提供することがわかりました。
performance - CLOS の make-instance は非常に遅く、SBCL でヒープの枯渇を引き起こします
Common Lisp (64 ビット Debian GNU/Linux の SBCL 1.1.5) でマルチアーキテクチャ アセンブラ/逆アセンブラを作成しています。現在、アセンブラは x86-64 のサブセットに対して正しいコードを生成します。x86-64 アセンブリ コードをアセンブルするために、ハッシュ テーブルを使用します。このテーブルでは、"jc-rel8"
およびなどのアセンブリ命令ニーモニック (文字列)"stosb"
が、以下のような 1 つ以上のエンコーディング関数のリストを返すキーです。
エンコーディング関数は次のようになります (ただし、一部はより複雑です)。
現在、 NASM (NASM 2.11.06) の命令エンコード データ (ファイルinsns.dat
) を Common Lisp CLOS 構文に変換して、完全な x86-64 命令セットを取り込もうとしています。これは、バイナリコードを発行するために使用される通常の関数 (上記の関数など) をカスタムx86-asm-instruction
クラスのインスタンス (これまでのところ非常に基本的なクラスで:initarg
、:reader
、:initform
などで 20 スロットほど) に置き換えることを意味しemit
、引数を持つメソッドが使用されます。指定された命令 (ニーモニック) と引数のバイナリ コードを出力します。変換された命令データは次のようになります (ただし、40,000 行を超え、正確には 7193make-instance
と 7193setf
です)。
insns.dat
単純な Perl スクリプトを使用して (上記のように) NASM を Common Lisp 構文に変換しました (以下では、スクリプト自体に興味深いものはありません)。原則として、それは機能します。動作しますが、これらの 7193 オブジェクトのコンパイルは非常に遅く、一般的にヒープの枯渇を引き起こします。16G のメモリを搭載した Linux Core i7-2760QM ラップトップでは、(eval-when (:compile-toplevel :load-toplevel :execute)
上記のような 7193 個のオブジェクトを含むコード ブロックのコンパイルに 7 分以上かかり、次のようなヒープの枯渇を引き起こすことがあります。
--dynamic-space-size 4000
SBCL をコンパイルするにはパラメーターを追加する必要がありましたが、それでも 4 ギガバイトの動的スペース ヒープを割り当てた後でも、使い果たされることがあります。ヒープの枯渇が解決されたとしても、クラス (これらのインスタンスに使用されるクラス) にスロットを追加しただけで 7193 個のインスタンスをコンパイルするのに 7 分以上かかるのは'x86-asm-instruction
、REPL での対話型開発には長すぎます (それが重要な場合はslimvを使用します)。 .
(time (compile-file
出力は次のとおりです。
OOP (CLOS) を使用すると、命令ニーモニック (jc
またはstosb
上記、など)、命令の:name
許可されたオペランド ( :operands
)、命令のバイナリ エンコーディング ( 、 など#xaa
) stosb
、:code-string
および命令の可能なアーキテクチャ制限 ( :arch-flags
) を 1 つのオブジェクトに組み込むことができます。しかし、少なくとも私の 3 年前のコンピューターは、約 7000 個の CLOS オブジェクト インスタンスをすばやくコンパイルするには効率的ではないようです。
私の質問は: SBCL をmake-instance
高速化する方法はありますか、それとも上記の例のように通常の関数でアセンブリ コードの生成を維持する必要がありますか? また、他の可能な解決策についても教えていただければ幸いです。
念のため、Perl スクリプトを次に示します。
common-lisp - defgeneric での :method オプションの使用
Keene の本を読むと、ジェネリック定義自体でメソッドを指定できるように見えるオプションdefgeneric
があることに気付きました。:method
私が見たほとんどのドキュメントには、適用可能なすべてのメソッドが個別defmethod
の s で定義されています。hyperspecは、通常の明確さで:method
、 のオプションとしてリストされていますがdefgeneric
、それが何を意味するかは述べていません。
オプションはデフォルトを提示しますか:method
、または少なくとも、最も一般的なユースケースが予想されるものを文書化しますか、または追加のセマンティクスがありますか? スタイル ポイントとして、メソッドを 1 つだけ定義すると予想される場合は、それをdefgeneric
フォームで定義する方が理にかなっていますか (実際にそれができる場合)、または で個別に定義する方が合理的defmethod
ですか? それとも、この場合ジェネリック関数を作成し、代わりに通常の関数を使用するのは意味がありませんdefun
か?
common-lisp - CLOS: シンボルをアクセサに変換
これは本当の初心者の質問だと思いますが、ここで答えを見つけることができませんでした。私の問題:クラスのスロットの値を次のように設定したいと思います:
私はこれのために小さな関数を書きました:
これを for ループで使用しています。このループでは、2 つのリスト (スロット (シンボルのリスト) と値 (数字のリスト)) を反復処理し、インスタンスの複数のスロットを値に設定したいと考えています。
私が得ているエラーは次のとおりです。
"フォーム ((setf スロット) #:|Store-Var-773597|#:g773598 の未定義の演算子 (setf スロット)。"
問題は、関数の setf が入力引数に指定された値を使用していないことだと思います。'slot' ですが、'slot' を演算子として読み取ります。
私はさまざまなこと、シンボル関数、ファンコールなどを試しましたが、何がうまくいかないのか本当に理解していないので、もう何をすべきかわかりません。
どんな助けでも大歓迎です。
ありがとう、マリーノエ