問題タブ [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.
prototype - LispとSchemeに存在するPOOPフレームワーク
LispとSchemeにはどのような素晴らしいPOOP(プロトタイプベースのオブジェクト指向プログラミング)フレームワークがありますか?
私は1つ知っています:Sheeple
しかし、他に何かありますか?
common-lisp - Common Lisp Object System クラス定義の他のスロット値に基づいてスロットを初期化する
私のクラス定義では、あるスロットを別のスロットの値に基づいて初期化したいと考えています。これが私がやりたいことのようなものです:
ただし、これはコンパイルされません:
これを行う方法はありますか?
lisp - Lisp(CLOS)のスロットへのアクセスに関する問題
数字と1文字のリストを含む'element'スロットを持つNodeクラスがあります。次に例を示します。
'(1 2 3 b 4 5 6)
p>プログラムの一部は、「要素」スロットを取得し、文字を数字の1つと交換し、最後に、交換されたリストを「要素」スロットとして使用して新しいノードオブジェクトを作成することになっています。私はすでにリストとそのリストの2つのメンバーを受け取るスワップ関数を持っており、rotatef関数を使用してそれらをスワップします。
スワップ関数が機能していることをテストするために、一時変数に要素を格納し、文字「b」をリスト内の数値と交換する次のコードを作成しました。
p>問題は、ルートオブジェクトの「element」スロットがtempとともに交換されることです。不思議なことに、スワップ関数をリバースに変更しようとしましたが、2つは変更されません。
変数にスロットを割り当てる方法や、上記の発生を防ぐ方法があるかどうかはわかりません。
ありがとう。
oop - ClojureのCLOS?
Clojure 用のCLOS (Common Lisp Object System) のようなものはありますか?
lisp - CommonLispとGambitのライブラリアクセスとオブジェクトシステムの比較
私はGambitSchemeにかなり興味を持っています。特に、サポートされている幅広いプラットフォームと、必要に応じてCコードをSchemeソースに正しく配置できる機能に興味を持っています。とは言うものの、それはCommonLispと比較して「含まれるバッテリー」が少ないSchemeです。多くのことを最初からコーディングするのが好きな人もいますが(別名、激しいヤクの剃毛)、私は好きではありません!
これは、GambitとCommonLispのいくつかのフレーバーの両方を使用したことがある人々を対象とした私の2つの質問に私をもたらします:
1)効果的に図書館へのアクセスが良いのはどれですか?SchemeのライブラリはCommonLispよりも少ないです。ただし、GambitSchemeはC/ C ++コードとライブラリにスムーズにアクセスでき、CommonLispのライブラリをはるかに上回っています。あなたの意見では、GambitのFFIの滑らかさは、ネイティブライブラリの欠如を上回っていますか?
2)Schemeのオブジェクトシステム(TinyCLOS、Meroonなど)は、Common LispのCLOSとどのように比較されますか?それらが不足していることに気付いた場合、どの機能を最も見逃しましたか?最後に、そもそもLisp / Schemeのオブジェクトシステムはどれほど重要なのでしょうか?私は、Lispベースの企業全体(例えば、ITA Software)がCLOSを完全に放棄していると聞いたことがあります。Lisp / Schemeではオブジェクトは本当にオプションですか?Gambitに優れたオブジェクトシステムがない場合、それらを見逃す可能性があることを恐れています(私のプログラミングのバックグラウンドは純粋にオブジェクト指向です)。
C ++ / Pythonからの意欲的な変換を支援していただき、ありがとうございます。
-マット
PS:担当者が1500人を超える人、「ギャンビット」タグを作成していただけませんか。:) Jonasに感謝します!
oop - 他のクラスベースのOOシステムに対するCLOSの利点
Common Lisp Object System(CLOS)は、従来の(クラスベースの)オブジェクト指向システムよりも優れているという主張に出くわしました。CLOSのウィキペディアのエントリには、2つのアプローチの違いが記載されています。主に多重ディスパッチとCLOSのクラスとメソッドの分離です。これらはCLOSの単なる違いですか、それとも真の利点ですか?
lisp - lisp:スコープ内で一時的なメソッドの特殊化を作成する方法
Common lispの場合:スコープ内の既存の関数を再定義しますか?OPは似たようなものを求めました。しかし、関数ではなく、メソッドスペシャライザーを作成したいと思います。基本的に、メソッドが次のように定義されていると仮定します。
私がやりたいのは(擬似コード)です:
実際の用途は、特定のオブジェクトのスロット書き込みのオンデマンドインターセプトを本質的に作成するsetf slot-value-using-class
ことに特化した一時的な環境を作成したいということです。eql
(目的は、古いスロット値と新しいスロット値をどこかに記録してから、次のメソッドを呼び出すことです。)すでにインスタンス化された標準オブジェクトをインターセプトしたい場合があるため、メタクラスを作成したくありません。
もちろん試してみましたが、うまくいきませんでしたが(どうやってDEFMETHOD
?LABELS
)、経験豊富な人にそのような方法で実行できないことを確認したり、適切な方法を提案したりしたいと思いました。
コメント?
編集:
DanielとTerjeは、可能性に向けて私の知識を広げるための優れたリンクを提供しますが、そこに行く前に、よりバニラなアプローチを探すためにもう少しプッシュしたいと思います。私は、環境に入るときにadd-methodを実行することを検討してきました。これは、eqlに特化し、終了時にremove-methodを実行します。私はまだ終わっていません。誰かがそれらで遊んだことがあるなら、コメントはいいでしょう。スレッドを最新の状態に保ちます。
編集2:私はadd-methodシナリオでそれを行うのに近いですが、問題があります。これが私が試したことです:
オブジェクトスロットとデータを引数として(my-test)を呼び出すと、次のようになります。
だから私はここで立ち往生しています。適用可能なメソッドにeql-specialized:afterメソッドが含まれるようになったため、特殊化は機能しますが、残念ながら呼び出されないようです。誰かが助けてくれるので、私はそれを終えて、それを甘い小さなユーティリティマクロにリファクタリングすることができますか?
lisp - Lisp: initialize-instance :around メソッド内で作成されたインスタンスを取得するにはどうすればよいですか
最初に call-next-method を呼び出し、次に別のクラスの make-instance を呼び出して、作成された X のインスタンスを提供する、クラス X の initialize-instance の (:around 修飾された) スペシャライザーを作成したいと考えています。 initialize-instance :around メソッド内で作成されたインスタンスを取得しますか? (もちろん、call-next-method を呼び出した後で、:around の終了側にいると仮定します)
編集: クラス A は、互いの ID を保持するそれぞれのスロットを介してクラス B と双方向の関係を持っていますが、クラス A はクラス B の ID を必要としますが、反対は必要ありません。だから私が望むフローは次のとおりです。
- メイクインスタンス「classA
initialize-instance :around classA の内部では、次のようになります。
私。インスタンスのクラス B を作成し、id-of-B を取得します。
ii call-next-method id-of-B を追加
iii classB ポイントの対応する id-of-A スロットを、作成した classA インスタンスに設定します (これが私の最初の質問の理由です)
今、私は [i] in :before と [iii] in :after を行うことができましたが、できません: クラス A と B は象を介した永続クラスであり、多くのメソッドにまたがりたくないトランザクションでフロー全体をラップしたい. エレファントに精通している方のために説明すると、ensure-transaction ラッパーを使用したいと考えており、異なるポイントで明示的な begin および commit 関数呼び出しを使用したくありません。
lisp - sbclの奇妙なクラス優先順位リスト
sbclでは、
consがリストから継承し、その逆ではないのは不思議ではありませんか?ここで何が欠けていますか?
key - ハッシュテーブルのキーとして Common Lisp CLOS オブジェクトを使用しますか?
Common Lisp CLOS オブジェクトをハッシュテーブルのキーとして使用したいと考えています。私はそれが次のように簡単だと思った:
Common Lisp Hyperspec を調べてみると、等価性をテストするために eq、eql、equal、または equalp しか使用できないようです。
これを行う方法はありますか?それとも、これは本当にばかげたことであり、それが標準で許可されていない理由ですか?