Rewrite the compiler
A few days ago I found a bug in the compiler that I decided merited basically an
entire rewrite of it.
This was long overdue. The compiler kind of grew organically and unhealthily
over time as I wrapped my head around how the whole WAM is structured, and now
that I understand a lot more I can do things right.
This new implementation is a lot "flatter" than the old one. It makes use of
CLOS classes and generic methods to un-nest a lot of the crap that was
previously happening in bigass `labels` blocks. This is a lot easier to read
and understand because you can take things a piece at a time.
Unfortunately, it's currently a lot slower than the old one. But at least it's
*correct*, and now I can start taking a look at optimizing the performance with
a cleaner base to start from.
Notes/ideas for the near future:
* Switch to structs instead of CLOS classes for all the bits and bobs in the
compilation process.
* Inline hot functions in the compilation process.
* Type hint the fucking compiler already. I've put this off for far too long.
* Move the compiler to its own package for easier profiling and to maintain my
shreds of sanity.
* Look into that generic-function-inlining library thing I saw on Reddit...
* Remove the last vestiges of `match` and kill the dependency on optima.
author |
Steve Losh <steve@stevelosh.com> |
date |
Tue, 07 Jun 2016 14:49:20 +0000 |
parents |
27f037427ad3 |
children |
970e21fa14b0 |
(defpackage #:bones
(:use #:cl)
(:export #:hello))
(defpackage #:bones.utils
(:use
#:cl
#:defstar
#:bones.quickutils)
(:export
#:repeat
#:hex
#:push-if-new
#:recursively
#:recur
#:when-let
))
(defpackage #:bones.circle
(:use #:cl #:defstar)
(:export
#:make-circle-with
#:make-empty-circle
#:circle-to-list
#:circle-prepend
#:circle-prepend-circle
#:circle-append
#:circle-append-circle
#:circle-next
#:circle-prev
#:circle-forward
#:circle-backward
#:circle-value
#:circle-rotate
#:circle-nth
#:circle-insert-before
#:circle-insert-after
#:circle-sentinel-p
#:circle-empty-p
#:circle-remove
#:circle-backward-remove
#:circle-forward-remove
#:circle-replace
#:circle-backward-replace
#:circle-forward-replace
#:circle-splice
#:circle-backward-splice
#:circle-forward-splice
#:circle-insert-beginning
#:circle-insert-end
)
)
(defpackage #:bones.wam
(:use
#:cl
#:defstar
#:optima
#:cl-arrows
#:bones.circle
#:bones.quickutils
#:bones.utils)
(:import-from #:optima
#:match)
(:shadowing-import-from #:cl-arrows
#:->))
(defpackage #:bones.paip
(:use
#:cl
#:defstar
#:bones.quickutils)
(:documentation "Test?")
(:export
;; Unification, constants
#:unify
#:fail
#:no-bindings
#:*check-occurs*
;; Destructive unification
#:unify!
#:unbound
#:bound-p
;; Database management
#:clear-db
#:clear-predicate
#:fact
#:rule
#:add-fact
#:rule-fact
;; Lisp data structures as results
#:return-one
#:return-all
;; Interactive queries
#:query
#:query-one
#:query-all
))