Getting Started Programming Light Tableのほぼ要約+αです。
↑ではLight TableのBOT(Behavior,Object,Tag)アーキテクチャでのObject, Behaviorの基本的な定義の仕方が書かれています。
まずは、Light Tableで適当なnsを作ってClojureScriptのSyntax設定下で実行して、Light Table UI
にconnectします。
(ns sample.core
(:require [lt.object :as o])
(:require-macros [lt.macros :as m]))
ClojureScriptでは、マクロはClojureで実行するので:require-macros
を使って取り込みます。
Objectの定義
object*
でオブジェクトのテンプレートが作れます。OOPでのClassのようなものでしょうか。
(o/object* ::my-template-name
:tags [:my-tag-name]
:some-nebulous-state [],
:other-state-like-thing {})
:tags
も含めて:tags
以降は好きなものを指定できます。
lt.object
の中を見ると(apply hash-map r)
が適用されるようです。
(defn make-object* [name & r]
(let [obj (merge {:behaviors #{} :tags #{} :triggers [] :listeners {} ::type name :children {}}
(apply hash-map r))]
obj))
(defn object* [name & r]
(-> (apply make-object* name r)
(store-object*)
(handle-redef)))
->def
を使うと定義が参照できます。
create
でオブジェクトが作成されます。
instances-by-type
で指定したtypeのインスタンス一覧が取得できます。
by-id
やby-tag
でもインスタンスを取得できます。
Behaviorの定義
behavior
マクロでBehaviorの定義ができます。
(m/behavior ::my-behavior-name
:triggers #{:my-trigger-name}
:reaction (fn [self & rest]
(prn (str "self:" self " and: " rest))))
同じように->behavior
で定義が参照できます。
add-behavior!
で、ObjectにBehaviorを追加できます。ただし、他によい方法があります。(下で説明)
raise
で、Objectにトリガーを与えるとそのトリガーに紐づいたBehaviorの:reactionが実行されます。
(o/add-behavior!
(first (o/by-tag :my-tag-name))
[::my-behavior-name])
(o/raise (first (o/by-tag :my-tag-name))
:my-trigger-name)
(o/raise (first (o/by-tag :my-tag-name))
:my-trigger-name :a "b")
Behavior紐付けの実際
add-behavior!
を使うと、Light Table自身がBehaviorsのリロードをしたときに問題があるので、実際にはUser Behavior設定かプラグイン内での.behaviorsファイルでTagとBehaviorの関連を設定します。
{:+ {:my-tag-name [:sample.core/my-behavior-name]}}
{:+ {:my-tag-name [(:sample.core/my-behavior-name "xyzzy" "thud"]}}
まとめ
このように、tag→object→trigger→behavior→stateのようなアクセスのチェーンを定義する仕組みによって、柔軟なプラグイン構造を実現しているようです。