I really would like to put a functional layer in the cross-VM stack, but...
Ocamljava and F# might be code compatible, but the former has a cumbersome build and interop process (and doesn't seem to advertise call-from-Java); while Bigloo seems entirely silent on interop.
Cross-compiling Scala class bytecodes to CLR doesn't seem to be a goer -- IKVM balks at referencing CLR 2.0 assemblies. I might be able decompile the classes and rebuild them via J# -- the hiccup there is that I would have to translate the runtime .jar as well -- my simple "Hello World!" level class decompiles to invoke scala.runtime.BoxesRunTime
, but that's not in any of the scalac-net assemblies. On the up-side that would remove any nagging issues about CLR 2.0 compatibility, though; on the down-side, it would mean that I need a decompiler able to handle the generated code... Jode -- which I happened to have to hand -- balked at half the classes in the runtime; Jad seemed to have dealt with them all, though with a lot of goto
statements replacing things like jumps out of loops -- but leaves a lot of JVM INSTR monitorenter;...JVM INSTR monitorexit;
where a synchronized{}
block should be, and possibly other horrors.
Meanwhile I took another prod at scalac-net, using the magic -Ydebug flag:
>\scala-2.6.1-final\bin\scalac-net -d classes -Xassem-path JavaLayer.dll SClass. scala -Ydebug [running phase parser on SClass.scala] [running phase namer on SClass.scala] java.lang.ClassCastException: scala.tools.nsc.symtab.Symbols$ClassSymbol cannot be cast to scala.runtime.Nothing$ at scala.tools.nsc.symtab.clr.TypeParser.parseClass(TypeParser.scala:77) at scala.tools.nsc.symtab.clr.TypeParser.parse(TypeParser.scala:58) at scala.tools.nsc.symtab.SymbolLoaders$MSILTypeLoader.doComplete(Symbol Loaders.scala:263) at scala.tools.nsc.symtab.SymbolLoaders$SymbolLoader.complete(SymbolLoad ers.scala:54) ... java.io.IOException: type 'scala.Predef' is broken (scala.tools.nsc.symtab.Symbols$ClassSymbol cannot be cast to scala.runtime.Nothing$) ...
Kudos to the scala implementors -- the line numbers match up down the stack, and show the culprit to be
unpickler.unpickle(symtab, 0, clazz.asInstanceOf, staticModule.asInstanceOf, typ.FullName);
which looks like it's doing the right sort of thing; and there's nothing particularly odd about the scala.Predef
class in the assembly; and I get the same error trying to compile some of the examples in the distro...
Next diversion, rebuilding scalac with more instrumentation, piling the tower higher.