Clojure + ClojureScript 動かしてみたのでメモ その2

日記「Clojure + ClojureScript 動かしてみたのでメモ - oknknicの日記」のコードを、
下記チュートリアルを参考に、shoreleave-remote-ring を利用(defremoteおよびremote-callback)して書き換えてみたのでメモ。

追加構成

  • shoreleave-remote-ring :Ring/Compojure を well‐behaved にする Clojure ライブラリ。shoreleave-remote を内部で利用する
  • shoreleave-remote :様々なリモートコールオペレーションを実装した ClojureScript ライブラリ

実装

project.clj
  • :dependencies への追加
[shoreleave/shoreleave-remote-ring "0.3.0"]
[shoreleave/shoreleave-remote "0.3.0"]
  • :dependencies の変更(バージョン)
[org.clojure/clojure "1.5.1"]
[org.clojure/clojurescript "0.0-1586"]
[domina "1.0.2-SNAPSHOT"]
[compojure "1.1.5"]
  • :plugins への追加
[lein-ring "0.6.3"]
  • :ring の追加
:ring {:handler client-server.server/app}
server.clj
(ns client-server.server
  (:require [compojure.core :refer [defroutes GET]]
            [compojure.route :refer [resources not-found]]
            [compojure.handler :refer [site]]
            [ring.util.response :refer [resource-response]]
            [shoreleave.middleware.rpc :refer [defremote wrap-rpc]]))

(defroutes app-routes
  (GET "/" request
    (resource-response "public/index.html"))
  (resources "/")
  (not-found "Page non found"))

(def handler
  (site	 app-routes))

(def app (-> (var handler)
             (wrap-rpc)
             (site)))

(defremote eval-clojure [expr]
  (-> (try
        (eval expr)
        (catch Throwable t
          (str "ERROR: " t)))))
client.cljs
(ns client-server.client
  (:require [domina :as dom]
            [domina.events :as ev]
            [shoreleave.remotes.http-rpc :refer [remote-callback]]
            [cljs.reader :refer [read-string]]))

(defn ^:export main []
  (ev/listen! (dom/by-id "eval-button")
                  :click
                  (fn [event]
                    (let [expr (read-string (dom/value (dom/by-id "eval-expr")))]
                      (remote-callback :eval-clojure ; ★サーバサイドでdefremoteした名前を直接指定★
                        [expr]
                        #(dom/set-text! (dom/by-id "eval-result") %))))))

ビルド

lein cljsbuild clean
lein cljsbuild once

実行

lein ring server-headless