I couldn't be happier with the direction that Ruby 3.0 and Rails 7.0 are taking at the moment. We have businesses to run and Ruby allows just for that. It's boring, it's stable and will deliver results.
I wouldn't pick it to build the next Discord though.. One must use the right tool for the job.
I've had my own personal Advent of Code these holidays, coding a small API for a personal need. Ruby (Sinatra) took one morning to full deployment in Heroku. Then I tried Crystal (Kemal) and it took me a couple of days to figure out how to map JSON to Crystal data structures. Then I rewrote it again in Rust (Rocket). Two weeks till I figured out, well, almost everything.
My opinion: they will take dynamic typing from my dead cold hands.
Surprisingly, Crystal seems to be much leaner in runtime size than Rust, with similar performance (although the use case is so simple that even good old Ruby is fast enough).
But then again, I feel you cannot beat Ruby in terms of dev productivity.
Error management through Option values, the borrowing checker... they are cool technologies for a C-like language, but they are not palatable at the beginning (maybe they are an acquired taste like beer?). I am tempted to stretch it a little bit more and see how productive I can become writing Rust code, but also not so sure about the effort.
I think the bit about productivity may certainly be true if you have to use libraries, obviously Ruby has many more available now (maybe forever), but I certainly feel more productive in Crystal now, maybe for things other than the language itself, admittedly. For example, producing a binary makes installation a breeze, and I don't worry about which version I'm running as I point the right compiler at the code; no Bundler now, library installs are sane (at last!); and socially I find the lack of "rockstars" in the main team refreshing, I have no fear of being dissed or dismissed, it makes contributing easier.
As it is from Ruby 3.0 we have built in optional static typing and with interesting projects like Sorbet Compiler[1] we have the option to statically compile making use of that. It's still WIP I believe but it's giving ruby devs some cool options.
1. https://sorbet.org/blog/2021/07/30/open-sourcing-sorbet-comp...
That would be very nice, I agree, though I've always found the FFI interface an under-documented pain so I'd probably end up just using Crystal or using some other way to interoperate, like pipes or HTTP.
On Sorbet, I just hate the look of it. I know it's subjective (possibly that's Ruby's own fault for being so delightful to look at, I'm spoiled!) but I can't abide the syntax. Crystal's is much nicer, and has some extra sugar sprinkled on top for the moments you're most likely to be using it (like external names in method signatures[1] or providing init args) that win out for me.
Sorry about the formatting, I can't work out HN's markdown :/
# Ruby
# from the Sorbet intro
extend T::Sig
sig {params(name: String).returns(Integer)}
def main(name)
puts "Hello, #{name}!"
name.length
end
# Crystal
def main(name : String) : Int
puts "Hello, #{name}!"
name.size
end
puts main "you"
That's so much nicer to my eyes, and you don't need most of it as it will be inferred.Initialisation is nicer, too, (unless Ruby has been updated in this regard too? As I wrote, I use it much less now)
# Crystal
class A
getter name : String
def initialize(*, @name); end
end
a = A.new name: "Hacker News"
puts a.name
or without the getter and keyword arg: # Crystal
class A
getter name
def initialize(@name : String); end
end
a = A.new "Hacker News"
puts a.name
Whatever suits. # Crystal
# Example of external names
def increment(value, by)
# OK, but reads odd
value + by
end
def increment(value : Int, by amount : Int) : Int
# Better
value + amount
end
puts increment 1, 2
but those types are easily inferred so it's actually: # Crystal
def increment(value, by amount)
# Even better
value + amount
end
I could go on because now I'm comfortable with it, it looks much better. I feel the way moving from Perl and C# to Ruby felt.[1] https://crystal-lang.org/reference/1.3/syntax_and_semantics/...
Edit: formatting, of course
Btw, I took a look around your Github and found some really interesting projects (yours and others), thanks for replying!
a) they would see how far from "better ruby" is Crystal and
b) The Crystal community would be huge.
Are you accusing us both of lying? How strange.
Let's see if your accusations can hold up to Socratic questioning:
- If I haven't open sourced any Crystal projects does that mean I haven't written any?
- I have published several Ruby gems[0], when was the last commit or version bump for any of them? You're more interested that I am, tell me. I really should archive them, thanks for reminding me.
- You missed off my Gitlab, what was the last public contribution I made there? (hint[1])
- What's the last gem I created? I reckon it's this one that I didn't publish[2] because the Rack team changed a public API in such a dumb way that I'd have to rewrite it and then mucked me around with a pull request to Rack that one of the core team copy and pasted in as their own commit while arguing against the pull. Weird, but lovely people, like yourself. Meanwhile, your cookies lack security. Yes, I want to continue working within this language and ecosystem… Does the sarcasm come through in my writing?
- Why did you not check the Crystal repo?[3][4] Github has a search facility. Put my username in, and pick `commits` on the left.
- How did you miss the forks of Docopt.cr[5] and Fancyline[6]? They're right there in my public activity log. Did you not see the merges into Fancyline of my code?[7] I have more to give, just trying to find the time.
- Did you not see forks with commits such as xattr.cr[8], xdg.cr[9], and Pope.cr[10]
- You didn't see I'd provided a project[11] for Mint so it can be run easier with Docker Compose?
- Aside from that I have a whole host of changes to migrate.cr[12] still to push up. You can't know that but you might've guessed that I was at least working with that - and all the other forks of Crystal projects I have.
That is all public and not the half of the Crystal code I look at.
Should I expect an apology? If you were too cowardly to be straightforward with your accusations then I find it stretches credulity far beyond breaking that you could be big enough to provide one. We'll see, like you, I've been very wrong about people in the past.
[0] https://rubygems.org/profiles/yb66
[1] https://gitlab.com/arctic-fox/spectator/-/merge_requests/34
[2] https://gitlab.com/yb66/aes-gcm
[3] https://github.com/crystal-lang/crystal/pull/11201
[4] https://github.com/crystal-lang/crystal/blob/1.1.0/CHANGELOG...
[5] https://github.com/yb66/docopt.cr
[6] https://github.com/yb66/fancyline
[7] https://github.com/Papierkorb/fancyline/pulls?q=is%3Apr+yb66
[8] https://github.com/ettomatic/xattr/pulls
[9] https://github.com/dscottboggs/xdg.cr/pull/1
[10] https://github.com/yb66/pope.cr/commits/master
I don't think you understand how Git works, which probably explains why you missed all the repos I needed to point out to you.
> , and most your contributions are small
What have you ever contributed? Show me.
> The only thing that I wanted to say is that as soon as you start to work in a real project with Crystal you realize that it is not just a better ruby and it comes with it's own set of problems, patterns and etc.
How would you know? Please share the repo in which you found this out. What is a "real" project?
> So I don't see a point to cite Crystal as option to ruby in every thread about ruby.
You've contributed nothing of worth, not even a specific criticism of Crystal, let alone anything worth knowing about Ruby.
> That's my point.
Great point.
LOL, you forked many repositories and didn't push any code. You just proved my point. Just people without experience in Crystal comes to ruby related threads to say "Dude, use Crystal". Happy learning <3
Well, firstly that isn't true, and secondly even if it were true it's a good idea to fork repos you use. So, not only are you:
- childish ("LOL", really? This is HN)
- lying (always the sign of a strong argument)
- unable to search Github effectively
You also show bad development practices. Did you not see what happened this week with Colors.js[1]?
> You just proved my point.
Quite the opposite.
> Just people without experience in Crystal comes to ruby related threads to say "Dude, use Crystal".
Where is your repo showing your experience in Crystal? Or Ruby for that matter. Money where mouth is time, do you even have a single commit to a project in either language?
[1] https://github.com/Marak/colors.js/commit/074a0f8ed0c31c35d1...
There is nothing in the text about Crystal. Why should I talk about Crystal?
> Where is your repo showing your experience in Crystal? Or Ruby for that matter.
I don't have too. That's not about Crystal, but about ruby :)
That's not about me and my code, not either about your little unknown rubygems, but the desire from people like to you to recommend Crystal as "drop-in" replacement for ruby, which is not.. Typical "I'm vegan" comment when people are talking about barbecue.
Happy learning <3
Mendacious to the last. If you find a way to make a substantive or informed observation then do let me know, otherwise, please save it for your friends on Reddit.
now that I read "accusing us both of lying".. how could you interpret it like that? What I can see by your code, you are ruby developer trying to learn Crystal. See you in the next ruby thread ;)
I don't value your opinion in this matter, you're simply trolling now.
> See you in the next ruby thread ;)
I doubt we'll interact again.
I did try the community made plug-in for elixir, but had trouble getting the debugger to work which was a show stopper for me.
It's simply not the same due to the extreme high degree of concurrency in the beam VM
The fact that you are telling me that I don't want something, is why people some people find the Elixir community off-putting.
Literally, elixir doesn't work like that. There is a bunch of other stuff running around in the VM, even if you don't ask for it. It's like an operating system.
> is why people some people find the Elixir community off-putting
I mean ok. Note that I said "you probably". I'm just coming from a lot more experience than you have. But sure, keep giving yourself excuses to be closed minded. It really sounds like you went into the whole thing with the "let me find a reason to hate elixir" mindset, and not the "let me see what people are raving about mindset". Anyways, you're the one missing out.
And yet, it does. Here's proof that you're wrong, a screenshot of the community Elixir plugin paused on a breakpoint, all the variables inspectable/modifiable and you can even jump around the stack: https://raw.githubusercontent.com/KronicDeth/intellij-elixir...
The problem was that I could not get the plugin to work consistently, but when it did work it was great.
> I'm just coming from a lot more experience than you have... giving yourself excuses to be closed minded....Anyways, you're the one missing out.
Ah huh, I'm sure...
However... after dabbling a bit I discovered VS Code + Remote Containers Plugin (because of Docker) + ElixirLS + other minor Elixir plugins that have turned my Elixir development experience into pure bliss. I haven't used the debugger in the IDE yet but I am 99% sure it's gonna work out of the box. Happy to try and share the setup if you want to try it out.
[1]Stop designing languages. Write libraries instead:
https://jaxenter.com/stop-designing-languages-write-librarie...
Python I find equally if not more simple. Would you agree?
A couple of things I found surprising about Python was having to do the whole `re.compile` thing instead of just `//` in Ruby. Also, no one will ever convince me that a list comprehension is simpler than `map` and related functions. Also, it's hard to beat the convenience of libs that let you do `1.day.ago`.
Ruby gets complicated when people start throwing around metaprogramming where they shouldn't.
I do like Python's file == module. Python seems like it would be a good functional programming language but it goes and only allows for single line lambdas.
Again, I don't know Python very well.
This is true. Thankfully it appears that the broader Ruby community has recognized this as well, and has moved away from metaprogramming to a large extent. It's still there, but you don't see it utilized nearly as frequently as you once did.
The Ruby devs I know are overall great devs
The Python people are second-rate.
Ruby produced tons of good software as a framework base besides Rails.
Python? Eh.
Simple, yes. But when I want to write a script as fast as possible with the least amount of effort I don't want simple. I want convenient and powerful. Many things which in Python take multiple lines in Ruby are simple one liners.
There's a certain dichotomy between Ruby and Python that I also see in many other pairs of languages. One language is simple, easy to learn and easy to read (Python), but is not as powerful or convenient to write. The other language is more complex, harder to learn and harder to read (Ruby), but is more powerful and convenient to write.
It seems like most people prefer the first category, which I think is why languages like Python or Go are so popular. There's nothing wrong with that as it's a tradeoff, but I personally prefer the second category, which is the reason why I do all of my scripting in Ruby and not in Python like everybody else.
Simply put I don't really mind the extra complexity since it is essentially mostly a one time cost, so I always pick whichever tool will make me more efficient in the long run. And out of the two (Python and Ruby) that's Ruby. (With a few exceptions like, e.g. machine learning, where you don't really have a choice.)
Python: print(list(map(lambda x: x + 1, [1,2,3])))
Ruby: print [1,2,3].map {|x| x + 1}
So much more readable, easy to write, etc... Ruby keeps it consistent by making pretty much everything an object and you just call methods. Even Haskell has dot notation to chain functions since it's just so much easier to read and write...
`print([x + 1 for x in [1, 2, 3])`
I agree that the ruby approach is better in terms of consistency, but most developers will be aware of the conventions python uses.
I'm experienced in ruby, and learning python for a project. I don't think I'll ever not wince when using python's ternary;
ruby: size = (waist > 30) ? 'large' : 'small'
python: size = 'large' if (waist > 30) else 'small'
If Ruby gets a good machine learning library on par with something like Pytorch, I am sure many folks will shift to it and we might see new DSL emerge.
Are you referring to function composition?
There are other things too, like how print used to be written like a keyword not a function for some reason, and enforced indentation instead of braces or "end" keywords, all just really bugged me. It felt like somebody made YAML Turing complete...
Python is a "simpler" language with its preference for "one obvious way", and it does tend to support fewer paradigms than Ruby. Ruby is a more complex language, supporting many approaches. But if you are familiar with the various approaches, that can be "simpler" if it allows you to choose the most fitting approach for whatever problem you have at hand.
To put it another way, "simple" can mean "the language is small/has an obvious way it wants you to do things", or "simple" can mean "the language is flexible enough to be used to model your problem in the most appropriate way". Python is the first kind of simple, Ruby is the second.
IMHO Ruby is much more expressive than Python, and the stdlib is better designed and less crufty. Ruby really has one of the best stdlibs around, I think, and a lot of languages could learn a lot from it - particularly the design of `Enumerable`.
So I prefer Ruby when I have the choice. Part of that is probably just familiarity, but I've been a full time dev on both Ruby & Python projects for long stretches of time so I think I'm in a decent position to compare them. My personal preferences/taste is another aspect, of course, and there's no objective accounting for that.
The case where I often will prefer Python is if I'm scripting something that needs some degree of portability. If you pick a random Linux box it's much more likely to have some version of Python installed than Ruby, so if I'm writing something that should be easy to copy to a box and use without additional setup, I'm more likely to pick Python.
Depends which one you prefer.
Moreover, the choice of which idiom to use conveys the intent and mindset of the author.
But like any complex language, it's also possible to write very unpoetically, and like any complex language, readability is a function of familiarity with the language's syntax and idioms.
e.g. https://gist.github.com/destiny-index/2a2e7e586bb9cd6e5c3000...
Ruby has a focus on developer joy and productivity. In some cases this comes to the detriment of language simplicity, and existing features can complicate language evolution.
Surprisingly with this complexity Ruby has had a bit more success with optimized implementations than Python, such as Truffle Ruby.
Ruby is a bit more multi-paradigm than Python IMHO, and has been jokingly called a "language for connecting adults". One can monkey-patch override division to return fractions, with the person maintaining the project deciding if this is a good idea or not. This can potentially make projects with a large number of dependencies harder to debug, which interestingly seems to have created some push-back on importing lots of arbitrary dependencies.
With both Python and Ruby, you wind up having divisions between dependencies because of the poor mismatch between different paradigms - for instance, libraries built to work with Python Twisted or Ruby EventMachine for I/O, or libraries built to work generically or to integrate into say Django on Python's side or Rails on Ruby's side.
Interestingly the communities seem to have different key focus areas - Ruby has historically been very focused on testing (cucumber and selenium for instance) while Python has had a lot of focus on documentation (pydoc and sphinx). Oddly, neither really has had a noticeable literate programming push.
Ruby, on the other hand, is literally meant to delight you with its choices/options/expressiveness and I find that it absolutely delivers on that promise.
But yes outside web - data science, web crawlers etc...Python has the clear advantage.
At my previous company you could only "touch" your own service, so once there was any kind of "architecture spaghetti"... good luck fixing that across 3 ~ 4 different services... and good luck aligning 3 ~ 4 teams priorities to fix it.