Keep working, cljs repl :(((((
This commit is contained in:
parent
7ec258ee24
commit
a23e3bfdc5
8
assets/index.html
Normal file
8
assets/index.html
Normal file
|
@ -0,0 +1,8 @@
|
|||
<html>
|
||||
<head>
|
||||
<title>Hello, world!</title>
|
||||
</head>
|
||||
<body>
|
||||
<script src="main.js"></script>
|
||||
</body>
|
||||
</html>
|
12
deps.edn
12
deps.edn
|
@ -1,11 +1,13 @@
|
|||
{
|
||||
:deps {org.clojure/clojurescript {:mvn/version "1.11.121"}}
|
||||
{:deps
|
||||
{org.clojure/clojurescript {:mvn/version "1.11.121"}
|
||||
thheller/shadow-cljs {:mvn/version "2.26.0"}}
|
||||
|
||||
:aliases
|
||||
{:repl
|
||||
{:main
|
||||
{:exec-fn ludus.core/main!}
|
||||
:repl
|
||||
{:exec-fn clojure.core.server/start-server
|
||||
:exec-args {:name "repl"
|
||||
:port 5555
|
||||
:accept clojure.core.server/repl
|
||||
:server-daemon false}}}
|
||||
}
|
||||
:server-daemon false}}}}
|
1138
package-lock.json
generated
Normal file
1138
package-lock.json
generated
Normal file
File diff suppressed because it is too large
Load Diff
19
package.json
Normal file
19
package.json
Normal file
|
@ -0,0 +1,19 @@
|
|||
{
|
||||
"name": "ludus",
|
||||
"version": "1.0.0",
|
||||
"description": "![Ludus logo](logo.png) ## Ludus: A friendly, dynamic, functional language",
|
||||
"main": "index.js",
|
||||
"directories": {
|
||||
"doc": "doc",
|
||||
"test": "test"
|
||||
},
|
||||
"scripts": {
|
||||
"test": "echo \"Error: no test specified\" && exit 1"
|
||||
},
|
||||
"keywords": [],
|
||||
"author": "",
|
||||
"license": "ISC",
|
||||
"devDependencies": {
|
||||
"shadow-cljs": "^2.26.0"
|
||||
}
|
||||
}
|
|
@ -1,11 +1,12 @@
|
|||
(defproject ludus "0.1.0-SNAPSHOT"
|
||||
:description "FIXME: write description"
|
||||
:url "http://example.com/FIXME"
|
||||
:url "http://ludus.dev"
|
||||
:license {:name "EPL-2.0 OR GPL-2.0-or-later WITH Classpath-exception-2.0"
|
||||
:url "https://www.eclipse.org/legal/epl-2.0/"}
|
||||
:dependencies [[org.clojure/clojure "1.11.1"]
|
||||
[babashka/fs "0.1.6"]
|
||||
[quil "4.0.0-SNAPSHOT"]]
|
||||
;[babashka/fs "0.1.6"]
|
||||
;[quil "4.0.0-SNAPSHOT"]
|
||||
]
|
||||
:plugins [[lein-cljfmt "0.8.0"]]
|
||||
:repl-options {:init-ns ludus.core}
|
||||
:main ludus.core
|
||||
|
|
13
shadow-cljs.edn
Normal file
13
shadow-cljs.edn
Normal file
|
@ -0,0 +1,13 @@
|
|||
;; shadow-cljs configuration
|
||||
{:deps true
|
||||
|
||||
:builds
|
||||
{:node {:target :node-library
|
||||
:output-to "target/js/ludus.js"
|
||||
:exports-fn ludus.core/run
|
||||
:asset-path "/js"
|
||||
:modules {:main {:entries [ludus.core]}}}
|
||||
:browser {:target :browser
|
||||
:output-dir "target/js"
|
||||
:asset-path "/assets"
|
||||
:modules {:main {:entries [ludus.core]}}}}}
|
|
@ -5,21 +5,19 @@
|
|||
[ludus.grammar :as grammar]
|
||||
[ludus.interpreter :as interpreter]
|
||||
[ludus.show :as show]
|
||||
[clojure.pprint :as pp]
|
||||
))
|
||||
|
||||
(println "Hi, there.")
|
||||
|
||||
(defn run [source]
|
||||
(println (str "Running some ludus source: " source))
|
||||
(let [scanned (scanner/scan source)]
|
||||
(if (not-empty (:errors scanned))
|
||||
(do
|
||||
(println "I found some scanning errors!")
|
||||
(pp/pprint (:errors scanned))
|
||||
nil
|
||||
(println (:errors scanned))
|
||||
)
|
||||
(let [parsed (parser/apply-parser grammar/script (:tokens scanned))]
|
||||
(println "Scanned: ")
|
||||
(println scanned)
|
||||
(if (parser/fail? parsed)
|
||||
(do
|
||||
(println "I found some parsing errors!")
|
||||
|
@ -28,12 +26,21 @@
|
|||
)
|
||||
(let [interpreted (interpreter/interpret source parsed)]
|
||||
(println (show/show interpreted))
|
||||
interpreted
|
||||
))))))
|
||||
interpreted))))))
|
||||
|
||||
(run "
|
||||
(defn main! []
|
||||
(println "Ludus says, hi there...")
|
||||
|
||||
fn foo () -> :bar
|
||||
#?(:clj (println "...from Clojure.")
|
||||
:cljs (println "...from ClojureScript."))
|
||||
|
||||
foo ()
|
||||
")
|
||||
(run ":foo")
|
||||
(run "add (1, 2)")
|
||||
(run "nil")
|
||||
(run "if true then :foo else :bar")
|
||||
)
|
||||
|
||||
(run ":foo")
|
||||
(run "add (1, 2)")
|
||||
(run "nil")
|
||||
(run "if true then :foo else :bar")
|
|
@ -11,7 +11,9 @@
|
|||
|
||||
(declare expression pattern)
|
||||
|
||||
(defp separator choice [:comma :newline :break])
|
||||
; (defp separator choice [:comma :newline :break])
|
||||
|
||||
(defn separator [] (choice :separator [:comma :newline :break]))
|
||||
|
||||
(defp separators quiet one+ separator)
|
||||
|
||||
|
@ -24,6 +26,7 @@
|
|||
(defp splat group order-1 [(quiet :splat) :word])
|
||||
|
||||
(defp patt-splat-able flat choice [:word :ignored :placeholder])
|
||||
|
||||
(defp splattern group order-1 [(quiet :splat) (maybe patt-splat-able)])
|
||||
|
||||
(defp literal flat choice [:nil :true :false :number :string])
|
||||
|
|
|
@ -840,12 +840,18 @@
|
|||
; (println (ex-message e))
|
||||
; (System/exit 67))))
|
||||
|
||||
(def runtime-error
|
||||
#?(
|
||||
:clj clojure.lang.ExceptionInfo
|
||||
:cljs js/Object
|
||||
))
|
||||
|
||||
;; TODO: update this to use new parser pipeline & new AST representation
|
||||
(defn interpret [source parsed]
|
||||
(try
|
||||
(let [base-ctx (volatile! {::parent (volatile! prelude/prelude)})]
|
||||
(interpret-ast parsed base-ctx))
|
||||
(catch clojure.lang.ExceptionInfo e
|
||||
(catch #?(:cljs :default :clj Throwable) e
|
||||
(println "Ludus panicked!")
|
||||
(println "On line" (get-in (ex-data e) [:ast :token :line]))
|
||||
(println ">>> " (get-line source (get-in (ex-data e) [:ast :token :line])))
|
||||
|
|
|
@ -3,6 +3,7 @@
|
|||
[ludus.data :as data]
|
||||
[ludus.show :as show]
|
||||
;[ludus.draw :as d]
|
||||
#?(:cljs [cljs.reader])
|
||||
))
|
||||
|
||||
;; TODO: make eq, and, or special forms that short-circuit
|
||||
|
@ -96,9 +97,6 @@
|
|||
::data/type ::data/clj
|
||||
:body ludus.show/show})
|
||||
|
||||
(def sleep- {:name "sleep"
|
||||
::data/type ::data/clj
|
||||
:body (fn [ms] (Thread/sleep ms))})
|
||||
(def conj- {:name "conj"
|
||||
::data/type ::data/clj
|
||||
:body conj})
|
||||
|
@ -142,36 +140,85 @@
|
|||
(contains? xs (inc i)) (nth xs (inc i))
|
||||
:else default)))})
|
||||
|
||||
(def types {
|
||||
:keyword
|
||||
#?(
|
||||
:clj clojure.lang.Keyword
|
||||
:cljs cljs.core/Keyword
|
||||
)
|
||||
|
||||
:long
|
||||
#?(
|
||||
:clj java.lang.Long
|
||||
:cljs js/Number
|
||||
)
|
||||
|
||||
:double
|
||||
#?(
|
||||
:clj java.lang.Double
|
||||
:cljs js/Number
|
||||
)
|
||||
|
||||
:string
|
||||
#?(
|
||||
:clj java.lang.String
|
||||
:cljs js/String
|
||||
)
|
||||
|
||||
:boolean
|
||||
#?(
|
||||
:clj java.lang.Boolean
|
||||
:cljs js/Boolean
|
||||
)
|
||||
|
||||
:set
|
||||
#?(
|
||||
:clj clojure.lang.PersistentHashSet
|
||||
:cljs cljs.core/PersistentHashSet
|
||||
)
|
||||
|
||||
:vector
|
||||
#?(
|
||||
:clj clojure.lang.PersistentVector
|
||||
:cljs cljs.core/PersistentVector
|
||||
)
|
||||
|
||||
:map
|
||||
#?(
|
||||
:clj clojure.lang.PersistentArrayMap
|
||||
:cljs cljs.core/PersistentArrayMap
|
||||
)
|
||||
})
|
||||
|
||||
(defn get-type [value]
|
||||
(let [t (type value)]
|
||||
(cond
|
||||
(nil? value) :nil
|
||||
|
||||
(= clojure.lang.Keyword t) :keyword
|
||||
(= (:keyword types) t) :keyword
|
||||
|
||||
(= java.lang.Long t) :number
|
||||
(= (:long types) t) :number
|
||||
|
||||
(= java.lang.Double t) :number
|
||||
(= (:double types) t) :number
|
||||
|
||||
(= java.lang.String t) :string
|
||||
(= (:string types) t) :string
|
||||
|
||||
(= java.lang.Boolean t) :boolean
|
||||
(= (:boolean types) t) :boolean
|
||||
|
||||
(= clojure.lang.PersistentHashSet t) :set
|
||||
(= (:set types) t) :set
|
||||
|
||||
;; tuples and lists
|
||||
(= clojure.lang.PersistentVector t)
|
||||
(= (:vector types) t)
|
||||
(if (= ::data/tuple (first value)) :tuple :list)
|
||||
|
||||
;; structs dicts namespaces refs
|
||||
(= clojure.lang.PersistentArrayMap t)
|
||||
(= (:map types) t)
|
||||
(cond
|
||||
(::data/type value) (case (::data/type value)
|
||||
(::data/fn ::data/clj) :fn
|
||||
::data/ns :ns)
|
||||
(::data/dict value) :dict
|
||||
(::data/struct value) :struct
|
||||
|
||||
:else :none
|
||||
))))
|
||||
|
||||
|
@ -181,11 +228,17 @@
|
|||
|
||||
(defn strpart [kw] (->> kw str rest (apply str)))
|
||||
|
||||
(def readstr
|
||||
#?(
|
||||
:clj read-string
|
||||
:cljs cljs.reader/read-string
|
||||
))
|
||||
|
||||
(def clj {:name "clj"
|
||||
::data/type ::data/clj
|
||||
:body (fn [& args]
|
||||
(println "Args passed: " args)
|
||||
(let [called (-> args first strpart read-string eval)
|
||||
(let [called (-> args first strpart readstr eval)
|
||||
fn-args (rest args)]
|
||||
(println "Fn: " called)
|
||||
(println "Args: " fn-args)
|
||||
|
@ -215,7 +268,6 @@
|
|||
"set!" set!-
|
||||
"and" and-
|
||||
"or" or-
|
||||
"sleep" sleep-
|
||||
"assoc" assoc-
|
||||
"conj" conj-
|
||||
"get" get-
|
||||
|
|
|
@ -1,4 +1,4 @@
|
|||
(ns cludus.core-test
|
||||
(ns ludus.core-test
|
||||
(:require [clojure.test :refer :all]
|
||||
[cludus.core :refer :all]))
|
||||
|
Loading…
Reference in New Issue
Block a user