Is it feasible to do (serious) web development in Lisp? [closed]
It obviously is possible to write almost any kind of application in almost any programming language, especially in such a powerful one as Lisp (be it Scheme or Common Lisp). But is it practical to use it for web development? If so, what should be a good starting point? Where can be found the proper resources (tools, libraries, documentation, best practices, examples, etc.) for a project of this nature?
Solution 1:
Yes, web development is one of Common Lisp's strengths today.
-
As a web server, use Hunchentoot, formerly known as tbnl, by Dr. Edmund Weitz.
You can run it as a back-end to Apache using mod_proxy as a reverse proxy, or as a stand-alone server.
-
Various HTML generation solutions are available, from PHP-style templates to Lisp macro hacks to XSLT. Just take your pick.
HTML-TEMPLATE is one example.
-
Closure XML is available for XML parsing, serialization, XPath 1.0, XSLT 1.0. There is also Closure HTML for HTML tag soup parsing.
(Full disclosure: I'm the maintainer of Closure XML and Closure HTML.)
-
If you like, Parenscript can make your JavaScript experience lispier, but you can also write plain old JavaScript yourself, of course.
Another cool JavaScript enhancing solution in jwacs, which is written in Common Lisp and transforms JavaScript to add continuation support.
-
Web service projects might require an HTTP client in addition to a server.
Drakma is the library to use for that today.
PURI is useful for URI manipulation.
And there is more! One starting point is cliki, for example cliki.net/web.
On the web, nobody knows your server is written in Common Lisp :-)
Solution 2:
Web development in Common Lisp is both effective and fun.
Some examples:
CL-WHO allows you to write HTML without forgetting a closing tag ever again.
Weblocks lets you define forms declaratively with built-in validation:
(defview signup (:type form :caption "Sign up")
(username :satisfies #'valid-username)
(password :present-as dual-password :parse-as dual-password)
(receive-newsletter-p :present-as checkbox :parse-as predicate))
It also supports AJAX in a fully automatic manner, falling back to normal links if the browser doesn't support it.
cl-prevalence is an incredibly simple alternative to SQL.
Quite a lot of people are using these technologies lately for mission-critical applications -- with success.
Most important CL open-source projects in fact do have excellent community support.
Solution 3:
There are some web frameworks out there for web development. Have a look at:
- Weblocks (Common Lisp)
- Compojure (Clojure)
If you want well supported lisp tools then you'll need to pay for them. There just isn't a very big community around the open source tools so they don't have the same level of documentation/adoption as, say, Django on Python.
Here are some commercial lisp products:
- Lispworks
- Franz Allegro CL
Its also worth noting that Reddit was initially built in Lisp, but the authors later migrated to Python, citing a lack of well used and documented libraries. (link)
Solution 4:
I can't speak to other frameworks, but I've had very good luck using Hunchentoot for a webserver (it works fine on its own, or you can put it behind Apache). What really makes it shine (this will probably come as a shock to some) are the libraries!
- Use CL-WHO to write effortless HTML in a lisp-style syntax
- Parenscript allows you to write code that compiles to javascript
- For database connectivity use Postmodern to talk to PostgreSQL
What I really like about using CL for the web is that you can tweak it all as it is running. You always have a REPL up and running your server code, you can then connect to that REPL and change or inspect how the code is working, all without having to stop anything. I've redefined functions while the site is running, the next time the function is called, it simply picks up the new code and works.
Solution 5:
To further help dispel the myth that there are no Lisp web frameworks, here are ones that have not yet been mentioned:
- UnCommon Web
- BKNR
- Webactions for AllegroServe
Obviously a lot of people seem to think Lisp is good enough for writing a lot of web frameworks.
I don't use or endorse any web frameworks. I prefer to build web applications by combining together orthogonal tools (David Lichteblau has mentioned some good ones) using design patterns in a way that is actually appropriate to the application you are building, and that is the approach I recommend. Common Lisp provides both a wealth of such tools, and an unmatched ability to combine them.
Adam Petersen published an excellent introductory tutorial for how to start building Lisp web applications in this style last year:
http://www.adampetersen.se/articles/lispweb.htm