C and C++ are firmly stuck in the early 80’s as far as processor design is concerned. Common Lisp never was stuck anywhere in the first place, which means it has had a hard time sticking to something in particular, as well, but at least it has the uncommon ability to let go.
Installing a bunch of packages willy-nilly resulted in this configuration problem for me: starting slime resulted in this frustrating error message: Versions differ (2014…) slime vs (2009…) swank
It asks you whether to continue. If you say ‘n’, sorry, no slime for you ! If you say ‘y’, no fancy slime for you; you have to be content with the Comint buffer mode
If you want to fix this, you’re going to have to fix a possible mismatch somewhere.
In my case, I ran locate swank-loader.lisp and found two instances: one under /usr/share/common-lisp/... and the other under /usr/share/emacs24/site-lisp/..., you will probably have different paths but similarly conflicting.
Running dpkg -S on the first, I found it came from the cl-swank package, so I uninstalled it.
Now, slime refused to start because it was trying to load the missing swank-loader.lisp file.
Luckily, this was simply a matter of running M-x customize-variable swank-backend and set it to the remaining path (e.g. in my case, "/usr/share/emacs24/site-lisp/google/slime/swank-loader.lisp")
I created a million instances of each (the structurespoint, and the classpoint), with randomized members, and the former took about 50 milliseconds, while the latter took about 100 milliseconds. Without obsessing over absolute numbers (this is a reasonable recent linux box), I believe the takeaway is that you should avoid used heavy CLOS until you really need to.
CL-USER> (defstruct spoint xp yp)
(dotimes (i 1000000)
(make-spoint :xp (random 1000000) :yp (random 1000000))))
0.054 seconds of real time
0.050000 seconds of total run time (0.050000 user, 0.000000 system)
172,978,648 processor cycles
31,981,568 bytes consed
CL-USER> (defclass point () ((xp :initarg :xp) (yp :initarg :yp)))
(dotimes (i 1000000)
(make-instance 'point :xp (random 1000000) :yp (random 1000000))))
0.102 seconds of real time
0.100000 seconds of total run time (0.100000 user, 0.000000 system)
[ Run times consist of 0.020 seconds GC time, and 0.080 seconds non-GC time. ]
16 lambdas converted
324,534,044 processor cycles
64,606,960 bytes consed
Update: These figures are from SBCL, but I tried the same on AllegroCL and got identical results.
Of course the other takeaway is that everything is really really fast.
I suppose it’s worth learning anyway, it seems to give a very precise control over compilation, has a bunch of libraries and is very well documented. Also, an email to email@example.com, which turned out to be a very silly question, was answered promptly. One day, I’m sure I will buy the Professional version!
However, I can’t always use this as an experimental Common Lisp platform. Today I wanted to try out Genworks, but when I tried to load it, I saw
An explicit gc call caused tenuring and a need for 786432 more bytes of heap.
This request cannot be satisfied because you have hit the Allegro CL Free Express heap limit.
The Student Edition has an unlimited heap.
For more information on the Student Edition, see http://www.franz.com/downloads/student.lhtml.
For an evaluation of our Enterprise or Professional Editions please contact us at firstname.lastname@example.org or (510) 452-2000.
[condition type: STORAGE-CONDITION]
I don’t want to pretend to be a student, so … back to SBCL!
Dr. Jans Aasman, CEO of Franz stated, “Some people have asked, ‘Why not do this on a distributed cloud system with Hadoop?’ The quick answer: NoSQL databases like Hadoop and Cassandra fail on joins. Big Enterprise, big web companies and big government intelligence organizations are all looking into big data to work with massive amounts of semi-unstructured data. They are finding that NoSQL databases are wonderful if one needs access to a single object in an ocean of billions of objects, however, they also find that the current NoSQL databases fall short if you need to run graph database operations that require many complicated joins.”
Why would you want to do this? (You probably don’t :P)
In my case, I have a similar setup on a Linux box, and I like consistency, so …
Get w3m. I used MacPorts, you can use brew, it’s really up to you. If you’re using the former, run sudo port install w3m (assuming, of course, that you’ve installed MacPorts).
Get emacs-w3m: Run M-x package-install w3m (or select it from M-x list-packages)
Unfortunately, Emacs doesn’t seem to be very good with dependencies, so before installing w3m you’ll also have to manually install mew (I found this in the package repository) and apel (which I had to install the “old-fashioned” way — get this tarball, then run make and sudo make install … though if you find a better way please let me know!)
Now you can run M-x w3m, and you should see something like this (after navigating to google.com:
Here are a few keyboard shortcuts to get you started:
C-t T => Open a new session g => Open URL C-c C-s => Browse open sessions C-c C-c => Submit form Tab => Next link
You can navigate either using C-p, C-n, C-a, C-e or else (vim-style) using j, k, l, h.