jruby @ boulder ruby

Post on 15-May-2015

644 Views

Category:

Technology

2 Downloads

Preview:

Click to see full reader

DESCRIPTION

Re-introduction to JRuby as presented to the Boulder Ruby group on October 30, 2012.

TRANSCRIPT

Nick Sieger@nicksieger

(RE-)INTRO

Ruby on the JVM

Best of Ruby and Java...Together!

COMPATIBILITY

runs nearly all pure ruby code

runs 92% of rubyspec suite

runs ~30% of 1.9 test suite

(even more with 1.8 mode)

INSTALL gem install jruby-lint

http://jruby.org/download

rvm install jruby

$ jrlint

drawbacks

startup time

memory footprint

native code

no Kernel#fork

PERFORMANCE

GC.pauses = “no thanks”

class Simple  attr_accessor :nextend

top = Simple.new

puts Benchmark.measure {  outer = 10  total = 100000  per = 100

  outer.times do    total.times do      per.times { Simple.new }      s = Simple.new      top.next = s      top = s    end  end}

0

2000

4000

6000

8000

GC count

Ruby 1.9.3 JRuby

1

10

100

1000

10000

GC count

Ruby 1.9.3 JRuby

0

3

6

9

12

15

GC time %

Ruby 1.9.3 JRuby

0ms

75ms

150ms

225ms

300ms

188KB/29MB 27MB/127MB 199MB/238MB

Time per GC versus heap usage

Heap usage (MRI/JRuby)

Ruby 2.0.0 JRuby

REAL THREADS

Ruby 1.9unthreaded

Ruby 1.9threaded

JRubyunthreaded

JRubythreaded

sidekiq.orgWhat if 1 Sidekiq process could do the work of 20 Resque or DelayedJob processes?

COMPILER

Native code

JVM bytecode

Ruby application code

JVM

JRuby

Ruby code

JVM

JRuby

Ruby code

JRuby

Ruby code

JVM

JRuby

Ruby code

JRuby

Ruby code

Ruby code

Full interpretation JRuby compiler HotSpot compiler

Time

Key

BENCH MARKS

0

1

2

3

4

5

Red-Black Tree

ruby 1.9.3p286

jruby 1.7.0 java 1.6.0_29

jruby 1.7.0 java 1.7.0_09

jruby 1.7.0 java 1.7.0_09-b05 +indy

0

1.25

2.5

3.75

5

base64 richards neural mandelbrot redblack

4.324.226

3.663.44

2.658

1.5651.8061.914

1.5381.346

Times Faster than Ruby 1.9.3

JRuby/Java 6 JRuby/Java 7+indy

Java 7

Get JDK 7(OSX too!)

java.oracle.com

INVOKEDYNAMIC

experthuman.com/programming-with-

nothingTom Stuart@tomstuart

# lambda-> x {}

# callp[x]

FIZZ BUZZ

(1..100).each do |n| if (n % 15).zero? puts 'FizzBuzz' elsif (n % 3).zero? puts 'Fizz' elsif (n % 5).zero? puts 'Buzz' else puts n.to_s endend

