問題タブ [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.

0 投票する
2 に答える
413 参照

inheritance - オブジェクトの親クラスの確認

オブジェクトが特定のクラスのものか、それから派生したものかを確認する方法を知りたいです。例えば:

あるいは、特定のオブジェクト (またはクラス) のすべての基本クラスのリストを返す関数も高く評価されます。

0 投票する
1 に答える
195 参照

common-lisp - Common Lisp CLOSディスパッチ

リストの車にディスパッチするジェネリック関数を取得する良い方法はありますか?

私は記号代数プログラムに取り組んできましたが、現在、carタイプを示す s とは異なるキーワードを持つリストとして多くのデータを保存しています。たとえば、 として保存されているシンプリスが'(:simplex #(0 1 2))あり、 として保存されている当分の間ステップと呼んでいるものがあります'(:step #(0 1 0 1))。理想的には、組み込みのディスパッチメカニズムを使用して、これらの両方の次元と境界を取得できるようにしたいと考えています。

0 投票する
2 に答える
1205 参照

oop - Common Lisp (CLOS) でオブジェクト メソッドを一覧表示する

オブジェクトに定義されたすべてのメソッドを取得し、オブジェクトが指定されたメソッドに応答するかどうかを確認する方法はありますか?

Rubyの「foo」.methodsのようなものを探しています

また、Ruby の "foo".respond_to? のようなものもあります。:方法

スロットには がありますがslot-exists-p、メソッドには何がありますか?

ありがとう。

0 投票する
0 に答える
50 参照

validation - CLOS: initarg, slot-writer?

CLOS でスロットのタイプを強制するにはどうすればよいですか。

それが答えになることはわかってい(locally (declare (optimize safety))) (defclass foo () ((num :type number...ますが、移植性が十分ではないと思います。(CLISP 2.49 ではなく、SBCL のみ)

または、それらを実装する必要がありますか?(指定された s に続く各スロットをチェックするため:type。)

  1. デフメソッド:after (setf SLOT)
  2. デフメソッド:after initialize-instance

それを行う簡単な方法はありますか?

また、フック「スロット更新」用の「MOP」またはメタクラスはありますか?

ありがとう。

編集:CLOSと同じ質問ではないと思います:スロットにシンボルのベクトルの型を強制的に持たせる方法は? 、その「メタクラス」などについてさらに情報が必要だからですslot-value-with-class

編集:私closer-mopは、好ましいポータブルな方法を提供することがわかりました。

0 投票する
1 に答える
1012 参照

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 4000SBCL をコンパイルするにはパラメーターを追加する必要がありましたが、それでも 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 スクリプトを次に示します。

0 投票する
2 に答える
1397 参照

common-lisp - defgeneric での :method オプションの使用

Keene の本を読むと、ジェネリック定義自体でメソッドを指定できるように見えるオプションdefgenericがあることに気付きました。:method私が見たほとんどのドキュメントには、適用可能なすべてのメソッドが個別defmethodの s で定義されています。hyperspec、通常の明確さで:method、 のオプションとしてリストされていますがdefgeneric、それが何を意味するかは述べていません。

オプションはデフォルトを提示しますか:method、または少なくとも、最も一般的なユースケースが予想されるものを文書化しますか、または追加のセマンティクスがありますか? スタイル ポイントとして、メソッドを 1 つだけ定義すると予想される場合は、それをdefgenericフォームで定義する方が理にかなっていますか (実際にそれができる場合)、または で個別に定義する方が合理的defmethodですか? それとも、この場合ジェネリック関数を作成し、代わりに通常の関数を使用するのは意味がありませんdefunか?

0 投票する
1 に答える
86 参照

common-lisp - CLOS: シンボルをアクセサに変換

これは本当の初心者の質問だと思いますが、ここで答えを見つけることができませんでした。私の問題:クラスのスロットの値を次のように設定したいと思います:

私はこれのために小さな関数を書きました:

これを for ループで使用しています。このループでは、2 つのリスト (スロット (シンボルのリスト) と値 (数字のリスト)) を反復処理し、インスタンスの複数のスロットを値に設定したいと考えています。

私が得ているエラーは次のとおりです。

"フォーム ((setf スロット) #:|Store-Var-773597|#:g773598 の未定義の演算子 (setf スロット)。"

問題は、関数の setf が入力引数に指定された値を使用していないことだと思います。'slot' ですが、'slot' を演算子として読み取ります。

私はさまざまなこと、シンボル関数、ファンコールなどを試しましたが、何がうまくいかないのか本当に理解していないので、もう何をすべきかわかりません。

どんな助けでも大歓迎です。

ありがとう、マリーノエ