├── .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 | --------------------------------------------------------------------------------