There aren't as many libraries available compared to more popular languages, but I haven't yet had too much trouble getting things accomplished. For the above-mentioned languages we're using, I'd put the useful library situation at: Racket-> Haskell-> Clojure in order of least to greatest.
Depending on what you need it to interoperate with, it's totally usable in production environments as it stands.
Also, that's not a listing of the total number of libraries; it's ranked based on the number of useful ones (where "useful" is a completely subjective term that relates to how often I've looked to see if a library exists that does what I want).
Racket actually has more overall libraries than you'd expect considering its popularity, but I've found that many of them are old, no longer updated, scheme libraries (from the days before Racket rebranded from Dr. Scheme). That certainly doesn't make them useless, but I'm reticent to mix scheme-style code into my project.
I'm least familiar with Clojure (I've only been deploying it for the past two weeks or so), so I'm sure my opinion will change, but right now it feels like a slightly less good Racket with a philosophy I find agreeable and more practical libraries (plus Java interop).
Which libraries are you referring to? Libraries distributed with Racket, or libraries on Planet (or somewhere else on the internet)?
And any sense of which libraries in particular you notice being missing?
It looks like the new Planet that you guys just shipped doesn't have all the legacy mzscheme packages that used to seem to be the majority of packages. I don't know if that was intentional, but if not, I think that it's a nice tangential benefit.
I just remember every time I'd search for something on Planet, most of the results I'd get back were for old scheme libraries.
I know it's annoying as a developer to hear a vague criticism like "there's less useful libraries" without being able to provide a list of concrete items; but I'm going to annoy you by not being able to come up with anything specific right now. Sorry ;)
I will say though, I think Marketplace looks really neat, and I'm looking forward to testing it out for some things internally.
If you do come up with something specific, just holler.
I'm glad you're excited about Marketplace -- Tony's done some really great stuff with that.
Finally, if you're able to share more privately about what your company is doing with Racket, I know we'd be quite interested.
While I could probably do everything in one language, I'm not sold on the idea that that's actually a good idea (aside from developer convenience, which considering I'm the only developer I don't rate very highly). I also don't feel qualified enough as a language person to really hold defensible opinions about their relative strengths and weaknesses yet.
For example, part of the system is a network service that runs deployed on servers in our environment. All that code is Haskell. I didn't want to have to deploy and manage an interpreter or JVM on those systems, and I don't trust myself to write C that I feel confident deploying in production. Haskell seemed like a good win there (other folks might use Go, or whatever). It turned out to be really easy to write a network server in Haskell that receives the messages that the service needs to receive. Also, it was the first time I used a language that had good (or really, any) pattern matching, and I'm sold on it.
The "business" logic of the system is all currently in Racket. It could certainly have been written in Haskell, but I'm still getting up to speed in it, whereas I was able to get pretty minimal functionality up and running with Racket very easily.
Right now only the web interface is Clojure. I briefly considered using Yesod for the web piece, but it seemed really complicated. And although Racket has a nice web server, it requires buying into the "continuations" style that they advocate (or rolling your own web libraries, which seemed like a bad idea for this project).
I think the continuation-based approach for web servers is certainly valid, and maybe even technically better, but they're swimming against the tide with that approach, and as web programming is so far my least favorite part of building this system, I wasn't willing to buy into that enterprise.
Thankfully, I was able to get a Clojure web app up and running very quickly (basically just Ring and Compojure).
The system is designed where there's pretty hard boundaries between all the parts, so by the time all is said and done, it might all be written in the same language; but that's not necessarily a design-goal. I figure different languages seem to have different strengths, and there's not really a good reason for me to try and shoehorn everything into one.
Have you had the opportunity to try out the GHC 7.8 release candidate yet? For network io work loads the new io manager has some great scalability. I'm actually planning on writing some distributed systems tooling in Haskell once I get my first release of numerical Haskell out, which is soon!
Happy hacking and best of luck on the business side
When I originally looked at using Yesod, it seemed fairly complicated for what I needed (which is basically just the crud-iest of crud apps). I'd only been using Haskell for a couple of months, and I'd never done any web programming; so I figured I should try to use something that wouldn't require quite so much "stuff".
I finally decided to try out Clojure because I'm planning on using Datomic for the main datastore (because it looks like I can have it backed by Cassandra, which lets me store all of our data in an HDFS cluster.) and the "Web Programming with Clojure" book just came out. I figured I could probably figure out a very basic database-driven view web app just by going through the book. That turned out to be true, actually, and it wasn't that hard to get my app up and running.
What dawned on me going through the book was that what seemed complicated to me really wasn't a function of the language, but the way almost all mvc web libraries seem to be laid out; and that actually once I understood how they worked, I could probably implement the same thing very similarly in almost any language that has a similar library.
So I might eventually look into making a REST api using Snap to handle the requests, and sort of encapsulating all input and output in the system with Haskell.
sigh solving the same problems over and over and over
inetd, xinetd, djb's tcpserver, probably others and heck, even systemd have all offered well tested and hardened solutions this this problem.
Every generation rewrites Unix badly
I don't know whether m0nastic is doing that, but I don't think writing a program in Haskell precludes the use of inetd, etc.
Although I might suggest that inetd is an bit anachronistic.
Here's DJB's take - http://cr.yp.to/ucspi-tcp.html
" Many sites are replacing inetd with tcpserver, for several reasons:
* inetd is unreliable under high loads. It cuts off service for 10 minutes if it receives ``too many'' connections in 1 minute.
* inetd does not provide effective resource management. It will happily use up all your memory if you are running a popular service.
* inetd has trouble with sudden bursts of activity. Its listen() backlog is typically only 5 or 10 and cannot be raised.
"
Personally I use tcpserver. I have an SMTP server I wrote in awk - http://www.proweb.co.uk/~matt/awk/smtpd.awk I ran this as the main SMTP server for production web site for about 5 years.
and a web server in rc shell script http://www.proweb.co.uk/~matt/rc/webserver.rc
They don't have to know anything about being network programs.
I've inspired myself to resurrect using this instead of Postfix for incoming mail. See if I can get it hooked up with spamassassin.
Its built-in image support is much better than anything I've seen in any other language, so I've used it a couple times for writing simulations that need a histogram. It's also much better than Clojure for things that require low memory usage or fast startup time.
http://docs.racket-lang.org/web-server/
I also recently discovered a web sockets library, but am not good enough at coding Racket to use either yet. I am definitely planning on it.
(And seeing you're handle, just want to thank you for your contributions to Clojure; I can only image what would happen if you got more involved in the Racket community).
I mentioned people complaining because, well, people complain when you get timeouts with your continuation. That is why when you click More at the bottom of the page, you see a URL that looks like this:
https://news.ycombinator.com/x?fnid=N5yDJXCzVXXV8kqTp57A7D
I believe this is calling into the continuation space. I could be wrong, however. I am just starting my Scheme journey.
Nonetheless, sometimes continuations do not work well on HN and I see people mention that. It is different way to handle state (Racket calls their Racket server stateless for this reason). I just wanted to point that, even if people will pass judgement from their experience here, it is a cool concept nonetheless.
Also, more experienced people should correct my analysis of HN if I am wrong.
[1] - https://github.com/cocaine/ [2] - http://api.yandex.ru/cocaine/