評価することを可能にします。ファイルの先頭に追加しましょう。より評価することができます。次にdefuiマクロを使ってボタンを定義しましょう。%))このコード断片は明白ですね。work"/>をクリックイベントのハンドラと共に生成します。e))の簡易表現です。ここでobject/raiseはターゲットとなるオブジェクトに対してクリックイベントを発生させます。名前から想像するかもしれませんが、例外を発生させるわけではありません。次にワーカーオブジェクトを定義しましょう。this)))これはクリックした際にハードな処理を行うワーカーです。ここで着目する点はinit関数で返される値です。init関数で返された値はオブジェクトがタブに置かれる際に使用されます。今回のケースでは、作成したオブジェクトを持ったボタンが返されています。残りは振る舞いの設定です。素晴らしいライブラリnotifosを利用し、進捗を表す動く四角形を表示します。記載したのと同じ名前にする必要があります。振る舞いは:reaction関数を引数として渡されたオブジェクトと共に呼び出す際の引き金となる:triggersを持っています。今回は振る舞いは、ただ単に作業の進捗を示し、10秒後にそれを隠すだけとなります。これで、オブジェクトを作成してそれをタブに追加する準備が整いました。worker))コンテンツを含んだ新しいタブが出現するでしょう。そこにあるボタンをクリックすると小さいプログレスバーがページ下部に表示され、10秒後に自動的に消えると思います。勘の良い人なら既に気づいているかも知れませんがタブを閉じることができません。この原因は、タブを閉じるためのデフォルトとなる振る舞いが存在しないことに付随します。いくつかのタブは閉じる際、ユーザーに保存を促したいかもしれないし、また他のタブは全く違った実装にしたい場合があるのでこのようになっています。リスタートせずに追加することができます。リストに追加することによって、この振る舞いの利用を知らせる必要があります。this)))何かを再起動する必要はありません。振る舞いとオブジェクトの定義を評価するだけでタブを閉じることができるでしょう。画像を貼っておきます。できることを示したちょっとした紹介でした。システム全体が如何にダイナミックかってことについて、あなたに考える機会を与えられたのではと思います。勉強のために自分で書いてみたいコードを探していたところ、以下の記事を発見。書き直してみることにしました。作るものボイド(Boids)という人工生命シュミレーションプログラムを作ります。詳しくは元記事を参考にしてください。完成品はこんな感じとなります。対応のブラウザでないとデモは表示されません。Clojure(ClojureScriptを含む)のプロジェクトを便利に管理するためのツール。コンパイルを自動で行える。何かを作るならこの二つはデファクトなんで何も考えずに利用しましょう。コマンドでプロジェクトのひな形を作成します。:advanced}}]}):dependenciesにclojurescriptを追加。:pluginsにlein-cljsbuildを追加。:cljsbuildを追加。source-pathsにソースコード(main.cljs)を置くsrc/cljsを指定。compileにmain.cljsをコンパイルしてできたjsファイルの出力先(output-to)として、resources/public/js/main.jsを追加。compileに最適化オプション(optimizations)として、advancedを指定。コンパイルオプションちょっとだけ補足しておきますが、ボイドのプログラム作成には関係ないので読まなくても良いです。trueを指定しています。このオプション指定だとコンパイル後に出力されるmain.jsのコードが読める形で出力されます。:advancedオプションだと、強力な最適化を行って、コードサイズや実行にかかる時間を少なくしてくれますが、出力されたコードは読めません(頑張れば読めるのかも...)。ちなみに、以下のようなことをしてくれているみたいです。変数や関数の名前を短いものにリネームする(mungingと呼ばれる)。オブジェクトのネストを平板化する。未使用のコードを消去する。インライン関数を作成する。JavaScriptランタイムの特性に沿ってパフォーマンスを最適化する。ペーパーバックこの商品を含むブログを見る:advancedでコンパイルする際、いくつかの前提を元にコードを処理するため、処理対象のソースコードがこの前提に沿っていないと出力されたコードが期待する動作とならない場合もあることを頭に入れておきましょう。開発の途中途中、たまに:advancedでコンパイル&実行して動作確認しておくのが良いと思います。プログラム完成後、:advancedでコンパイル&実行、動かない...とならないように気をつけましょう(自戒を込めて...)。元記事のindex.htmlをそのまま、resources/public/index.htmlにコピーでおしまい。作成コード全体は、こちらで確認してください。気になる部分だけ解説しておきます。i)))))(make-boids)boidsはarrayとjs-objで表現します。はじめ、VectorとMapで表現してプログラムを作ったんですが、元のJavaScriptのコードと比較してあまりにも遅かったため書き直しました。(StackOverflowで質問したらarrayを使えと)arrayのデータへの取得、更新にはaget,asetをそれぞれ利用します。init)set!を使い、window.onloadにinit関数を設定します。"debugger;")js*を利用してJavaScriptのコードを直接埋め込むことができます。完成したプログラムには記載していませんが、デバッグ時に上記のコードを活用していました。name")こちらも完成したプログラムに記載していませんが、処理時間を計測するために上記コードを活用していました。プログラムを書くのに慣れていないので思ったより時間がかかりました。表現して作成するまでは良かったんですが、実行速度に問題があることに気づき、処理時間を計測したり、boidsの表現をarrayに変えたり、完成して:advancedでコンパイルしたら動かなかったりなんなりで時間を浪費しました。最終的に完成したコードを見て思ったのは、「JavaScriptで書けばいいんじゃないかと?」、これは自分のClojureScriptのスキルが足りないのが原因な気もします。書いたほうが良いのかなと思いました。触っていない間に0.6.0(最新は0.6.2)になり、オープンソース、プラグイン対応となりました。sourcegithub自分でも試しにプラグインを作成してみたので、簡単に手順を説明しておきます。プラグインユーザーの入力を勝手に志々雄真実(るろうに剣心)の名言に変換するお遊びプラグインです。ソースコード仕様ユーザー入力を登録してある志々雄の名言に変換する。新しい行に移動したら、ランダムで使用する名言を変更する。プラグインはコマンドでON,OFFする。ディレクトリで下記のコマンドを実行しプラグインのひな形を作成します。%APPDATALOCAL%/LightTable/plugins/作成されるディレクトリ構成は以下のようになります。記述shishio-sayings/src/lt/plugins/shishio_sayings.cljsにプラグインで使用するコードを記述します。ひな型作成時に出力されたコードは利用しないので一旦全て削除してからコードを書きます。notifos]))lt.plugins.shishio-sayingsで使用するライブラリを定義。["所詮この世は弱肉強食。"「君」ぐらいつけろよ。"弱者は強者の糧(かて)となるべき。名言は志々雄真実_botからピックアップ。sayings)))現在の変換先対象となる名言を保持する変数。sayings)))変換先対象となる名言を変更する関数。user-say)))現在の名言からユーザ入力の文字数と同等の長さの名言を切り出す関数。ON"))))})名言への変換機能のON,OFFを切り替えるtoggle-shishio-sayingsコマンドを定義。定義したコマンドは、View->Commandsで開くコマンドバーから実行することができます。shishio-sayings-behind-cursor})変換機能がONであれば、変換処理を行うshishio-sayings-behind-cursorコマンドを定義。このコマンドは、キー入力があった際に呼び出したいのでコマンドバーから実行するのではなくbehaviorsファイルに設定を記述します。trueを設定するとコマンドバーにコマンドが表示されなくなります。:shishio-sayings-behind-cursor)]}}on-chnageに対応するコマンドとしてshisio-sayings-behaidn-cursorを登録。LightTableを終了し、起動し直します。shishio_sayings.compiled.jsがあれば、起動時に勝手にプラグインがロードされ、コマンドバーにshishioと入力すると定義したコマンドが表示されると思います。この状態で何かファイルを開きキー入力すると志々雄の名言に勝手に変化されます。sayingsを実行するとOFFにすることができます。終わりに公式ドキュメントも含め、まだプラグイン作成に関する情報はあまり出回ってないみたいです。現状は他の方が作成したプラグインのソースを眺めて学習するのが良いと思います。行きソースを眺めるのが良さそうです。2.4.3)SICPこの節では、プログラムの内部実装が、異なる方法で表現されている可能性があるデータにどう対処するかを勉強する。プログラミングについても述べる。汎用演算を使うプログラムとして、複素数の算術演算を実行するシステムの開発を考える。複素数は2つの表現を持つことができる。どちらの複素数表現を利用しても問題なく動作する。)の決定を伸ばすことができれば、システム設計の柔軟性を最大に保つことができる。最終的に両方の表現を使うと決定することもできる。tag)をつけることで、両方の表現を1つのシステムに組み込むことが可能となる。'polar))を書くことができる。タグを調べ、その型のデータを扱う手続きを呼ぶ手続きとして実装することができる。極座標表現を扱うプログラムに渡す。データオブジェクトをレベルからレベルへ渡すとき、タグをつけ剥がしすることは重要な組織化戦略となる。システム設計で部品化を実現する強力な戦略となる。異なる表現のすべてを知らなければならないそれぞれの表現はシステム全体でどの二つの手続きも同じ名前を持たない保証をしなければならない汎用インターフェースの実装が加法的(additive)ではない。システム設計を更に部品化する手段が必要。programming)というプログラム技法が役に立つ。データ主導プログラミングは、一方の軸に演算、他方の軸に型をとった二次元の表を扱っているとみなすことができる。angle-rectangular表の項目は各引数の型に対し、各演算が実装する手続きを表す。それを引数の内容に作用させる単一の手続きとしてインターフェースを実装する。することにより、新しい表現を追加する際、既存の手続きを変更する必要はなく、表に新しい項目を追加するだけとなる。汎用インタフェースの実装が加法的となる。GitHubに解答を追加。2.3.4)SICPこの節では、データとして任意の記号に対して作業する能力を採用し、言語の表現力を拡大する。クォート記号を操作するために、データオブジェクトをクォートする(quote)能力が必要である。それぞれ評価し、値のリストを作成してしまう。2)リストや記号を評価される式としてではなく、データオブジェクトとして扱うことを示すのにクォートを使用する。GitHubに解答を追加。データ抽象の実例として記号微分を実行する手続きの設計を考える。b)と変数(x)を引数としてとり、代数式を変数で微分した結果(2a)を返す手続きとして実装する。抽象データによる微分プログラム対象の問題を簡単にするため、2つの引数を持った加算と乗算の演算だけからなる式を扱うこととする。抽象データを使って表されている。代数式の表現をどう選ぶか?に無関係に微分を行うことができる。上記したように代数式の表現は自由に決めることができる。b)と表現することができる。同様、前置記法で代数式を表現することを考える。b)と表現することになる。GitHubに解答を追加。集合に使われる演算を規定することで「集合」を定義する。2つの集合の積集合データ抽象的に、これらの演算を実装する表現は自由に選択することができる。表現の選択は、そのデータを使用するプログラムの効率に大きく影響する。GitHubに解答を追加。符号化木を例として練習する。property)の重要さについて話す。要素が"対"であるような"対"を作る能力は、リスト構造にとって重要。閉包は階層的(hierarchical)構造を作ることができる。対を使って並び(sequence)を表現することができる。nil))))で表現することができる。