Hacker News new | past | comments | ask | show | jobs | submit login
Behind the Scenes with Chicken Scheme (atomicobject.com)
145 points by fogus on May 2, 2013 | hide | past | favorite | 22 comments



I learned lisp a few years ago originally with Paul Graham's ansi common lisp and built a few products in various common lisp systems but after a while I really fell in love with scheme. I tried out numerous scheme ecosystems and fell in love with chicken very quickly.

Since I found chicken scheme I have used it do everything I can. I have built numerous web applications using it and it always makes my happy inside; something I can't say for other ecosystems. It also works great for scripts and interfacing to system libraries.

And of course the community is amazing. Even when I was new to lisp and chicken my questions and patches were always taken seriously and responses are always kind and helpful.

As felix mentions chicken scheme is really fast. Even on websites with moderate load and very little performance profiling or caching my dynamic pages are very consistently generated in less than <20ms. If you go a bit further and give the compiler hints it gets even faster. And if it isn't fast enough yet you can embed C code straight in your lisp source files.

It is tough to beat a language and ecosystem that nearly never gets in the way, is easy for rapid prototyping, and gets great performance when you need it.

As mentioned, Henry Bakers "Cheney on the M.T.A"[1] is a great read. I have used it to implement a scheme system as well.

In summary: use chicken scheme if you want a nearly mature, production ready, rapid prototyping, statically or dynamically typed, fast, easy to use, and powerful language and ecosystem.

edit: Another really cool feature of chicken scheme is the ability to serialize continuations. It can be used to make an extremely powerful stateful web app that operates like arc and hacker news.[2] Since you can serialize the continuations you can write the state to a file and you won't lose the state when you restart the app or the server crashes.

[1] http://home.pipeline.com/~hbaker1/CheneyMTA.html

[2] http://wiki.call-cc.org/eggref/4/suspension and http://www.paulgraham.com/arcchallenge.html


So I've long wanted a good scheme for CLI programs. I've evaluated Chicken several times and passed over it every time.... but I can't remember why. Here's what I'm looking for:

1) Fast executables 2) No runtime requirement 3) Good ecosystem (for Scheme) 4) Good ffi (though I'd prefer a great ecosystem).

That's basically all I want. I also kept going back to Gambit but it fails at #3 which Chicken seems not to.

Is there a gotcha for Chicken that I'm not remembering? Like how Racket has a slow startup cost, Chicken doesn't seem to have that (from my testing). I think Gambit is probably still faster but not by much (I could be wrong here).


As far as I know chicken meets all of those requirements quite well. Chicken starts up extremely fast even for very large applications as long as you compile it.

The library ecosystem is obviously not as well developed as a major framework like rails or django but it is growing fast and covers most things you would need. A large benefit of it compiling to C and having great FFI support is that most libs don't have to be reimplemented in scheme but can just have a binding to an already mature lib.

edit: And if it doesn't have what you need the community is great at helping you get on the right track adding a new lib and gladly accepts well done patches.


Maybe You should newLISP (www.newlisp.org) give a try. I'm using it for my CLI programs (like Dropbox background syncing, web scraping). newLISP scripts can be linked to portable executables :-)

See here: http://www.newlisp.org/downloads/newlisp_manual.html#linking


The only thing I heard about (I think, don't remember that well) newLISP was a statement that the language lacks lexical scoping because the author didn't know how to implement it.

Is it true (I mean dynamic scoping)? If so, why was the choice to exclude lexical scoping made? Is it practical to write a bit larger apps/scripts in newLISP?


IIRC the author wanted simplicity was the reason invoked by the author. Newlisp has dynamic scoping and contexts (namespaces), in which you get lexical scoping, plus other features. For instance when you want to close some function over some variable, one creates a new function by expanding the free variables inside the existing function (or lambda), to their local value at runtime. Which shouldn't be too much expensive if used in a smart way, I guess. This might be a bit weird, this and the Only One Reference (ORO) memory management strategy, but Newlisp executable is very small with regards to the craptons of functions that are included in the core. I could make it on a low-end 32bits micro-controller, where few interpreters can pretend to run at acceptable speeds and/or fit (a couple MB of flash space). The context and ORO thingies may be use in conjunction to use what they call "FOOP", for functional object oriented programming. The association of both paradigms, in theory, should let users scale to larger applications, assuming they can grok it.


Dynamic scoping is true. But I've never encountered any problems in my large newLISP projects, because I'm working in small modules (newLISP calls it Context).

Like a Scheme closure a newLISP context is a lexically closed space.

See here for a short introduction to Contexts http://en.wikibooks.org/wiki/Introduction_to_newLISP/Context...


I agree with you re: Gambit. Gambit is great for small fast standalone executable where you don't need 3rd party libraries. Gambit's weakness is the lack of a large set of libraries for web apps, etc. That said, Gambit is the Scheme I have used the most in the last 10 years.


The only gotcha I could find is related with dependencies on Windows (MinGW or Cygwin) but other than that I found it very convenient and fun to use.


I've been playing around with the idea of learning a Lisp for a couple of weeks now (and dabbled with Clojure, SBCL, Chicken, Racket). But ultimately haven't had the time to really get into it. Is there something like a web framework for it?

You should do a pull request for the web framework benchmark with Chicken Scheme to see how it compares against the others :)


> Is there something like a web framework for it?

Yup. It is called 'awful'. :-) [0]

