Merge pull request #6 from skwak22/master

This version of propeller has full CLJS functionality and compiles with shadow-cljs
This commit is contained in:
Lee Spector 2020-07-23 15:21:37 -04:00 committed by GitHub
commit db085080b3
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
14 changed files with 94 additions and 7 deletions

BIN
.DS_Store vendored Normal file

Binary file not shown.

View File

@ -15,6 +15,37 @@ example, `lein run :population-size 100`. You can use something
like `lein run | tee outfile` to send output both to the terminal
and to `outfile`.
## CLJS Usage
### Development
Run in development:
```bash
yarn
(mkdir -p target && cp assets/index.html target/)
yarn shadow-cljs watch app
```
`shadow-cljs` will be installed in `node_modules/` when you run `yarn`.
`:dev-http` specifies that `target/` will be served at http://localhost:8080 .
### REPL
After page is loaded, you may also start a REPL connected to browser with:
```bash
yarn shadow-cljs cljs-repl app
```
Once the REPL is loaded, load the core namespace with:
```
(ns propeller.core)
```
Calling `(-main)` will run the default genetic programming problem.
## Description
Propel is an implementation of the Push programming

11
assets/index.html Normal file
View File

@ -0,0 +1,11 @@
<!DOCTYPE html>
<html>
<head>
<title>propeller shadow-cljs</title>
<meta charset="UTF-8">
</head>
<body>
<div>See Console!</div>
<script src="main.js"></script>
</body>
</html>

View File

@ -1 +0,0 @@
{:deps {org.clojure/clojurescript {:mvn/version "1.10.758"}}}

21
package.json Normal file
View File

@ -0,0 +1,21 @@
{
"name": "propeller-cljs",
"version": "1.0.0",
"description": "",
"main": "index.js",
"scripts": {
"watch": "shadow-cljs watch app",
"compile": "shadow-cljs compile app",
"release": "shadow-cljs release app",
"html": "mkdir -p target && cp assets/index.html target/",
"serve": "yarn html && http-server target/",
"del": "rm -r target/*",
"build": "yarn release && yarn html && yarn serve"
},
"author": "",
"license": "EPL",
"devDependencies": {
"http-server": "^0.12.3",
"shadow-cljs": "^2.10.10"
}
}

7
shadow-cljs.edn Normal file
View File

@ -0,0 +1,7 @@
{:source-paths ["src"]
:dependencies []
:dev-http {8080 "target/"}
:builds {:app {:output-dir "target/"
:asset-path "."
:target :browser
:modules {:main {:init-fn propeller.main/main!}}}}}

BIN
src/.DS_Store vendored

Binary file not shown.

Binary file not shown.

8
src/propeller/main.cljs Normal file
View File

@ -0,0 +1,8 @@
(ns propeller.main
(:require [propeller.core :as propeller]))
(defn main! []
(println "Loading main..."))
(defn ^:dev/after-load reload! []
(propeller/-main))

View File

@ -4,7 +4,8 @@
[propeller.push.state :as state]
[propeller.push.utils.helpers :refer [get-stack-instructions]]
[propeller.utils :as utils]
[propeller.push.state :as state]))
[propeller.push.state :as state]
#?(:cljs [cljs.reader :refer [read-string]])))
;; =============================================================================
;; Tom Helmuth, thelmuth@cs.umass.edu
@ -82,7 +83,8 @@
inputs)
errors (map (fn [correct-output output]
(let [parsed-output (try (read-string output)
(catch Exception e 1))]
#?(:clj (catch Exception e 1000.0)
:cljs (catch js/Error. e 1000.0)))]
(if (= correct-output parsed-output) 0 1)))
correct-outputs
outputs)]

Binary file not shown.

View File

@ -19,7 +19,9 @@
[state instruction]
(if-let [input (instruction (:input state))]
(state/push-to-stack state :exec input)
(throw (Exception. (str "Undefined input instruction " instruction)))))
(throw #?(:clj (Exception. (str "Undefined input instruction " instruction))
:cljs (js/Error
(str "Undefined input instruction " instruction))))))
;; =============================================================================
;; OUTPUT Instructions

View File

@ -1,18 +1,24 @@
(ns propeller.tools.character)
(defn get-ascii
"Gets the ASCII code of a char"
[c]
#?(:clj (int c)
:cljs (.charCodeAt c 0)))
(defn is-letter
"Returns true if the given character is a letter, A-Z or a-z."
[c]
(<= (int \A) (int c) (int \z)))
(<= (get-ascii \A) (get-ascii c) (get-ascii \z)))
(defn is-digit
"Returns true if the given character is a digit, 0-9."
[c]
(<= (int \0) (int c) (int \9)))
(<= (get-ascii \0) (get-ascii c) (get-ascii \9)))
(defn is-whitespace
"Returns true if the given character is whitespace (newline, space, tab)."
[c]
(contains? #{(int \newline) (int \tab) (int \space)} (int c)))
(contains? #{(get-ascii \newline) (get-ascii \tab) (get-ascii \space)} (get-ascii c)))