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.