lightning talk
RubyJS alpha www.rubyjs.org twi5er.com/hasclass
View Slide
50 slides in 5 minutes
A port of Ruby core-‐lib to JS • String, Regexp, MatchData • Array, Enumerable, Enumerator • Numeric (Integer/Fixnum, Float) • Range • Time, Hash coming soon
JS Methods Array jjjjjjjjjjjjjEnumerableFixnumFloat jjjjIntegerKernelMatchdataNumericRangeRegexp jjString jjjjjjjjjjjjj
RubyJS Methods Array jjjjjjjjjjjjj.............................................................Enumerable ..............................................Fixnum ...........................Float jjjj..............................Integer ....................Kernel ...Matchdata .....................Numeric .......................Range ......................Regexp jj......................String jjjjjjjjjjjjj...........................................................
Compliant to Ruby No surprises.. Rubinius Rubyspecs ported to JS
str = "a"
str = R("a”) #=> R.String
str = R("a") str.capitalize() #=> R.String #=> A
str = R("a") str.capitalize() .upto('C') #=> R.Enumerator
str = R("a") str.capitalize() .upto('C’) .each_cons(2, function (a,b) { R.puts("#{a} to the #{b}")}) # A to the B # B to the C
str = R("a") str.capitalize() .upto('C’) .to_a() #=> R.Array #=> [A, B, C]
str = R("a") str.capitalize() .upto('C’).to_a().join(', ') #=> R.String#=> ’A, B, C'
str = R("a") str.capitalize() .upto('C’).to_a().join(', ').ljust(10, ‘-’) #=> R.String#=> ’A, B, C---'
str = R("a") str.capitalize() .upto('C’).to_a().join(', ').ljust(10, ‘-’) .to_native(); #=> string #=> ’A, B, C---'
RubyJS objects are wrappers Around naMve JS objects
Wrapper class RubyJS.Fixnum@include RubyJS.Comparable constructor: (__native__) ->@__native__ = __native__; #=> new R.Fixnum(2)
Wrapper class RubyJS.Fixnum@include RubyJS.Comparable constructor: (@__native__) ->odd: -> @__native__ % 2 != 0
Wrapper class RubyJS.Fixnum@include RubyJS.Comparable constructor: (@__native__) ->odd: -> @__native__ % 2 != 0 next: -> new R.Fixnum(@__native__ + 1)
PorMng Ruby Code to JS
Ruby arr = %w(looks feels acts) arr.map {|w| w.capitalize } .join(", ") .concat(" like Ruby") .center(35, '-')'---Looks, Feels, Acts like Ruby---’
RubyJS arr = R.w('looks feels acts')
RubyJS arr = R.w('looks feels acts') arr.map {|w| w.capitalize }
RubyJS arr = R.w('looks feels acts') arr.map((w) -> w.capitalize() )
RubyJS arr = R.w('looks feels acts') arr.map((w) -> w.capitalize() ) .join(", ") .concat(" like Ruby") .center(35, '-') '---Looks, Feels, Acts like Ruby---’
Ruby arr = %w(looks feels acts) arr.map {|w| w.capitalize } .join(", ") .concat(" like Ruby") .center(35, '-’) '---Looks, Feels, Acts like Ruby---’
Symbol#to_proc arr = R.w('looks feels acts') arr.map( R.proc('capitalize’) ).join(", ") .concat(" like Ruby") .center(35, '-')
Symbol#to_proc arr = R.w('looks feels acts') arr.map( R.proc(’ljust’, 35) ).join(", ") .concat(" like Ruby") .center(35, '-')
But I can do with library x, y ,z
arr = ['looks', 'feels', 'acts']; str = _.map(arr, (w) -> S(w).capitalize().s; ).join(', ') str += ' like Ruby’; S(str).pad(15, '-');
Benefits
One dependency
One dependency <br/> <br/>
One API _.map([], (w) -> ) _.chain(arr).(...).value() S("foo").capitalize().s moment().format('L')
One API R( [1] ).map().to_native() R( [2] ).map().reject().to_native() R("foo").capitalize().to_native() R(new Date(…)).strftime(“%y-%m-%d”)
One chain arr = ['looks', 'feels', 'acts'] str = _.map(arr, (w) ->S(w).capitalize().s).join(', ’) str += " not like Ruby” S(str).pad(str, 35, '-').s
One chain arr = R.w('looks feels acts') arr.map((w) -> w.capitalize() ) .join(", ") .concat(" like Ruby") .center(35, '-')
One documentaMon
20 kbytes minified and gzipped
It scales
Dual-‐license • AGPL • Commercial license
Booh
Should I open source it?
DO IT
RubyJS is now MIT License
Happy hacking
Roadmap • Move from CoffeeScript to JavaScript • RubyJS corelib – Time, Hash, Date • RubyJS corelib-‐lite – remove some rubyisms – simplify
RubyJS.org twi5er.com/hasclass