From a1d619ac4679f246a92ee5e557ed1341f5629221 Mon Sep 17 00:00:00 2001 From: Eduardo Julian Date: Mon, 19 Jan 2015 01:36:16 -0400 Subject: [Enhancement] .class files are now stored inside an "output" directory. --- src/lux.clj | 1 + src/lux/compiler.clj | 20 ++++++++++++-------- src/lux/util.clj | 2 +- test2.lux | 28 +++++++++++++++++++--------- 4 files changed, 33 insertions(+), 18 deletions(-) diff --git a/src/lux.clj b/src/lux.clj index 517396182..f21a336e0 100644 --- a/src/lux.clj +++ b/src/lux.clj @@ -38,6 +38,7 @@ ) ;; jar cvf test2.jar *.class test2 && java -cp "test2.jar" test2 + ;; cd output && jar cvf test2.jar * && java -cp "test2.jar" test2 && cd .. ) ;; (def (workday? d) diff --git a/src/lux/compiler.clj b/src/lux/compiler.clj index a7ebcf8c1..2a347aa46 100644 --- a/src/lux/compiler.clj +++ b/src/lux/compiler.clj @@ -30,6 +30,9 @@ ;; (Thread/sleep 2000) ) +(defn ^:private write-class [name data] + (write-file (str "output/" name ".class") data)) + (let [;; loader (proxy [ClassLoader] []) ] (defn load-class! [name file-name] @@ -39,6 +42,7 @@ (.loadClass @loader name) ;; (println "SUCCESFUL LOAD!") ;; (.defineClass loader name bytecode 0 (alength bytecode)) + ;; (-> (java.io.File. "./") .toURL vector into-array java.net.URLClassLoader. (.loadClass "test2/Function")) )) (def ^:private +variant-class+ "test2.Variant") @@ -838,7 +842,7 @@ (.visitEnd))) _ (.visitEnd =class) bytecode (.toByteArray =class)] - (write-file (str current-class ".class") bytecode) + (write-class current-class bytecode) (load-class! (string/replace current-class #"/" ".") (str current-class ".class"))) )) @@ -861,7 +865,7 @@ (.visitEnd))) (.visitEnd)) bytecode (.toByteArray =class)] - (write-file (str current-class ".class") bytecode) + (write-class current-class bytecode) (load-class! (string/replace current-class #"/" ".") (str current-class ".class"))) )) @@ -1007,7 +1011,7 @@ (.visitEnd)) _ (.visitEnd =class) bytecode (.toByteArray =class)] - (write-file (str current-class ".class") bytecode) + (write-class current-class bytecode) (load-class! (string/replace current-class #"/" ".") (str current-class ".class")) ;; (apply prn 'LAMBDA ?scope ?args (->> (:mappings ?frame) ;; (map second) @@ -1056,8 +1060,8 @@ (.visitMaxs 0 0) (.visitEnd)) (.visitEnd =class) - (.mkdirs (java.io.File. parent-dir)) - (write-file (str parent-dir "/" ?name ".class") (.toByteArray =class)) + (.mkdirs (java.io.File. (str "output/" parent-dir))) + (write-class (str parent-dir "/" ?name) (.toByteArray =class)) (load-class! (string/replace (str parent-dir "/" ?name) #"/" ".") (str parent-dir "/" ?name ".class")))) (defcompiler ^:private compile-definterface @@ -1072,8 +1076,8 @@ signature (str "(" (reduce str "" (map ->type-signature ?args)) ")" (->type-signature ?return))]] (.visitMethod =interface (+ Opcodes/ACC_PUBLIC Opcodes/ACC_ABSTRACT) ?method signature nil nil)) (.visitEnd =interface) - (.mkdirs (java.io.File. parent-dir)) - (write-file (str parent-dir "/" ?name ".class") (.toByteArray =interface)) + (.mkdirs (java.io.File. (str "output/" parent-dir))) + (write-class (str parent-dir "/" ?name) (.toByteArray =interface)) (load-class! (string/replace (str parent-dir "/" ?name) #"/" ".") (str parent-dir "/" ?name ".class")))) (defcompiler ^:private compile-variant @@ -1209,7 +1213,7 @@ ;;; (.visitEnd =class) (let [bytecode (.toByteArray =class)] - (write-file (str class-name ".class") bytecode) + (write-class class-name bytecode) (load-class! (string/replace class-name #"/" ".") (str class-name ".class")) bytecode) ) diff --git a/src/lux/util.clj b/src/lux/util.clj index 5496e8699..757648c31 100644 --- a/src/lux/util.clj +++ b/src/lux/util.clj @@ -162,4 +162,4 @@ (defonce loader (atom nil)) (defn reset-loader! [] - (reset! loader (-> (java.io.File. "./") .toURL vector into-array java.net.URLClassLoader.))) + (reset! loader (-> (java.io.File. "./output/") .toURL vector into-array java.net.URLClassLoader.))) diff --git a/test2.lux b/test2.lux index 15bcecdbc..d036bbde4 100644 --- a/test2.lux +++ b/test2.lux @@ -388,15 +388,6 @@ (lambda [state] (#Ok [state state]))) -(def monadic-dup - (exec [foo get-state - bar get-state - baz (return 1000)] - (return (+ (+ foo bar) baz)))) - -(def (run-state monad state) - (monad state)) - (def list-map #Nil) (def (put key val map) @@ -424,6 +415,25 @@ [?key ?val] (fold concat "" (list "#" ?key " " (show ?val))))) +(def (within slot monad) + (lambda [state] + (let =return (monad (get slot state)) + (case =return + (#Ok ?state ?value) + (#Ok (put slot ?state state) ?value) + + _ + =return)))) + +(def monadic-dup + (exec [foo get-state + bar get-state + baz (return 1000)] + (return (+ (+ foo bar) baz)))) + +(def (run-state monad state) + (monad state)) + (def (interpose elem list) (case list (#Cons x (#Cons y list')) -- cgit v1.2.3