せっかくだから新しいものに手を出していこうと思い、いろいろと挑戦しています。
使っている言語、ライブラリは
- Scala
- Unfiltered
- Scalate
- Jade
- CoffeeScript
- SASS
- JavaFX
- ClojureScript
- Closure Library
- Jython
- Pygments
便利なライブラリに驚きつつも、覚えなければいけないことが多くてなかなか大変です。
この中でも特に嵌ったものがClojureScript(Closure Library)。
情報が少ないので調べるのにも結構苦労します。
ClojureScript自体はとてもいいものなので、普及のため/覚え書きに基本的なことを書いていきます。
ClojureScript
ClojureScriptはGoogle Closure Libraryに依存しています!(重要)なので、ClojureとClosure Libraryの両方を使えるようにならなければなりません!
学習コスト高いですね。しかし、言語的に強力なClojureと強大なライブラリ群のClosure Libraryが合わさっているので最強の環境だと思うのですよ!
なので皆さん是非使って私に教えて下さい。
開発環境
ClojureのデファクトなビルドツールとしてLeiningenがあります。
そして、ClojureScriptをビルドするpluginとしてlein-cljsbuildが存在します。
これなしには開発できないレベルで便利です。
lein cljsbuild auto
とやっておくだけで信じられない速度でcompileしてくれます。是非使いましょう。
emacsを使っている人は、clojurescript-modeというものもあるので入れておくと便利だと思います。
cljs
では、実際のコードをみてポイントを書いていきたいと思います。
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
(ns onedit | |
(:require [goog.dom :as dom] | |
[goog.events :as events] | |
[goog.debug.Logger :as logger] | |
[goog.debug.Console :as console])) | |
(def logger (logger/getLogger "onedit")) | |
(console/autoInstall) | |
(def reader | |
(let [reader (goog.global.FileReader.)] | |
(set! reader.onload (fn [e] | |
(.info logger e.target.result) | |
(dom/setTextContent (dom/getElement "buffer") e.target.result))) | |
reader)) | |
(defn load [file] | |
(.readAsText reader file)) | |
(events/listen (dom/getElement "open") goog.events.EventType.CLICK #(.click (dom/getElement "file"))) | |
(events/listen (dom/getElement "file") goog.events.EventType.CHANGE (fn [e] (load (aget e.target.files 0)))) |
ns
nsはClosure Libraryのprovideの役割を果たします。
(ns hoge)で定義された(def geso)は外部からhoge.gesoでアクセス出来ます。
:require
嵌ります。
:asが必須です。
あとUpperCamelだからといってクラス名と勘違いしないで下さい。
あくまでこれはClojureScriptなのです。
このrequireはClosure Libraryのrequireです。
注意して下さい。
:asで付けたaliasはstatic methodチックに呼び出せます。
参照
Clojureでは書き換え可能な参照を作るのにrefやatomを使いますが、これはJavaScriptなのでそんなことをせずにset!で直接varを書き換えることができます。
あとrefを使ってもSTMが使えるわけではないです。
goog.global
windowやdocumentなどのオブジェクトにアクセスしたい時はgoog.globalを使いましょう。
JavaScript Objectのインスタンスを作りたい時もこれを使うことになると思います。
※追記
goog.globalを使わなくてもjs/Stringのようにglobal objectを参照できました。
総括
とりあえずこんなところかな?
もっとたくさん苦労したところがあった気がする・・・・・
まあ、随時記事を書いていこうと思います。
私はClojure自体は慣れていたのですが、JavaScriptは初心者レベルだしClosure Libraryは触ったことがないしでとても大変でした。
ClojureScriptを書くとしてもJavaScriptがゆるふわなところには振り回されると思うので覚悟しておいて下さい。
0 件のコメント:
コメントを投稿