It is still more bare bones compared to something like rails or django but we are continually improving it. It is very straightforward and easy to get started with, and it is already quite powerful. You can do most things in it as easy or sometimes even easier than in more popular frameworks. You do have less web-framework-specific libraries to work with though.

edit: awful can also be done with SXML which prevents XSS attacks be default.

[0] http://wiki.call-cc.org/eggref/4/awful


As I stated already above: give newLISP (http://www.newlisp.org) a try, when You like "lisp-like" languages. There's already a web framework for it called Dragonfly (http://www.rundragonfly.com). I'm one of the developers of Dragonfly and using it for all my web applications.


Unless you're stuck in Windows, I suggest you take a look at PicoLisp, a very rich and interesting development system. The Wiki is of course written in PicoLisp: http://picolisp.com/


"But what really makes CHICKEN special is its community. A group of helpful and faithful fanatics is actively maintaining and improving it, sometimes at a frightening pace. If you need help, ask on the mailing lists or IRC channel and you get it. Always."

I can attest to this - I played around making a 3d engine in Chicken, and the IRC channel was both super helpful, and simply nice. It's wonderful to deal with smart, nice people. Interestingly, #clojure is similarly full of nice, smart people.

As for the language and tooling itself, it's also extremely nice. Binding to C libraries was simple, even for someone doing it for the firs time. The emacs integration was tight (not as tight as slime, but still nice). It just felt like a productive ecosystem.


The original title of this was correct, guys; the product is named CHICKEN. I'm not sure why the casing got altered.


Every now and then I get the urge to try Scheme in my iOS app. I google'd and found this:

https://github.com/outworlder/beamrider

Anyone using Scheme in a shipping mobile app? Does it work well in practise or are there a lot of hurdles?


Heh, way back when I wrote a 3d game in Gambit Scheme, but I'm not shipping it anymore. There are definite drawbacks, but pretty big wins too. I set up a live REPL to the phone and was able to send code straight from Emacs to it.

My original article is here: http://jlongster.com/s/jlongster-old/pages/blog/write-apps-i...

I also made a bunch of videos:

https://www.youtube.com/watch?v=Q7c0rU9Lv28 https://www.youtube.com/watch?v=Fcut5__ZrSg

There are hurdles, yes, as you will find with any "off the beaten path" technology stack. Lack of documentation, small community, etc.


Gambit will compile on iOS, and there is even a REPL app for it on iTunes: https://itunes.apple.com/us/app/gambit-repl/id434534076?mt=8...

I can't comment on how well it will integrate with your app or work in practice, though.


chicken scheme runs on both android and iOS devices. I also know of at least one company building apps with chicken scheme.

[0] https://github.com/chicken-mobile

[1] http://www.bevuta.com/


My only gripe with Chicken,is that it has support only for green threads. Otherwise it is one of the best scheme implementations you can get your hands on.


Does Chicken have immutable data structures? How about typeclasses/protocols? How about literal syntax for hash maps, sets, vectors/arrays?

I'm coming from Clojure, and I'm interested in Chicken. I really like the things mentioned above about Clojure and I am just interested in how Chicken compares when it comes to these things.


In short, no. I believe these things can be added via extensions, but the only thing from your list to be implemented this way is a persistent-hash-map [1] so far (the egg doesn’t provide for a reader syntax though, but it is definitely possible to add [2]).

[1] http://wiki.call-cc.org/eggref/4/persistent-hash-map

[2] http://wiki.call-cc.org/man/4/Unit%20library#reader-extensio...




Guidelines | FAQ | Lists | API | Security | Legal | Apply to YC | Contact

Search: