FuJ is Functional J@va.
What does "functional" mean? It means we have made every possibly
effort to make set! unnecessary in client code.
I used to have a Scheme object system I really liked, based closely on
the Smalltalk object system. (It was so close, I had a side project
writing a Squeak Smalltalk utility to dump Smalltalk files as Scheme
files that my system could read.) But there was always something a
little un-schemey about the whole thing: when you create instances in
that kind of world, you pass arguments down to a method that
eventually slams them into blank instance variables with set!. That
just never felt quite functional enough. Moreover, it's always a lot
of annoying code to write when you write a new class -- threading the
data flow around so you can get your objects initialized right.
But then I started having to use Java a lot at work. I wanted to use Scheme to manipulate Java objects, so I looked around at the available Scheme-in-Java systems, and settled on JScheme as a good match for my needs. I used it and enjoyed it, but something was still missing: I couldn't subclass any Java classes or implement Java interfaces. This can be a real problem. Sometimes, subclassing and implementing are key parts of how you use a Java framework. So what's a hacker to do?
My solution is FuJ. At first, FuJ was just my Smalltalk system ported
to JScheme, but the set! initializers just became more and more of
an annoyance, so I ripped them out. Then FuJ really started to make
sense. Functional J@ava! Just what I wanted.
As strange as it seems, FuJ is not class-based, even though Java is. The key defining characteristic of FuJ is simply this: all instance variables shall be simple lexical variables. That is, the state of an instance is the state of any variables over which the object's method were closed. This implies, however, that methods are closed at instance creation time. Well, in that case, there's not much reason left for classes. So FuJ is object-based.
FuJ uses JScheme for basic Scheme functionality in Java. FuJ extends JScheme with the FuJ object system.
FuJ uses BCEL to generate byte code.