Skip to content

Instantly share code, notes, and snippets.

@Efimero
Created June 3, 2019 11:23
Show Gist options
  • Save Efimero/036fe9f2b316632a47bd025bb41d29bf to your computer and use it in GitHub Desktop.
Save Efimero/036fe9f2b316632a47bd025bb41d29bf to your computer and use it in GitHub Desktop.
(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 ()))))
(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))))
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