(rontolisp) docs
← 関数

objc:define-class

(objc:define-class "Name" "Superclass" methods &optional protocols)

メソッドが Lisp 関数であるクラスを登録します。methods("selector:" function) のペアのリストで、各関数は最初に receiver、続いてメソッド自身の引数を受け取ります。メソッドの型はスーパークラスがそのセレクタを宣言していればそこから、そうでなければ採用したプロトコル (protocols、名前のリスト) から取られ、どちらにもなければ target/action の形 (結果なし、コロンごとに 1 つのオブジェクト引数) がデフォルトです。再定義するとメソッドが束縛し直されます。クラスを返します。macOS 専用の objc パッケージの一部です。java -jar のインタプリタ、rontolisp ネイティブバイナリ、コンパイル済み .class / .jar で動作し、.wasm では使えません。ランタイムのないマシンでは error をシグナルします。macOS GUI ガイドを参照してください。

CL-USER> (defvar *cls*
    (objc:define-class "MyTarget" "NSObject"
      (list (list "invoke:" (lambda (self sender) (print sender) nil)))))
CL-USER> (defvar *target* (objc:send (objc:send *cls* "alloc") "init"))
CL-USER> (objc:send button "setTarget:" *target*)
CL-USER> (objc:send button "setAction:" "invoke:")

コールバックの形は閉じた集合です (引数なし、オブジェクト引数 1 つまたは 2 つ、オブジェクト引数 1 つで BOOL・オブジェクト・整数を返す)。コールバック内のエラーはシグナルされず表示されます。