fizzbuzz = -> k { -> f { -> f { -> x { f[-> y { x[x][y] }] }[-> x {f[-> y { x[x][y] }] }] }[-> f { -> l { -> x { -> g { -> b { b }[-> p {p[-> x { -> y { x } } ] }[l]][x][-> y { g[f[-> l { -> p { p[-> x { ->y { y } } ] }[-> p { p[-> x { -> y { y } } ] }[l]] }[l]][x][g]][-> l {-> p { p[-> x { -> y { x } } ] }[-> p { p[-> x { -> y { y } } ] }[l]]}[l]][y] }] } } } }][k][-> x { -> y { -> f { f[x][y] } } }[-> x { -> y{ x } }][-> x { -> y { x } }]][-> l { -> x { -> l { -> x { -> x { -> y{ -> f { f[x][y] } } }[-> x { -> y { y } }][-> x { -> y { -> f {f[x][y] } } }[x][l]] } }[l][f[x]] } }] } }[-> f { -> x { f[-> y {x[x][y] }] }[-> x { f[-> y { x[x][y] }] }] }[-> f { -> m { -> n { -> b{ b }[-> m { -> n { -> n { n[-> x { -> x { -> y { y } } }][-> x { -> y{ x } }] }[-> m { -> n { n[-> n { -> f { -> x { n[-> g { -> h {h[g[f]] } }][-> y { x }][-> y { y }] } } }][m] } }[m][n]] }}[m][n]][-> x { -> l { -> x { -> x { -> y { -> f { f[x][y] } } }[-> x{ -> y { y } }][-> x { -> y { -> f { f[x][y] } } }[x][l]] } }[f[-> n {-> p { -> x { p[n[p][x]] } } }[m]][n]][m][x] }][-> x { -> y { -> f {f[x][y] } } }[-> x { -> y { x } }][-> x { -> y { x } }]] } } }][-> p {-> x { p[x] } }][-> p { -> x {p[p[p[p[p[p[p[p[p[p[p[p[p[p[p[p[p[p[p[p[p[p[p[p[p[p[p[p[p[p[p[p[p[p[p[p[p[p[p[p[p[p[p[p[p[p[p[p[p[p[p[p[p[p[p[p[p[p[p[p[p[p[p[p[p[p[p[p[p[p[p[p[p[p[p[p[p[p[p[p[p[p[p[p[p[p[p[p[p[p[p[p[p[p[p[p[p[p[p[p[x]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]} }]][-> n { -> b {b }[-> n { n[-> x { -> x { -> y { y } } }][-> x { -> y { x } }] }[-> f{ -> x { f[-> y { x[x][y] }] }[-> x { f[-> y { x[x][y] }] }] }[-> f {-> m { -> n { -> b { b }[-> m { -> n { -> n { n[-> x { -> x { -> y { y} } }][-> x { -> y { x } }] }[-> m { -> n { n[-> n { -> f { -> x {n[-> g { -> h { h[g[f]] } }][-> y { x }][-> y { y }] } } }][m] }}[m][n]] } }[n][m]][-> x { f[-> m { -> n { n[-> n { -> f { -> x { n[->g { -> h { h[g[f]] } }][-> y { x }][-> y { y }] } } }][m] }}[m][n]][n][x] } ][m] } } }][n][-> p { -> x {p[p[p[p[p[p[p[p[p[p[p[p[p[p[p[x]]]]]]]]]]]]]]] } }]]][-> l { -> x { ->x { -> y { -> f { f[x][y] } } }[-> x { -> y { y } }][-> x { -> y { ->f { f[x][y] } } }[x][l]] } }[-> l { -> x { -> x { -> y { -> f {f[x][y] } } }[-> x { -> y { y } }][-> x { -> y { -> f { f[x][y] } }}[x][l]] } }[-> l { -> x { -> x { -> y { -> f { f[x][y] } } }[-> x {-> y { y } }][-> x { -> y { -> f { f[x][y] } } }[x][l]] } }[-> l { ->x { -> x { -> y { -> f { f[x][y] } } }[-> x { -> y { y } }][-> x { ->y { -> f { f[x][y] } } }[x][l]] } }[-> l { -> x { -> x { -> y { -> f {f[x][y] } } }[-> x { -> y { y } }][-> x { -> y { -> f { f[x][y] } }}[x][l]] } }[-> l { -> x { -> x { -> y { -> f { f[x][y] } } }[-> x {-> y { y } }][-> x { -> y { -> f { f[x][y] } } }[x][l]] } }[-> l { ->x { -> x { -> y { -> f { f[x][y] } } }[-> x { -> y { y } }][-> x { ->y { -> f { f[x][y] } } }[x][l]] } }[-> l { -> x { -> x { -> y { -> f {f[x][y] } } }[-> x { -> y { y } }][-> x { -> y { -> f { f[x][y] } }}[x][l]] } }[-> x { -> y { -> f { f[x][y] } } }[-> x { -> y { x }}][-> x { -> y { x } }]][-> n { -> p { -> x { p[n[p][x]] } } }[-> n {-> p { -> x { p[n[p][x]] } } }[-> n { -> p { -> x { p[n[p][x]] } }}[-> n { -> p { -> x { p[n[p][x]] } } }[-> m { -> n { n[-> m { -> n {n[-> n { -> p { -> x { p[n[p][x]] } } }][m] } }[m]][-> p { -> x { x }}] } }[-> p { -> x { p[p[x]] } }][-> p { -> x { p[p[p[p[p[x]]]]] }}]]]]]]][-> n { -> p { -> x { p[n[p][x]] } } }[-> n { -> p { -> x {p[n[p][x]] } } }[-> n { -> p { -> x { p[n[p][x]] } } }[-> n { -> p {-> x { p[n[p][x]] } } }[-> m { -> n { n[-> m { -> n { n[-> n { -> p {-> x { p[n[p][x]] } } }][m] } }[m]][-> p { -> x { x } }] } }[-> p { ->x { p[p[x]] } }][-> p { -> x { p[p[p[p[p[x]]]]] } }]]]]]]][-> n { -> p{ -> x { p[n[p][x]] } } }[-> n { -> p { -> x { p[n[p][x]] } } }[-> n {-> p { -> x { p[n[p][x]] } } }[-> m { -> n { n[-> m { -> n { n[-> n {-> p { -> x { p[n[p][x]] } } }][m] } }[m]][-> p { -> x { x } }] } }[->p { -> x { p[p[x]] } }][-> p { -> x { p[p[p[p[p[x]]]]] } }]]]]]][-> m{ -> n { n[-> m { -> n { n[-> n { -> p { -> x { p[n[p][x]] } } }][m] }}[m]][-> p { -> x { x } }] } }[-> p { -> x { p[p[x]] } }][-> p { -> x{ p[p[p[p[p[x]]]]] } }]]][-> n { -> p { -> x { p[n[p][x]] } } }[-> n {-> p { -> x { p[n[p][x]] } } }[-> n { -> p { -> x { p[n[p][x]] } }}[-> n { -> p { -> x { p[n[p][x]] } } }[-> m { -> n { n[-> m { -> n {n[-> n { -> p { -> x { p[n[p][x]] } } }][m] } }[m]][-> p { -> x { x }}] } }[-> p { -> x { p[p[x]] } }][-> p { -> x { p[p[p[p[p[x]]]]] }}]]]]]]][-> n { -> p { -> x { p[n[p][x]] } } }[-> n { -> p { -> x {p[n[p][x]] } } }[-> n { -> p { -> x { p[n[p][x]] } } }[-> n { -> p {-> x { p[n[p][x]] } } }[-> m { -> n { n[-> m { -> n { n[-> n { -> p {-> x { p[n[p][x]] } } }][m] } }[m]][-> p { -> x { x } }] } }[-> p { ->x { p[p[x]] } }][-> p { -> x { p[p[p[p[p[x]]]]] } }]]]]]]][-> n { -> p{ -> x { p[n[p][x]] } } }[-> n { -> p { -> x { p[n[p][x]] } } }[-> m {-> n { n[-> m { -> n { n[-> n { -> p { -> x { p[n[p][x]] } } }][m] }}[m]][-> p { -> x { x } }] } }[-> p { -> x { p[p[x]] } }][-> p { -> x{ p[p[p[p[p[x]]]]] } }]]]]][-> n { -> p { -> x { p[n[p][x]] } } }[-> m{ -> n { n[-> m { -> n { n[-> n { -> p { -> x { p[n[p][x]] } } }][m] }}[m]][-> p { -> x { x } }] } }[-> p { -> x { p[p[x]] } }][-> p { -> x{ p[p[p[p[p[x]]]]] } }]]]][-> b { b }[-> n { n[-> x { -> x { -> y { y} } }][-> x { -> y { x } }] }[-> f { -> x { f[-> y { x[x][y] }] }[-> x{ f[-> y { x[x][y] }] }] }[-> f { -> m { -> n { -> b { b }[-> m { -> n{ -> n { n[-> x { -> x { -> y { y } } }][-> x { -> y { x } }] }[-> m {-> n { n[-> n { -> f { -> x { n[-> g { -> h { h[g[f]] } }][-> y { x}][-> y { y }] } } }][m] } }[m][n]] } }[n][m]][-> x { f[-> m { -> n {n[-> n { -> f { -> x { n[-> g { -> h { h[g[f]] } }][-> y { x }][-> y {y }] } } }][m] } }[m][n]][n][x] }][m] } } }][n][-> p { -> x {p[p[p[x]]] } }]]][-> l { -> x { -> x { -> y { -> f { f[x][y] } } }[->x { -> y { y } }][-> x { -> y { -> f { f[x][y] } } }[x][l]] } }[-> l {-> x { -> x { -> y { -> f { f[x][y] } } }[-> x { -> y { y } }][-> x {-> y { -> f { f[x][y] } } }[x][l]] } }[-> l { -> x { -> x { -> y { ->f { f[x][y] } } }[-> x { -> y { y } }][-> x { -> y { -> f { f[x][y] }} }[x][l]] } }[-> l { -> x { -> x { -> y { -> f { f[x][y] } } }[-> x {-> y { y } }][-> x { -> y { -> f { f[x][y] } } }[x][l]] } }[-> x { ->y { -> f { f[x][y] } } }[-> x { -> y { x } }][-> x { -> y { x } }]][->n { -> p { -> x { p[n[p][x]] } } }[-> n { -> p { -> x { p[n[p][x]] } }}[-> n { -> p { -> x { p[n[p][x]] } } }[-> n { -> p { -> x {p[n[p][x]] } } }[-> m { -> n { n[-> m { -> n { n[-> n { -> p { -> x {p[n[p][x]] } } }][m] } }[m]][-> p { -> x { x } }] } }[-> p { -> x {p[p[x]] } }][-> p { -> x { p[p[p[p[p[x]]]]] } }]]]]]]][-> n { -> p {-> x { p[n[p][x]] } } }[-> n { -> p { -> x { p[n[p][x]] } } }[-> n {-> p { -> x { p[n[p][x]] } } }[-> n { -> p { -> x { p[n[p][x]] } }}[-> m { -> n { n[-> m { -> n { n[-> n { -> p { -> x { p[n[p][x]] } }}][m] } }[m]][-> p { -> x { x } }] } }[-> p { -> x { p[p[x]] } }][-> p{ -> x { p[p[p[p[p[x]]]]] } }]]]]]]][-> n { -> p { -> x { p[n[p][x]] }} }[-> n { -> p { -> x { p[n[p][x]] } } }[-> m { -> n { n[-> m { -> n{ n[-> n { -> p { -> x { p[n[p][x]] } } }][m] } }[m]][-> p { -> x { x} }] } }[-> p { -> x { p[p[x]] } }][-> p { -> x { p[p[p[p[p[x]]]]] }}]]]]][-> n { -> p { -> x { p[n[p][x]] } } }[-> m { -> n { n[-> m { ->n { n[-> n { -> p { -> x { p[n[p][x]] } } }][m] } }[m]][-> p { -> x {x } }] } }[-> p { -> x { p[p[x]] } }][-> p { -> x { p[p[p[p[p[x]]]]] }}]]]][-> b { b }[-> n { n[-> x { -> x { -> y { y } } }][-> x { -> y {x } }] }[-> f { -> x { f[-> y { x[x][y] }] }[-> x { f[-> y { x[x][y]}] }] }[-> f { -> m { -> n { -> b { b }[-> m { -> n { -> n { n[-> x {-> x { -> y { y } } }][-> x { -> y { x } }] }[-> m { -> n { n[-> n {-> f { -> x { n[-> g { -> h { h[g[f]] } }][-> y { x }][-> y { y }] } }}][m] } }[m][n]] } }[n][m]][-> x { f[-> m { -> n { n[-> n { -> f { ->x { n[-> g { -> h { h[g[f]] } }][-> y { x }][-> y { y }] } } }][m] }}[m][n]][n][x] }][m] } } }][n][-> p { -> x { p[p[p[p[p[x]]]]] }}]]][-> l { -> x { -> x { -> y { -> f { f[x][y] } } }[-> x { -> y { y} }][-> x { -> y { -> f { f[x][y] } } }[x][l]] } }[-> l { -> x { -> x{ -> y { -> f { f[x][y] } } }[-> x { -> y { y } }][-> x { -> y { -> f{ f[x][y] } } }[x][l]] } }[-> l { -> x { -> x { -> y { -> f { f[x][y]} } }[-> x { -> y { y } }][-> x { -> y { -> f { f[x][y] } } }[x][l]] }}[-> l { -> x { -> x { -> y { -> f { f[x][y] } } }[-> x { -> y { y }}][-> x { -> y { -> f { f[x][y] } } }[x][l]] } }[-> x { -> y { -> f {f[x][y] } } }[-> x { -> y { x } }][-> x { -> y { x } }]][-> n { -> p {-> x { p[n[p][x]] } } }[-> n { -> p { -> x { p[n[p][x]] } } }[-> n {-> p { -> x { p[n[p][x]] } } }[-> n { -> p { -> x { p[n[p][x]] } }}[-> m { -> n { n[-> m { -> n { n[-> n { -> p { -> x { p[n[p][x]] } }}][m] } }[m]][-> p { -> x { x } }] } }[-> p { -> x { p[p[x]] } }][-> p{ -> x { p[p[p[p[p[x]]]]] } }]]]]]]][-> n { -> p { -> x { p[n[p][x]] }} }[-> n { -> p { -> x { p[n[p][x]] } } }[-> n { -> p { -> x {p[n[p][x]] } } }[-> n { -> p { -> x { p[n[p][x]] } } }[-> m { -> n {n[-> m { -> n { n[-> n { -> p { -> x { p[n[p][x]] } } }][m] } }[m]][->p { -> x { x } }] } }[-> p { -> x { p[p[x]] } }][-> p { -> x {p[p[p[p[p[x]]]]] } }]]]]]]][-> n { -> p { -> x { p[n[p][x]] } } }[-> n{ -> p { -> x { p[n[p][x]] } } }[-> n { -> p { -> x { p[n[p][x]] } }}[-> m { -> n { n[-> m { -> n { n[-> n { -> p { -> x { p[n[p][x]] } }}][m] } }[m]][-> p { -> x { x } }] } }[-> p { -> x { p[p[x]] } }][-> p{ -> x { p[p[p[p[p[x]]]]] } }]]]]]][-> m { -> n { n[-> m { -> n { n[->n { -> p { -> x { p[n[p][x]] } } }][m] } }[m]][-> p { -> x { x } }] }}[-> p { -> x { p[p[x]] } }][-> p { -> x { p[p[p[p[p[x]]]]] } }]]][->f { -> x { f[-> y { x[x][y] }] }[-> x { f[-> y { x[x][y] }] }] }[-> f{ -> n { -> l { -> x { -> f { -> x { f[-> y { x[x][y] }] }[-> x { f[->y { x[x][y] }] }] }[-> f { -> l { -> x { -> g { -> b { b }[-> p { p[->x { -> y { x } }] }[l]][x][-> y { g[f[-> l { -> p { p[-> x { -> y { y} }] }[-> p { p[-> x { -> y { y } }] }[l]] }[l]][x][g]][-> l { -> p {p[-> x { -> y { x } }] }[-> p { p[-> x { -> y { y } }] }[l]] }[l]][y]}] } } } }][l][-> l { -> x { -> x { -> y { -> f { f[x][y] } } }[-> x {-> y { y } }][-> x { -> y { -> f { f[x][y] } } }[x][l]] } }[-> x { ->y { -> f { f[x][y] } } }[-> x { -> y { x } }][-> x { -> y { x }}]][x]][-> l { -> x { -> x { -> y { -> f { f[x][y] } } }[-> x { -> y {y } }][-> x { -> y { -> f { f[x][y] } } }[x][l]] } }] } }[-> b { b}[-> m { -> n { -> n { n[-> x { -> x { -> y { y } } }][-> x { -> y { x} }] }[-> m { -> n { n[-> n { -> f { -> x { n[-> g { -> h { h[g[f]] }}][-> y { x }][-> y { y }] } } }][m] } }[m][n]] } }[n][-> n { -> f {-> x { n[-> g { -> h { h[g[f]] } }][-> y { x }][-> y { y }] } } }[-> m{ -> n { n[-> m { -> n { n[-> n { -> p { -> x { p[n[p][x]] } } }][m] }}[m]][-> p { -> x { x } }] } }[-> p { -> x { p[p[x]] } }][-> p { -> x{ p[p[p[p[p[x]]]]] } }]]]][-> x { -> y { -> f { f[x][y] } } }[-> x {-> y { x } }][-> x { -> y { x } }]][-> x { f[-> f { -> x { f[-> y {x[x][y] }] }[-> x { f[-> y { x[x][y] }] }] }[-> f { -> m { -> n { -> b{ b }[-> m { -> n { -> n { n[-> x { -> x { -> y { y } } }][-> x { -> y{ x } }] }[-> m { -> n { n[-> n { -> f { -> x { n[-> g { -> h {h[g[f]] } }][-> y { x }][-> y { y }] } } }][m] } }[m][n]] }}[n][m]][-> x { -> n { -> p { -> x { p[n[p][x]] } } }[f[-> m { -> n {n[-> n { -> f { -> x { n[-> g { -> h { h[g[f]] } }][-> y { x }][-> y {y }] } } }][m] } }[m][n]][n]][x] }][-> p { -> x { x } }] } } }][n][->m { -> n { n[-> m { -> n { n[-> n { -> p { -> x { p[n[p][x]] } } }][m]} }[m]][-> p { -> x { x } }] } }[-> p { -> x { p[p[x]] } }][-> p { ->x { p[p[p[p[p[x]]]]] } }]]][x] }]][-> f { -> x { f[-> y { x[x][y] }]}[-> x { f[-> y { x[x][y] }] }] }[-> f { -> m { -> n { -> b { b }[-> m{ -> n { -> n { n[-> x { -> x { -> y { y } } }][-> x { -> y { x } }]}[-> m { -> n { n[-> n { -> f { -> x { n[-> g { -> h { h[g[f]] } }][->y { x }][-> y { y }] } } }][m] } }[m][n]] } }[n][m]][-> x { f[-> m {-> n { n[-> n { -> f { -> x { n[-> g { -> h { h[g[f]] } }][-> y { x}][-> y { y }] } } }][m] } }[m][n]][n][x] }][m] } } }][n][-> m { -> n{ n[-> m { -> n { n[-> n { -> p { -> x { p[n[p][x]] } } }][m] }}[m]][-> p { -> x { x } }] } }[-> p { -> x { p[p[x]] } }][-> p { -> x{ p[p[p[p[p[x]]]]] } }]]] } }][n]]]] }]

METHOD HANDLES

INVOKEDYNAMIC[bootstrapMethod]

bootstrapMethod():CallSite (once)

Call Site

MethodHandle

target

package java.lang.invoke;

public abstract class MethodHandle { public final native Object invoke(Object... args) throws Throwable;}

LAMBDAp[x]

methodHandle.invoke(x);

arrayElementGetter arrayElementSetter spreadInvoker exactInvoker invoker

explicitCastArguments permuteArguments constant identity insertArguments

dropArguments dropArguments filterArguments filterReturnValue

foldArguments guardWithTest catchException throwException

java.lang.invoke.MethodHandles

String literal

Other literals

Constant lookup

Instance variables

Method invocation

Math operations

IT’S A JVM WORLD

DRIVE JAVA FROM RUBY

jruby -S gem install flying_saucer to try this example.

require 'java'require 'rubygems'require 'flying_saucer'

java_import org.xhtmlrenderer.pdf.ITextRenderer

document = <<-HTML<html><body><h1>Hello Flying Saucer!</h1></body></html>HTML

File.open("doc.pdf", "wb") do |out| renderer = ITextRenderer.new renderer.set_document_from_string document renderer.layout renderer.create_pdf out.to_outputstreamend

system("open doc.pdf")

$ jruby saucer.rb

DECORATE JAVA OBJECTS WITH JRUBY

module java::util::Iterator include Enumerable

def each while has_next yield self.next end endend

DRIVE RUBY FROM JAVA

(org.jruby.embed)

import org.jruby.embed.ScriptingContainer;

public class EmbedJRuby { public static void main(String[] args) { ScriptingContainer container = new ScriptingContainer(); container.runScriptlet("puts 'Hello from Ruby'"); }}

(defn -main "Call JRuby!" [& args] (doto (org.jruby.embed.ScriptingContainer.) (.runScriptlet "puts 'Hello from Ruby!'")))

JRuby + Clojure

;; examples.clj(def hmap (hash-map "foo" "FOO" "bar" "BAR" "baz" "BAZ"))

(println hmap)(println (get hmap "bar"))(println (contains? hmap "foo"))

# rubyJava::clojure.main.main(["./examples.clj"])

github.com/daveray/familiar

Familiar.with do # clojure.core functions here # ‘-’ replaced with ‘_’ # e.g. hash-map => hash_mapend

Familiar.with do r = ref(nil)

begin ref_set r, 'foo' rescue puts "no transaction! #{$!}" end

dosync do ref_set r, 'foo' end p deref(r)end

j.mp/clojure-

from-jruby

FUTURE

{,bugs,wiki,ci}jruby.org

github.com/jruby

Thanks!

top related