Forum: Ruby BiteScript 0.0.1 - a DSL for JVM bytecode

Announcement (2017-05-07): www.ruby-forum.com is now read-only since I unfortunately do not have the time to support and maintain the forum any more. Please see rubyonrails.org/community and ruby-lang.org/en/community for other Rails- und Ruby-related community platforms.
Charles Oliver N. (Guest)
on 2009-03-28 21:12
(Received via mailing list)
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
Charles Oliver N. (Guest)
on 2009-03-28 21:22
(Received via mailing list)
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.
Charles Oliver N. (Guest)
on 2009-03-28 21:43
(Received via mailing list)
And blogged, with a bit more information and links to JVM spec docs,
opcode quickref, and more examples:

http://blog.headius.com/2009/03/bitescript-001-rub...
Tony A. (Guest)
on 2009-03-29 08:28
(Received via mailing list)
On Sat, Mar 28, 2009 at 1:11 PM, Charles Oliver N. <
removed_email_address@domain.invalid> wrote:

>      push_int 0
> 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
Charles Oliver N. (Guest)
on 2009-03-29 09:28
(Received via mailing list)
Tony A. wrote:
> On Sat, Mar 28, 2009 at 1:11 PM, Charles Oliver N. <
>> 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
Radosław B. (Guest)
on 2009-03-29 15:24
(Received via mailing list)
On Sun, Mar 29, 2009 at 7:28 AM, Charles Oliver N.
<removed_email_address@domain.invalid> wrote:
> 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 == 1
        block.call(self)
      else
        instance_eval(&block)
      end
    end
  end
end

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

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

--
Pozdrawiam

Rados³aw Bu³at
http://radarek.jogger.pl - mój blog
This topic is locked and can not be replied to.