├── .gitignore
├── README.md
├── index.html
├── index_release.html
├── project.clj
├── scripts
├── brepl
├── brepl.bat
├── brepl.clj
├── build
├── build.bat
├── build.clj
├── release
├── release.bat
├── release.clj
├── repl
├── repl.bat
├── repl.clj
├── watch
├── watch.bat
└── watch.clj
└── src
└── clgs
└── core.cljs
/.gitignore:
--------------------------------------------------------------------------------
1 | pom.xml
2 | *jar
3 | /lib/
4 | /classes/
5 | /out/
6 | /release/
7 | /target/
8 | .lein-deps-sum
9 | .lein-repl-history
10 | .lein-plugins/
11 | .repl*
12 |
--------------------------------------------------------------------------------
/README.md:
--------------------------------------------------------------------------------
1 | # clgs
2 |
3 | Run a Clojurescript repl on top of [Google Apps Scripts](https://developers.google.com/apps-script/) servers.
4 |
5 | ## Overview
6 |
7 | Currently, expressions like `(take 4 (range 10))` work correctly. However, `def`'ing functions does not yet work. Any advice would be appreciated.
8 |
9 | ## Setup
10 |
11 | Clean project specific out:
12 |
13 | lein clean
14 |
15 | Build a single release artifact with the following script.
16 |
17 | ./scripts/release
18 |
19 | In [this](https://script.google.com/d/1vUqjhUd21PD84gXqgOUy9tpx-kpvLRn2kZh-2y9DpwTrf-JTwh2F0xp1/edit?usp=drive_web&folder=0ALH6Pc2iSIKdUk9PVA&splash=yes) Apps Script project, go to the menu item 'File' and then "Make a Copy".
20 |
21 | Delete the contents of the cljs.js tab of the new App Script project.
22 |
23 | Then copy the contents of ./release/clgs.js to the cljs.gs tab.
24 |
25 | Go to the menu item "Run" and run your functions.
26 |
27 | You can view the logs by clicking the menu item "View" and then "Logs".
28 |
29 | As you can see, some things work and some things don't.
30 |
31 | Let me know if you figure out how to fix any of the functionality!
32 |
33 | ## License
34 |
35 | Copyright © 2016 John Newman
36 |
37 | Distributed under the Eclipse Public License either version 1.0 or (at your option) any later version.
38 |
--------------------------------------------------------------------------------
/index.html:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 | clgs
5 |
6 |
7 |
8 |
9 |
10 |
11 |
--------------------------------------------------------------------------------
/index_release.html:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 | clgs
5 |
6 |
7 |
8 |
9 |
10 |
11 |
--------------------------------------------------------------------------------
/project.clj:
--------------------------------------------------------------------------------
1 | (defproject clgs "0.1.0-SNAPSHOT"
2 | :description "CLJS on Google Apps Script"
3 | :url "http://example.com/FIXME"
4 | :dependencies [[org.clojure/clojure "1.8.0"]
5 | [org.clojure/clojurescript "1.9.89"]
6 | ]
7 | :jvm-opts ^:replace ["-Xmx1g" "-server"]
8 | :plugins [[lein-npm "0.6.1"]]
9 | :npm {:dependencies [[source-map-support "0.4.0"]]}
10 | :source-paths ["src" "target/classes"]
11 | :clean-targets ["out" "release"]
12 | :target-path "target")
13 |
--------------------------------------------------------------------------------
/scripts/brepl:
--------------------------------------------------------------------------------
1 | #!/bin/sh
2 | rlwrap lein trampoline run -m clojure.main scripts/brepl.clj
3 |
--------------------------------------------------------------------------------
/scripts/brepl.bat:
--------------------------------------------------------------------------------
1 | @echo off
2 | lein trampoline run -m clojure.main scripts\brepl.clj
3 |
--------------------------------------------------------------------------------
/scripts/brepl.clj:
--------------------------------------------------------------------------------
1 | (require
2 | '[cljs.build.api :as b]
3 | '[cljs.repl :as repl]
4 | '[cljs.repl.browser :as browser])
5 |
6 | (b/build "src"
7 | {:main 'clgs.core
8 | :output-to "out/clgs.js"
9 | :output-dir "out"
10 | :verbose true})
11 |
12 | (repl/repl (browser/repl-env)
13 | :output-dir "out")
14 |
--------------------------------------------------------------------------------
/scripts/build:
--------------------------------------------------------------------------------
1 | #!/bin/sh
2 | rlwrap lein trampoline run -m clojure.main scripts/build.clj
3 |
--------------------------------------------------------------------------------
/scripts/build.bat:
--------------------------------------------------------------------------------
1 | @echo off
2 | lein trampoline run -m clojure.main scripts\build.clj
3 |
--------------------------------------------------------------------------------
/scripts/build.clj:
--------------------------------------------------------------------------------
1 | (require '[cljs.build.api :as b])
2 |
3 | (println "Building ...")
4 |
5 | (let [start (System/nanoTime)]
6 | (b/build "src"
7 | {:main 'clgs.core
8 | :output-to "out/clgs.js"
9 | :output-dir "out"
10 | :verbose true})
11 | (println "... done. Elapsed" (/ (- (System/nanoTime) start) 1e9) "seconds"))
12 |
13 |
14 |
--------------------------------------------------------------------------------
/scripts/release:
--------------------------------------------------------------------------------
1 | #!/bin/sh
2 | rlwrap lein trampoline run -m clojure.main scripts/release.clj
3 |
--------------------------------------------------------------------------------
/scripts/release.bat:
--------------------------------------------------------------------------------
1 | @echo off
2 | lein trampoline run -m clojure.main scripts\release.clj
3 |
--------------------------------------------------------------------------------
/scripts/release.clj:
--------------------------------------------------------------------------------
1 | (require '[cljs.build.api :as b])
2 |
3 | (println "Building ...")
4 |
5 | (let [start (System/nanoTime)]
6 | (b/build "src"
7 | {:output-to "release/clgs.js"
8 | :output-dir "release"
9 | :optimizations :simple
10 | :verbose true
11 | :pretty-print false
12 | :optimize-constants true
13 | ;:static-fns true
14 | })
15 | (println "... done. Elapsed" (/ (- (System/nanoTime) start) 1e9) "seconds"))
16 |
--------------------------------------------------------------------------------
/scripts/repl:
--------------------------------------------------------------------------------
1 | #!/bin/sh
2 | rlwrap lein trampoline run -m clojure.main scripts/repl.clj
3 |
--------------------------------------------------------------------------------
/scripts/repl.bat:
--------------------------------------------------------------------------------
1 | @echo off
2 | lein trampoline run -m clojure.main scripts\repl.clj
3 |
--------------------------------------------------------------------------------
/scripts/repl.clj:
--------------------------------------------------------------------------------
1 | (require
2 | '[cljs.repl :as repl]
3 | '[cljs.repl.node :as node])
4 |
5 | (repl/repl (node/repl-env))
6 |
--------------------------------------------------------------------------------
/scripts/watch:
--------------------------------------------------------------------------------
1 | #!/bin/sh
2 | rlwrap lein trampoline run -m clojure.main scripts/watch.clj
3 |
--------------------------------------------------------------------------------
/scripts/watch.bat:
--------------------------------------------------------------------------------
1 | @echo off
2 | lein trampoline run -m clojure.main scripts\watch.clj
3 |
--------------------------------------------------------------------------------
/scripts/watch.clj:
--------------------------------------------------------------------------------
1 | (require '[cljs.build.api :as b])
2 |
3 | (b/watch "src"
4 | {:main 'clgs.core
5 | :output-to "out/clgs.js"
6 | :output-dir "out"})
7 |
--------------------------------------------------------------------------------
/src/clgs/core.cljs:
--------------------------------------------------------------------------------
1 | (ns clgs.core
2 | (:require [cljs.tools.reader :refer [read-string]]
3 | [cljs.js :refer [empty-state eval js-eval]]))
4 |
5 | (def st (cljs.js/empty-state))
6 |
7 | ;(set! *print-fn* (fn [& args] (.log js/Logger (str args))))
8 | ;(set! *print-err-fn* (fn [& args] (.log js/Logger (js-eval args))))
9 |
10 | (defn ^:export evalCljs [s]
11 | (.log js/Logger (str "cljs in: " s))
12 | (eval st
13 | (read-string s)
14 | {:eval js-eval
15 | ;:ns 'x.core
16 | ;:source-map true
17 | :context :expr
18 | }
19 | (fn [result]
20 | (.log js/Logger (str "cljs out: " result))
21 | (:value result))))
22 |
23 | (defn ^:export evalCljsAndArgs [s v]
24 | (.log js/Logger (str "cljs in: " s))
25 | (eval st
26 | (read-string (str "(" s " " v ")\n"))
27 | {:eval js-eval
28 | :ns 'x.core
29 | :source-map true
30 | :context :expr}
31 | (fn [result]
32 | (.log js/Logger (str "cljs out: " result))
33 | (:value result))))
34 |
--------------------------------------------------------------------------------