[ANN] BiteScript 0.0.1 - a DSL for JVM bytecode

  • Thread starter Charles Oliver Nutter
  • Start date
C

Charles Oliver Nutter

BiteScript is a Ruby DSL for generating JVM bytecode and classes. It is
used by the Duby programming language and by the upcoming "compiler2"
Ruby-to-Java compiler in JRuby.

Project page: http://kenai.com/projects/jvmscript

Install: gem install bitescript

Dependencies: JRuby 1.2 or higher

Changes:

* First public release. Most features up to Java 1.4 are supported plus
Java 5 annotations.

Sample code:

require 'bitescript'

include BiteScript

fb = FileBuilder.build(__FILE__) do
public_class "SimpleLoop" do
public_static_method "main", void, string[] do
aload 0
push_int 0
aaload
label :top
dup
aprintln
goto :top
returnvoid
end
end
end

fb.generate do |filename, class_builder|
File.open(filename, 'w') do |file|
file.write(class_builder.generate)
end
end
 
C

Charles Oliver Nutter

I should have mentioned I'm open to suggestions for API/DSL
improvements, and obviously bug reports are welcome. There's mailing
lists and an issue tracker at the kenai project page.
 
T

Tony Arcieri

[Note: parts of this message were removed to make it a legal post.]

On Sat, Mar 28, 2009 at 1:11 PM, Charles Oliver Nutter <
Sample code:

require 'bitescript'

include BiteScript

fb = FileBuilder.build(__FILE__) do
public_class "SimpleLoop" do
public_static_method "main", void, string[] do
aload 0
push_int 0
aaload
label :top
dup
aprintln
goto :top
returnvoid
end
end
end

fb.generate do |filename, class_builder|
File.open(filename, 'w') do |file|
file.write(class_builder.generate)
end
end

That's some awesome use of blocks
 
C

Charles Oliver Nutter

Tony said:
fb = FileBuilder.build(__FILE__) do
public_class "SimpleLoop" do
public_static_method "main", void, string[] do
aload 0
push_int 0
...
That's some awesome use of blocks

Thanks! I know the instance_eval'ed pattern for executing blocks is
sometimes considered bad form, but it makes the code look so nice here I
figured I'd go for it. If you want to use it as a normal API, you can do
that just as easily; you just have to "start" and "stop" the method body
yourself:

fb = FileBuilder.build(__FILE__) do
cls = fb.public_class "SimpleLoop"
m = cls.public_static_method "main", void, string[]
m.start
m.aload 0
m.push_int 0
m.aaload
m.label :top
m.dup
m.aprintln
m.goto :top
m.returnvoid
m.stop

- Charlie
 
R

Rados³aw Bu³at

Thanks! I know the instance_eval'ed pattern for executing blocks is
sometimes considered bad form, but it makes the code look so nice here I
figured I'd go for it. If you want to use it as a normal API, you can do
that just as easily; you just have to "start" and "stop" the method body
yourself:

fb =3D FileBuilder.build(__FILE__) do
cls =3D fb.public_class "SimpleLoop"
m =3D cls.public_static_method "main", void, string[]
m.start
m.aload 0
m.push_int 0
m.aaload
m.label :top
m.dup
m.aprintln
m.goto :top
m.returnvoid
m.stop

Charlie, you can also use some 'trick' to allow programmers choose if
he wants instance_eval or 'normal' version:

class Foo
def initialize(*args, &block)
if block_given?
if block.arity =3D=3D 1
block.call(self)
else
instance_eval(&block)
end
end
end
end

Foo.new do |foo|
puts "self =3D #{self}"
puts "foo =3D #{foo}"
end

Foo.new do
puts "self =3D #{self}"
end

--=20
Pozdrawiam

Rados=B3aw Bu=B3at
http://radarek.jogger.pl - m=F3j blog
 

Ask a Question

Want to reply to this thread or ask your own question?

You'll need to choose a username for the site, which only take a couple of moments. After that, you can post your question and our members will help you out.

Ask a Question

Members online

Forum statistics

Threads
473,968
Messages
2,570,153
Members
46,701
Latest member
XavierQ83

Latest Threads

Top