Skip to content

Instantly share code, notes, and snippets.

@vizanto
Last active January 14, 2017 15:41
Show Gist options
  • Select an option

  • Save vizanto/d60cb466b1573026b893 to your computer and use it in GitHub Desktop.

Select an option

Save vizanto/d60cb466b1573026b893 to your computer and use it in GitHub Desktop.
Haxe / Clojure interop experiments
//
// Nasty code below:
//
package java.internal;
import java.internal.Runtime;
/**
* These classes are automatically generated by the compiler. They are only
* here so there is an option for e.g. defining them as externs if you are compiling
* in modules (untested)
*
* @author waneck, vizanto
*/
@:abstract @:nativeGen @:native("haxe.lang.Function") @:keep class Function implements clojure.lang.IFn
{
function new(arity:Int, type:Int)
{
}
public function applyTo(args) : Dynamic
{
return (untyped this).__hx_invokeDynamic(cast args);
}
public function run() : Void
{
(untyped this).__hx_invokeDynamic([]);
}
public function call() : Dynamic
{
return (untyped this).__hx_invokeDynamic([]);
}
@:overload public function invoke() : Dynamic {
return (untyped this).__hx_invokeDynamic([]);
}
@:overload public function invoke(arg1 : Dynamic) : Dynamic {
return (untyped this).__hx_invokeDynamic([arg1]);
}
@:overload public function invoke(arg1 : Dynamic, arg2 : Dynamic) : Dynamic {
return (untyped this).__hx_invokeDynamic([arg1, arg2]);
}
@:overload public function invoke(arg1 : Dynamic, arg2 : Dynamic, arg3 : Dynamic) : Dynamic {
return (untyped this).__hx_invokeDynamic([arg1, arg2, arg3]);
}
@:overload public function invoke(arg1 : Dynamic, arg2 : Dynamic, arg3 : Dynamic, arg4 : Dynamic) : Dynamic {
return (untyped this).__hx_invokeDynamic([arg1, arg2, arg3, arg4]);
}
@:overload public function invoke(arg1 : Dynamic, arg2 : Dynamic, arg3 : Dynamic, arg4 : Dynamic, arg5 : Dynamic) : Dynamic {
return (untyped this).__hx_invokeDynamic([arg1, arg2, arg3, arg4, arg5]);
}
@:overload public function invoke(arg1 : Dynamic, arg2 : Dynamic, arg3 : Dynamic, arg4 : Dynamic, arg5 : Dynamic, arg6 : Dynamic) : Dynamic {
return (untyped this).__hx_invokeDynamic([arg1, arg2, arg3, arg4, arg5, arg6]);
}
@:overload public function invoke(arg1 : Dynamic, arg2 : Dynamic, arg3 : Dynamic, arg4 : Dynamic, arg5 : Dynamic, arg6 : Dynamic, arg7 : Dynamic) : Dynamic {
return (untyped this).__hx_invokeDynamic([]);
}
@:overload public function invoke(arg1 : Dynamic, arg2 : Dynamic, arg3 : Dynamic, arg4 : Dynamic, arg5 : Dynamic, arg6 : Dynamic, arg7 : Dynamic, arg8 : Dynamic) : Dynamic {
return (untyped this).__hx_invokeDynamic([arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8]);
}
@:overload public function invoke(arg1 : Dynamic, arg2 : Dynamic, arg3 : Dynamic, arg4 : Dynamic, arg5 : Dynamic, arg6 : Dynamic, arg7 : Dynamic, arg8 : Dynamic, arg9 : Dynamic) : Dynamic {
return (untyped this).__hx_invokeDynamic([arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8, arg9]);
}
@:overload public function invoke(arg1 : Dynamic, arg2 : Dynamic, arg3 : Dynamic, arg4 : Dynamic, arg5 : Dynamic, arg6 : Dynamic, arg7 : Dynamic, arg8 : Dynamic, arg9 : Dynamic, arg10 : Dynamic) : Dynamic {
return (untyped this).__hx_invokeDynamic([arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8, arg9, arg10]);
}
@:overload public function invoke(arg1 : Dynamic, arg2 : Dynamic, arg3 : Dynamic, arg4 : Dynamic, arg5 : Dynamic, arg6 : Dynamic, arg7 : Dynamic, arg8 : Dynamic, arg9 : Dynamic, arg10 : Dynamic, arg11 : Dynamic) : Dynamic {
return (untyped this).__hx_invokeDynamic([arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8, arg9, arg10, arg11]);
}
@:overload public function invoke(arg1 : Dynamic, arg2 : Dynamic, arg3 : Dynamic, arg4 : Dynamic, arg5 : Dynamic, arg6 : Dynamic, arg7 : Dynamic, arg8 : Dynamic, arg9 : Dynamic, arg10 : Dynamic, arg11 : Dynamic, arg12 : Dynamic) : Dynamic {
return (untyped this).__hx_invokeDynamic([arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8, arg9, arg10, arg11, arg12]);
}
@:overload public function invoke(arg1 : Dynamic, arg2 : Dynamic, arg3 : Dynamic, arg4 : Dynamic, arg5 : Dynamic, arg6 : Dynamic, arg7 : Dynamic, arg8 : Dynamic, arg9 : Dynamic, arg10 : Dynamic, arg11 : Dynamic, arg12 : Dynamic, arg13 : Dynamic) : Dynamic {
return (untyped this).__hx_invokeDynamic([arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8, arg9, arg10, arg11, arg12, arg13]);
}
@:overload public function invoke(arg1 : Dynamic, arg2 : Dynamic, arg3 : Dynamic, arg4 : Dynamic, arg5 : Dynamic, arg6 : Dynamic, arg7 : Dynamic, arg8 : Dynamic, arg9 : Dynamic, arg10 : Dynamic, arg11 : Dynamic, arg12 : Dynamic, arg13 : Dynamic, arg14 : Dynamic) : Dynamic {
return (untyped this).__hx_invokeDynamic([arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8, arg9, arg10, arg11, arg12, arg13, arg14]);
}
@:overload public function invoke(arg1 : Dynamic, arg2 : Dynamic, arg3 : Dynamic, arg4 : Dynamic, arg5 : Dynamic, arg6 : Dynamic, arg7 : Dynamic, arg8 : Dynamic, arg9 : Dynamic, arg10 : Dynamic, arg11 : Dynamic, arg12 : Dynamic, arg13 : Dynamic, arg14 : Dynamic, arg15 : Dynamic) : Dynamic {
return (untyped this).__hx_invokeDynamic([arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8, arg9, arg10, arg11, arg12, arg13, arg14, arg15]);
}
@:overload public function invoke(arg1 : Dynamic, arg2 : Dynamic, arg3 : Dynamic, arg4 : Dynamic, arg5 : Dynamic, arg6 : Dynamic, arg7 : Dynamic, arg8 : Dynamic, arg9 : Dynamic, arg10 : Dynamic, arg11 : Dynamic, arg12 : Dynamic, arg13 : Dynamic, arg14 : Dynamic, arg15 : Dynamic, arg16 : Dynamic) : Dynamic {
return (untyped this).__hx_invokeDynamic([arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8, arg9, arg10, arg11, arg12, arg13, arg14, arg15, arg16]);
}
@:overload public function invoke(arg1 : Dynamic, arg2 : Dynamic, arg3 : Dynamic, arg4 : Dynamic, arg5 : Dynamic, arg6 : Dynamic, arg7 : Dynamic, arg8 : Dynamic, arg9 : Dynamic, arg10 : Dynamic, arg11 : Dynamic, arg12 : Dynamic, arg13 : Dynamic, arg14 : Dynamic, arg15 : Dynamic, arg16 : Dynamic, arg17 : Dynamic) : Dynamic {
return (untyped this).__hx_invokeDynamic([arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8, arg9, arg10, arg11, arg12, arg13, arg14, arg15, arg16, arg17]);
}
@:overload public function invoke(arg1 : Dynamic, arg2 : Dynamic, arg3 : Dynamic, arg4 : Dynamic, arg5 : Dynamic, arg6 : Dynamic, arg7 : Dynamic, arg8 : Dynamic, arg9 : Dynamic, arg10 : Dynamic, arg11 : Dynamic, arg12 : Dynamic, arg13 : Dynamic, arg14 : Dynamic, arg15 : Dynamic, arg16 : Dynamic, arg17 : Dynamic, arg18 : Dynamic) : Dynamic {
return (untyped this).__hx_invokeDynamic([arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8, arg9, arg10, arg11, arg12, arg13, arg14, arg15, arg16, arg17, arg18]);
}
@:overload public function invoke(arg1 : Dynamic, arg2 : Dynamic, arg3 : Dynamic, arg4 : Dynamic, arg5 : Dynamic, arg6 : Dynamic, arg7 : Dynamic, arg8 : Dynamic, arg9 : Dynamic, arg10 : Dynamic, arg11 : Dynamic, arg12 : Dynamic, arg13 : Dynamic, arg14 : Dynamic, arg15 : Dynamic, arg16 : Dynamic, arg17 : Dynamic, arg18 : Dynamic, arg19 : Dynamic) : Dynamic {
return (untyped this).__hx_invokeDynamic([arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8, arg9, arg10, arg11, arg12, arg13, arg14, arg15, arg16, arg17, arg18, arg19]);
}
@:overload public function invoke(arg1 : Dynamic, arg2 : Dynamic, arg3 : Dynamic, arg4 : Dynamic, arg5 : Dynamic, arg6 : Dynamic, arg7 : Dynamic, arg8 : Dynamic, arg9 : Dynamic, arg10 : Dynamic, arg11 : Dynamic, arg12 : Dynamic, arg13 : Dynamic, arg14 : Dynamic, arg15 : Dynamic, arg16 : Dynamic, arg17 : Dynamic, arg18 : Dynamic, arg19 : Dynamic, arg20 : Dynamic) : Dynamic {
return (untyped this).__hx_invokeDynamic([arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8, arg9, arg10, arg11, arg12, arg13, arg14, arg15, arg16, arg17, arg18, arg19, arg20]);
}
@:overload public function invoke(arg1 : Dynamic, arg2 : Dynamic, arg3 : Dynamic, arg4 : Dynamic, arg5 : Dynamic, arg6 : Dynamic, arg7 : Dynamic, arg8 : Dynamic, arg9 : Dynamic, arg10 : Dynamic, arg11 : Dynamic, arg12 : Dynamic, arg13 : Dynamic, arg14 : Dynamic, arg15 : Dynamic, arg16 : Dynamic, arg17 : Dynamic, arg18 : Dynamic, arg19 : Dynamic, arg20 : Dynamic, args : NativeArray<Dynamic>) : Dynamic {
return (untyped this).__hx_invokeDynamic([ arg1, arg2, arg3, arg4, arg5, arg6, arg7,
arg8, arg9, arg10, arg11, arg12, arg13, arg14,
arg15, arg16, arg17, arg18, arg19, arg20 ]); //.concat(args));
}
}
//
//... rest is standard
//
➭ haxe build.hxml && java -cp ~/.m2/repository/org/clojure/clojure/1.6.0/clojure-1.6.0.jar -jar ./bin/Test.jar
haxelib run hxjava hxjava_build.txt --haxe-version 3200 --feature-level 1
javac "-sourcepath" "src" "-d" "obj" "-g:none" "-classpath" "./lib/clojure-1.6.0.jar" "@cmd"
Test.hx:8: Hellow Clojure: #'user/whut
Test.hx:14: 456
Test.hx:17: 789
Test.hx:21: clojure.lang.LazySeq@148d
([123 456])
package clojure;
import clojure.lang.IPersistentMap;
/**
This abstract allows accessing Clojure's PersistentMap like Haxe's Map.
The keys are strong references. This is for the Java target only.
**/
@:notNull
abstract PersistentMap<K, V>(IPersistentMap)
{
public inline function new(underlying : IPersistentMap) {
this = underlying;
}
@:arrayAccess public inline function get(k:K) {
return this.valAt(k);
}
public inline function exists(k:K) {
return this.containsKey(k);
}
@:from static inline function toCljMap<K,V>(t:IPersistentMap):PersistentMap<K,V> {
return new PersistentMap<K,V>(t);
}
}
import clojure.lang.*;
import clojure.java.api.Clojure;
import clojure.PersistentMap;
class Test {
static function main() {
var whut = Var.intern(Symbol.intern("user"), Symbol.intern("whut"));
trace("Hellow Clojure: " + whut);
var readed : APersistentMap = Clojure.read("{ 123 456 }");
//$type(readed);
var map : PersistentMap<Int, Dynamic> = readed;
trace( map[123] );
whut.bindRoot(function() return 789);
trace( whut.invoke() );
var mapped = Var.intern(Symbol.intern("clojure.core"), Symbol.intern("map"))
.invoke(function(key_value) return key_value, readed);
trace(mapped);
Var.intern(Symbol.intern("clojure.core"), Symbol.intern("println")).invoke(mapped);
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment