6 ms·
I'd also add that rubys confusion about what a function is is the thing that's been annoying me the most lately. You have procs, lambdas, blocks, and all with s
by jfaucett 12y ago
I'd also add that rubys confusion about what a function is is the thing that's been annoying me the most lately. You have procs, lambdas, blocks, and all with subtle differences (http://awaxman11.github.io/blog/2013/08/05/what-is-the-difference-between-a-block/ http://awaxman11.github.io/blog/2013/08/05/what-is-the-diffe...), and all I want are simple funcs as first class citizens that have consistent behavior. (TCO as a default would also be nice).
"And finally, pie in the sky, can we solve packaging apps up into distributable binaries, please? Rust and Go are making us look bad."
As a ruby programmer the lack of any reasonable - i.e. not hacky - way to build binaries is annoying. Unless you're building a server side app, you can pretty much forget using ruby because of this. Maybe that's all ruby cares about, its certainly its niche but I like ruby and would like to be able to use it for cli programs, etc. Personally, I don't want end users of my code to have to install ruby, learn about ruby gems and boot the ruby vm before having to run a cli program.
- ramius345 12y agoI know this is in the vein of hacky solutions, but I tend to use jruby for the purpose of packaging up ruby applications.
- dkarapetyan 12y agoThis is a good solution. I've used this approach as well for server daemons.
- delsalk 12y agoDo you still require the JVM installed in the same way you would the Ruby's VM?
- ramius345 12y agoJRuby's ruby VM runs on top of whatever JVM you choose. You just have to make sure you have the JVM in your path.
- evmar 12y agoWithout some difference between functions and blocks, patterns like foo.each do |x| return if x == 3 end Don't "return" out of the enclosing function.
- baddox 12y agoThat seems okay to me. JavaScript works well enough with that behavior.
- masklinn 12y agoJavascript iteration primitive isn't block-based.
- picks_at_nits 12y agoRuby iteration primitive isn’t block based, either.
- masklinn 12y agoOf course it is. `for a in b` desugars to `b#each`, not the other way around.
- picks_at_nits 12y agoHow do “while” and “until” desugar? Kernel#loop?
- chrisseaton 12y agoThose are two rare exceptions and you're right they don't desugar.
- picks_at_nits 12y agoThose are not “exceptions” to Ruby’s primitives, those are Ruby’s primitives. Things that desugar to methods aren’t primitives. The thing is, they’re rare in practice for cultural reasons.
- baddox 12y agoRuby's proc block mess really irritates me too, especially when I flip from JS back to Ruby. I just cannot understand why the notion of a block as a distinct entity needs to exist, other than some weird syntactic side effects of Ruby's paren-less method calling.
- yxhuvud 12y agoBecause it is so convenient to be able to return from the outer scope.
- baddox 12y agoI can't recall any occasional where I have done that.
- kyllo 12y agoHere's the reason, it's because of how iteration works in Ruby with "everything is an expression" semantics: http://lucumr.pocoo.org/2012/10/18/such-a-little-thing/ http://lucumr.pocoo.org/2012/10/18/such-a-little-thing/ In Ruby iteration is implemented by letting something call a block repeatedly until the end of the iteration. The interpreter provides jump points in order to implement skipping or breaking the iteration. A continue is implemented as a form of jumping to the end of the block, a break is implemented by jumping past the call to the iterator function. Without the return it would be very awkward to return something from the function.Imagine a function that returns the first even item from a list: >> def find_even iterable >> iterable.each { |x| return x if x % 2 == 0 } >> end => nil >> find_even [1, 3, 5, 6] => 6 Imagine the non-local return was not available, you would have to rewrite it like this: >> def find_even iterable >> done = false >> rv = nil >> iterable.each { |x| >> if x % 2 == 0 >> done = true >> rv = x >> break >> end >> } >> rv >> end *
- newmana 12y agoI wish Ruby had better support for functions, passing it to a method incurs a 400% performance penalty: https://www.omniref.com/ruby/2.2.0/symbols/Proc/yield#annotation=4088660&line=723 https://www.omniref.com/ruby/2.2.0/symbols/Proc/yield#annota...
- delsalk 12y agoRE binaries, compilability seems difficult due to how dynamic method calls are, but Rubymotion seems to have solved that to some extent, though it's a shame it requires a subscription to even develop on which doesnt appeal. What are the "hacky" methods currently used for packaging you mentioned? The only methods I'm aware of no longer work or still require a separate runtime.
- icebraining 12y agoProducing a self-sufficient binary doesn't have to mean compiling the code; py2exe is a good example.
- juliangregorian 12y agoFor first class citizen functions, you want lambdas. Lambdas are a type of Proc but trap the return statement. Blocks are pretty much an iteration construct. It's really not that confusing.
- MrBra 12y agoCompletely agree on the distributable binaries! You couldn't express it better. This is holding Ruby much behind of where it could be!