Created
June 3, 2019 11:23
-
-
Save Efimero/036fe9f2b316632a47bd025bb41d29bf to your computer and use it in GitHub Desktop.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
(defmacro def-callback-macro [fname basefn interface & inner-args] ; take a (new) macro name, a method name, the interface it implements and the arguments the callback will take | |
(let [args (vec (cons '$this inner-args))] ; add $this to the argument list 'cause reify wants it | |
`(defmacro ~(symbol fname) ~'[window & callback] ; fuck up and make a new macro with the expected arguments, maybe | |
`(. GLFW ~'~basefn (long ~'~'window) | |
(reify ~~interface | |
(~'~'invoke ~'~args | |
~@~'callback | |
)))))) ;now how the fuck do you call the callback passing the arguments while inside reify fuck this shit aaaa | |
;(log (clojure.walk/macroexpand-all '(def-anti-void-fn "example" glfwGetWindowSize 1 2))) | |
(log (macroexpand-1 '(def-callback-macro "example" glfwSetKeyCallback GLFWKeyCallbackI $window $key $scancode $action $mods))) | |
(log (clojure.walk/macroexpand-all '(def-callback-macro "example" glfwSetKeyCallback GLFWKeyCallbackI $window $key $scancode $action $mods))) | |
(def-callback-macro "example" glfwSetKeyCallback GLFWKeyCallbackI $window $key $scancode $action $mods) | |
(GLFW/glfwInit) | |
(let [wind (GLFW/glfwCreateWindow (int 800) (int 600) (String. "GAY") (long 0) (long 0))] | |
(log (macroexpand-1 '(example wind ())))) |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
(let [window (glfw/create-window 800 600 "I'm gay!")] | |
(when (nil? window) | |
(throw (RuntimeException. "Failed to create the GLFW window"))) | |
(glfw/set-key-callback | |
window | |
(when (and (= $key glfw/KEY_ESCAPE) | |
(= $action glfw/RELEASE)) | |
(println "Key detected") | |
(glfw/set-window-should-close $window true)))) |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
efi@Dagon:~/projects/test-3d$ ./run | |
(clojure.core/defmacro | |
example | |
[window & callback] | |
(clojure.core/seq | |
(clojure.core/concat | |
(clojure.core/list '.) | |
(clojure.core/list 'org.lwjgl.glfw.GLFW) | |
(clojure.core/list 'glfwSetKeyCallback) | |
(clojure.core/list | |
(clojure.core/seq | |
(clojure.core/concat | |
(clojure.core/list 'clojure.core/long) | |
(clojure.core/list 'window)))) | |
(clojure.core/list | |
(clojure.core/seq | |
(clojure.core/concat | |
(clojure.core/list 'clojure.core/reify) | |
(clojure.core/list GLFWKeyCallbackI) | |
(clojure.core/list | |
(clojure.core/seq | |
(clojure.core/concat | |
(clojure.core/list 'invoke) | |
(clojure.core/list | |
'[$this $window $key $scancode $action $mods]) | |
callback))))))))) | |
(do | |
(def | |
example | |
(fn* | |
([&form &env window & callback] | |
(clojure.core/seq | |
(clojure.core/concat | |
(clojure.core/list '.) | |
(clojure.core/list 'org.lwjgl.glfw.GLFW) | |
(clojure.core/list 'glfwSetKeyCallback) | |
(clojure.core/list | |
(clojure.core/seq | |
(clojure.core/concat | |
(clojure.core/list 'clojure.core/long) | |
(clojure.core/list 'window)))) | |
(clojure.core/list | |
(clojure.core/seq | |
(clojure.core/concat | |
(clojure.core/list 'clojure.core/reify) | |
(clojure.core/list GLFWKeyCallbackI) | |
(clojure.core/list | |
(clojure.core/seq | |
(clojure.core/concat | |
(clojure.core/list 'invoke) | |
(clojure.core/list | |
'[$this $window $key $scancode $action $mods]) | |
callback))))))))))) | |
(. #'example (setMacro)) | |
#'example) | |
(. | |
org.lwjgl.glfw.GLFW | |
glfwSetKeyCallback | |
(clojure.core/long window) | |
(clojure.core/reify | |
org.lwjgl.glfw.GLFWKeyCallbackI | |
(invoke [$this $window $key $scancode $action $mods] ()))) | |
Exception in thread "main" Unexpected error macroexpanding clojure.core/reify at (test_3d/core.clj:24:5). | |
at clojure.lang.Compiler.macroexpand1(Compiler.java:7018) | |
at clojure.lang.Compiler.analyzeSeq(Compiler.java:7092) | |
at clojure.lang.Compiler.analyze(Compiler.java:6789) | |
at clojure.lang.Compiler.analyze(Compiler.java:6745) | |
at clojure.lang.Compiler$HostExpr$Parser.parse(Compiler.java:1020) | |
at clojure.lang.Compiler.analyzeSeq(Compiler.java:7106) | |
at clojure.lang.Compiler.analyze(Compiler.java:6789) | |
at clojure.lang.Compiler.analyzeSeq(Compiler.java:7094) | |
at clojure.lang.Compiler.analyze(Compiler.java:6789) | |
at clojure.lang.Compiler.analyze(Compiler.java:6745) | |
at clojure.lang.Compiler$BodyExpr$Parser.parse(Compiler.java:6118) | |
at clojure.lang.Compiler$LetExpr$Parser.parse(Compiler.java:6436) | |
at clojure.lang.Compiler.analyzeSeq(Compiler.java:7106) | |
at clojure.lang.Compiler.analyze(Compiler.java:6789) | |
at clojure.lang.Compiler.analyzeSeq(Compiler.java:7094) | |
at clojure.lang.Compiler.analyze(Compiler.java:6789) | |
at clojure.lang.Compiler.analyze(Compiler.java:6745) | |
at clojure.lang.Compiler$BodyExpr$Parser.parse(Compiler.java:6120) | |
at clojure.lang.Compiler$FnMethod.parse(Compiler.java:5467) | |
at clojure.lang.Compiler$FnExpr.parse(Compiler.java:4029) | |
at clojure.lang.Compiler.analyzeSeq(Compiler.java:7104) | |
at clojure.lang.Compiler.analyze(Compiler.java:6789) | |
at clojure.lang.Compiler.analyzeSeq(Compiler.java:7094) | |
at clojure.lang.Compiler.analyze(Compiler.java:6789) | |
at clojure.lang.Compiler.access$300(Compiler.java:38) | |
at clojure.lang.Compiler$DefExpr$Parser.parse(Compiler.java:596) | |
at clojure.lang.Compiler.analyzeSeq(Compiler.java:7106) | |
at clojure.lang.Compiler.analyze(Compiler.java:6789) | |
at clojure.lang.Compiler.analyze(Compiler.java:6745) | |
at clojure.lang.Compiler.eval(Compiler.java:7180) | |
at clojure.lang.Compiler.load(Compiler.java:7635) | |
at clojure.lang.RT.loadResourceScript(RT.java:381) | |
at clojure.lang.RT.loadResourceScript(RT.java:372) | |
at clojure.lang.RT.load(RT.java:463) | |
at clojure.lang.RT.load(RT.java:428) | |
at clojure.core$load$fn__6824.invoke(core.clj:6126) | |
at clojure.core$load.invokeStatic(core.clj:6125) | |
at clojure.core$load.doInvoke(core.clj:6109) | |
at clojure.lang.RestFn.invoke(RestFn.java:408) | |
at clojure.core$load_one.invokeStatic(core.clj:5908) | |
at clojure.core$load_one.invoke(core.clj:5903) | |
at clojure.core$load_lib$fn__6765.invoke(core.clj:5948) | |
at clojure.core$load_lib.invokeStatic(core.clj:5947) | |
at clojure.core$load_lib.doInvoke(core.clj:5928) | |
at clojure.lang.RestFn.applyTo(RestFn.java:142) | |
at clojure.core$apply.invokeStatic(core.clj:667) | |
at clojure.core$load_libs.invokeStatic(core.clj:5985) | |
at clojure.core$load_libs.doInvoke(core.clj:5969) | |
at clojure.lang.RestFn.applyTo(RestFn.java:137) | |
at clojure.core$apply.invokeStatic(core.clj:667) | |
at clojure.core$require.invokeStatic(core.clj:6007) | |
at clojure.core$require.doInvoke(core.clj:6007) | |
at clojure.lang.RestFn.invoke(RestFn.java:408) | |
at user$eval140$fn__144.invoke(form-init2639638826559882832.clj:1) | |
at user$eval140.invokeStatic(form-init2639638826559882832.clj:1) | |
at user$eval140.invoke(form-init2639638826559882832.clj:1) | |
at clojure.lang.Compiler.eval(Compiler.java:7176) | |
at clojure.lang.Compiler.eval(Compiler.java:7166) | |
at clojure.lang.Compiler.load(Compiler.java:7635) | |
at clojure.lang.Compiler.loadFile(Compiler.java:7573) | |
at clojure.main$load_script.invokeStatic(main.clj:452) | |
at clojure.main$init_opt.invokeStatic(main.clj:454) | |
at clojure.main$init_opt.invoke(main.clj:454) | |
at clojure.main$initialize.invokeStatic(main.clj:485) | |
at clojure.main$null_opt.invokeStatic(main.clj:519) | |
at clojure.main$null_opt.invoke(main.clj:516) | |
at clojure.main$main.invokeStatic(main.clj:598) | |
at clojure.main$main.doInvoke(main.clj:561) | |
at clojure.lang.RestFn.applyTo(RestFn.java:137) | |
at clojure.lang.Var.applyTo(Var.java:705) | |
at clojure.main.main(main.java:37) | |
Caused by: java.lang.ClassCastException: class java.lang.Class cannot be cast to class clojure.lang.Symbol (java.lang.Class is in module java.base of loader 'bootstrap'; clojure.lang.Symbol is in unnamed module of loader 'app') | |
at clojure.core$ns_resolve.invokeStatic(core.clj:4369) | |
at clojure.core$ns_resolve.invokeStatic(core.clj:4359) | |
at clojure.core$resolve.invokeStatic(core.clj:4372) | |
at clojure.core$parse_opts_PLUS_specs$fn__7734.invoke(core_deftype.clj:56) | |
at clojure.core$map$fn__5851.invoke(core.clj:2755) | |
at clojure.lang.LazySeq.sval(LazySeq.java:42) | |
at clojure.lang.LazySeq.seq(LazySeq.java:51) | |
at clojure.lang.RT.seq(RT.java:531) | |
at clojure.core$seq__5387.invokeStatic(core.clj:137) | |
at clojure.core$reduce1.invokeStatic(core.clj:930) | |
at clojure.core$set.invokeStatic(core.clj:4113) | |
at clojure.core$parse_opts_PLUS_specs.invokeStatic(core_deftype.clj:54) | |
at clojure.core$reify.invokeStatic(core_deftype.clj:70) | |
at clojure.core$reify.doInvoke(core_deftype.clj:70) | |
at clojure.lang.RestFn.applyTo(RestFn.java:142) | |
at clojure.lang.Var.applyTo(Var.java:705) | |
at clojure.lang.Compiler.macroexpand1(Compiler.java:6992) | |
... 70 more | |
efi@Dagon:~/projects/test-3d$ |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment