LoginSignup
6
6

More than 5 years have passed since last update.

LightTable"を"プログラミングする初歩

Posted at

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)が適用されるようです。

lt.object抜粋1
(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を使うと定義が参照できます。

WS000002.JPG

createでオブジェクトが作成されます。

WS000003.JPG

instances-by-typeで指定したtypeのインスタンス一覧が取得できます。

WS000004.JPG

by-idby-tagでもインスタンスを取得できます。

WS000005.JPG

Behaviorの定義

behaviorマクロでBehaviorの定義ができます。

(m/behavior ::my-behavior-name
            :triggers #{:my-trigger-name}
            :reaction (fn [self & rest]
                        (prn (str "self:" self " and: " rest))))

同じように->behaviorで定義が参照できます。

WS000006.JPG

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")

WS000007.JPG

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のようなアクセスのチェーンを定義する仕組みによって、柔軟なプラグイン構造を実現しているようです。

6
6
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
6
6