25 Mar 2017
Matthias Felleisen jested "Why are you still using CL when Scrbl/Racket is so much better :-)" ? My response was as follows:
you are right Racket is so much better in so many dimensions. I use Lisp because I just can't bear programming in a language without proper syntactic abstraction, and that is a dimension where Racket is far ahead of Common Lisp (CL), which sadly also remains far ahead of the rest of competition. Racket also has managed to grow a remarkable way to mix typed and untyped program fragments, which sets it ahead of most. But I am under the impression that there are still many dimensions in which Racket lags behind other languages and Common Lisp (CL) in particular.
- The Common Lisp Object System (CLOS) has multiple-inheritance, multi-methods, method combinations, introspection and extensibility via the MOP, generic functions that work on builtin classes, support for dynamic instance class change (change-class, update-instance-for-changed-class) and class redefinition (defclass, update-instance-for-redefined-class), a semi-decent story for combining parametric polymorphism and ad hoc polymorphism (my own lisp-interface-library), etc. Racket seems to still be playing catch-up with respect to ad hoc polymorphism, and is lacking a set of good data structure libraries that take advantage of both functional and object-oriented programming (a good target is Scala's scalaz and its rival cats).
- While the ubiquity of global side-effects in CL is very bad, the facts that all objects that matter are addressable by a path from some global namespace and that live redefinition is actively supported makes debugging and maintaining long-lived systems with in-image persistent data more doable (see again CLOS's update-instance-for-redefined-class). This is in contrast with the Racket IDE which drops live data when you recompile the code, which is fine for student exercises, but probably wrong for live systems. CL is one of the few languages that takes long-term data seriously (though not quite as seriously as Erlang).
- Libraries. CL seems to have much more libraries than Racket, and though the quality varies, these libraries seem to often have more feature coverage and more focus on production quality. From a cursory look, Racket libraries seem to often stop at "good enough for demo". An effort on curating libraries, homogeneizing namespaces, etc., could also help Racket (I consider CL rather bad in this respect, yet Racket seems worse). My recent experience with acmart, my first maintained Racket library, makes me think that writing libraries is even higher overhead in Racket than in CL, which is already mediocre.
- Speedwise, SBCL still produces code that runs noticeably faster than Racket (as long as you don't need full delimited control, which would requires a much slower CL-to-CL compiler). This difference may be reduced as Racket adopts the notoriously fast Chez Scheme as a backend (or not). Actually, the announcement of the new Racket backend really makes me eager to jump ship.
- As for startup latency, Common Lisp is also pretty good with its saved images (they start in tens of milliseconds on my laptop), making it practical to write trivial utilities for interactive use from the shell command-line with an "instantaneous" feel. Racket takes hundreds of milliseconds at startup which puts it (barely) in the "noticeable delay" category.
All these reasons, in addition to inertia (and a non-negligible code-base and mind-base), have made me stick to CL - for now. I think Racket is the future of Lisp (at least for me), I just haven't jumped ship right yet. If and when I do, I'll probably be working on some of these issues.
25 Mar 2017 10:09pm GMT
14 Mar 2017
I owe you apologies for skipping reports in the meantime. Since January I'm not withdrawing money from our fundraiser thanks to other paid work, which means we have budget for more bounties. Keep in mind, that doesn't mean any work has ceased from my side.
I'm still working on a tutorial and demo application mentioned in the paper proposal. During that bugs and incompatibilities get fixed and pull requests are accepted. When questions arise on IRC or mailing list I try to answer them.
As a reminder: we have two active bounties at the moment:
Suggestions which other issues should have a bounty on them are appreciated and welcome.
If you have any questions, doubts or suggestions - please contact me either by email (email@example.com) or on IRC (my nick is
14 Mar 2017 1:00am GMT
09 Mar 2017
My domain lisp-book.org expires in two months (on 2017-05-07). I do not intend to renew it. The material which it serves will remain available via http://nicklevine.org/lisp-book/
If anyone wishes to inherit the domain from me and put it to better use, they should get in touch.
09 Mar 2017 7:52am GMT
08 Mar 2017
There are a bunch of new videos as of yesterday.
08 Mar 2017 8:25pm GMT
07 Mar 2017
I have released new versions of nibbles (0.13) and ironclad (0.34). They are available from their respective tags in their github repositories; I have not created tarballs for them. Ironclad, in particular, has many new features; please see the NEWS files for both packages for some of the changes.
This is also an appropriate time to announce that I will no longer be maintaining nibbles, ironclad, nor any of my other Common Lisp packages. This has been the de facto state of affairs for several years now; we might as well make it official.
07 Mar 2017 12:12pm GMT
06 Mar 2017
The Quicklisp library bundle feature has been around for a while. It creates a "bundle" of libraries from Quicklisp that can be used standalone, without loading or using Quicklisp at all.
Today, I published an updated client with a new bundle feature: if :include-local-projects is true, everything in Quicklisp's ql:*local-project-directories* is copied into the bundle and made available when the bundle is loaded.
To get this update, use (ql:update-client). The new code will be loaded when Lisp is restarted.
This work was commissioned by Rigetti Computing.
If you have Quicklisp feature needs, feel free to get in touch with me!
06 Mar 2017 3:45pm GMT
02 Mar 2017
We're looking for a developer to be a part of the core team for our Clojure and ClojureScript web application. Our stack includes reactive single-page web client code and a distributed backend to handle internal computations.
You will be responsible for designing, implementing, and testing functionality in our web application, collaborating closely with other developers to improve your and other's code, and working with our UI/UX team to make it slick. Most of all, we are looking for team members that are interested in learning and knowledge sharing.
02 Mar 2017 9:01pm GMT
01 Mar 2017
I use and love the slime-selector. It's a very quick way to jump around between various SLIME buffers.
In my .emacs,
C-c s is bound to
(global-set-key "\C-cs" 'slime-selector)
Then, in any buffer, I can use
\C-c s to pop up a minibuffer selector that takes a single additional key. Here's the list of keys and what they do:
4: Select in other window ?: Selector help buffer. c: SLIME connections buffer. d: *sldb* buffer for the current connection. e: most recently visited emacs-lisp-mode buffer. i: *inferior-lisp* buffer. l: most recently visited lisp-mode buffer. n: Cycle to the next Lisp connection. p: Cycle to the previous Lisp connection. q: Abort. r: SLIME Read-Eval-Print-Loop. s: *slime-scratch* buffer. t: SLIME threads buffer. v: *slime-events* buffer.
r the most to instantly get into the repl. But I also use
l to jump to the last Lisp file I was working on, or
d to find a debugger buffer I might have buried.
It's also quite helpful with
c, to bring up a list of active Lisp connections. For Quicklisp work, I sometimes want to switch between four or five active slime connections, and
\C-c s c makes it quick and easy to choose.
01 Mar 2017 3:27pm GMT
28 Feb 2017
I'm happy to announce the release of Declt 2.1 "Jonathan Archer".
New in this release:
- Handle recent change in SBCL's
- Handle list of contacts (strings) in ASDF systems author and maintainer slots.
- Some backward-incompatible changes in the keyword arguments to the
- More hyperlinks between systems and source files.
- More robust system's packages collection (no more code walking).
- More robust handling of unavailable ASDF components.
- More robust naming of cross-references.
Find it at the usual place...
28 Feb 2017 12:00am GMT
27 Feb 2017
- agnostic-lizard - A portable code walker that makes a best effort to be correct in most cases - GPLv3+
- bit-ops - Optimized bit-vector operations - LLGPL
- cl-forest - Unofficial Common Lisp bindings to Rigetti Forest. - Apache 2.0
- cl-httpsqs - A client lib for accessing HTTPSQS written in Common Lisp - MIT
- cl-ledger - Double-entry accounting system. - BSD-3
- cl-password-store - Password management for Common Lisp (web) applications. - LLGPL
- cl-str - Modern, simple and consistent Common Lisp string manipulation library. - MIT
- cl-video - Video decoder implemented in Common Lisp - BSD
- cmu-infix - Mathematical infix notation for Common Lisp. - Custom (See LICENSE.txt)
- cserial-port - library for serial communication inspired by lispworks' serial-port - MIT
- cue-parser - A library for parsing audio CUE files - 2-clause BSD
- freebsd-sysctl - Sysctl kernel control mechanism for common lisp - 2-clause BSD
- jsonrpc - JSON-RPC 2.0 server/client implementation - BSD 2-Clause
- lifoo - a fresh take on Forth in the spirit of Common Lisp - MIT
- maiden - A modern and extensible chat bot framework. - Artistic
- named-read-macros - Make read macros more Lispy. Attach read macros to symbols. - BSD-3
- weblocks-examples - Example applications for Weblocks framework - Public Domain
Updated projects: a-cl-logger, alexandria, anaphora, architecture.service-provider, beast, binfix, bit-smasher, bt-semaphore, cepl, chirp, cl-ana, cl-autowrap, cl-charms, cl-custom-hash-table, cl-decimals, cl-emb, cl-enchant, cl-general-accumulator, cl-gss, cl-jpeg, cl-k8055, cl-mpg123, cl-online-learning, cl-opengl, cl-out123, cl-sdl2, cl-slug, cl-spidev, cl4l, clack, clml, closer-mop, clx, croatoan, dbus, deeds, dexador, djula, easy-audio, exit-hooks, f2cl, fare-scripts, fast-http, femlisp, fn, glisph, glsl-spec, grovel-locally, hu.dwim.perec, hu.dwim.presentation, hu.dwim.sdl, hu.dwim.web-server, inquisitor, json-mop, kenzo, l-system, lambda-fiddle, lass, liblmdb, lichat-protocol, lichat-serverlib, lichat-tcp-server, lichat-ws-server, lionchat, lisp-invocation, livesupport, lmdb, local-time-duration, maxpc, mcclim, moira, montezuma, more-conditions, opticl, opticl-core, parser.ini, qlot, qt-libs, rtg-math, rutils, serapeum, slime, spinneret, staple, structy-defclass, stumpwm, talcl, temporal-functions, timer-wheel, trivial-dump-core, trivial-escapes, trivial-ws, ubiquitous, varjo, websocket-driver, weft, woo, wookie, wuwei, xml.location, zlib.
To get this update, use (ql:update-dist "quicklisp").
27 Feb 2017 1:57pm GMT