Post on 15-May-2015
description
transcript
Nick Sieger@nicksieger
(RE-)INTRO
Ruby on the JVM
Best of Ruby and Java...Together!
http://www.flickr.com/photos/texascooking/5864122096/
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!