Recent Lisping: Bootstrap Scheme in Ada and Introducing Protolith
I have been extremely busy the last couple weeks, but when I find a scrap of spare time, I have been surrounding myself with little Lisp projects.
Most recently, I wrote a little prototypical object system for CL yesterday. I have named it protolith, and here is the description I gave on GitHub:
Just for exploratory fun, I decided to see what it takes to write a prototypical object system in Lisp. Apparently its not much, I'm far from an experienced Lisper (barely fluent, if that) and I got it done in ~50 lines. A testament to Lisp's flexibility and expressiveness.
And here is a small example:
CL-USER> (load "/home/fitzgen/dev/protolith/protolith.lisp") T CL-USER> (in-package :protolith) #<PACKAGE "PROTOLITH"> PROTOLITH> (defobj account () (bal 0) (deposit (lambda (self x) (funcall self 'set 'bal (+ (funcall self 'bal) x))))) ACCOUNT PROTOLITH> (account 'bal) 0 PROTOLITH> (account 'deposit 50) 50 PROTOLITH> (account 'bal) 50 PROTOLITH> (defobj checking-account (account) (withdraw (lambda (self x) (progn (funcall self 'set 'bal (- (funcall self 'bal) x)) x)))) CHECKING-ACCOUNT PROTOLITH> (checking-account 'bal) 50 PROTOLITH> (checking-account 'withdraw 10) 10 PROTOLITH> (checking-account 'withdraw 10) 10 PROTOLITH> (checking-account 'bal) 30 PROTOLITH> (checking-account 'proto) #<CLOSURE ACCOUNT>
(Side note: For this site, I highlight syntax on the client-side with SHJS, but,
as you can see above, they don't support syntax highlighting for Lisp. I'm
thinking of moving towards writing a Pygments
Django template filter that finds <pre>
tags automatically and
highlights the contents appropriately. If anyone has any other
ideas shoot me an
email.)
The other Lisping I have been doing is writing
my boostrap scheme interpreter in
Ada. Peter Michaux finished his series, and now I am just playing catch
up. As of this moment, the printer, reader, and evaluator are complete, and it
is just a matter of writing the proper primitives and special forms for the
evaluator and I'm done. So far, I have
implemented if
, define
, and set!
,
with cond
, +
, and
, or
, and a
bunch of others, notably lambda
still to come.
fitzgen@shaolin:~/dev/ada-scheme $ ./scheme Welcome to Bootstrap Scheme -- Ada version. > (define foo #t) ; ok > foo ; #t > (if foo "hello" "goodbye") ; "hello" > (set! foo #f) ; ok > (if foo "hello" "goodbye") ; "goodbye" > foo ; #f >
That's all for now, more updates to come soonish.