changing another recursive call to goto
adding special cases in compiler for 0 and 1 argument versions of some
vararg builtins
beginning implementation of bytecode interpreter
so recursion depth is limited only by the process stack limit.
reorganizing evaluator so the same code is used for evaluating
and pushing arguments for both builtin functions and lambdas.
for now this is slower, but it was done in preparation for
Things To Come.
adding list-head
implementing the calling convention for long argument lists in
bytecode compiler. arguments are broken down into a nest of
list and nconc calls.
also implementing vararg builtins.
accepting r6rs IEEE literals +-nan.0 and +-inf.0
printing distinguished -0.0, indicating float with .0f instead
of #float, double with .0 instead of #double
more renaming (? on predicates, ! on mutating operators)
changing T to #t :( all those #s are so ugly
porting code to sort out which NILs are false and which are
empty lists
switching to scheme-style special forms. however you feel about
scheme names vs. CL names, using both is silly.
mostly switching to scheme predicate names, with compatibility
aliases for now. adding set-constant! to make this efficient.
adding null?, eqv?, assq, assv, assoc, memq, memv, member
adding 2-argument form of if
allowing else as final cond condition
looking for init file in same directory as executable, so flisp
can be started from anywhere
renaming T to FL_T, since exporting a 1-character symbol is
not very nice
adding opaque type boilerplate example file
adding correctness checking for the pattern-lambda benchmark
bugfix in int2str
• eliminated bad behavior near screen edge, added wrapping
• added behavior: indent after some number of non-indented elements
• indent after head symbols with really long names
• don't indent after first argument to setq
improvements to cps converter
• correctly dispatch to non-cps functions
• handle vararg lambdas in head position
enabling type-specific print and relocate behavior
allowing GC to be triggered by large buffer allocations
adding hash table constructor and print function
renamed some functions
explicitly represented in an fltype_t struct, and symbolic
types are hash-consed. a lot of code is smaller and simpler
as a result. this should allow more features in less space
(both code and data) going forward.
changing \DDD and \x escape sequences to read bytes instead of
characters
re-fixing uint64 cast bug
adding Paul Hsieh's hash function, to be evaluated later
some cleanup
moving some library code around for size optimization
now using == instead of flt_equals for float comparison, mostly
for hash compatibility
better text representation of infs and nans
removing construction of low-level numeric types directly from strings
adding hash function corresponding to equal
better way to initialize builtins
moving advanced bitvector ops to separate compilation unit
rearranging hash table code so it can be specialized for different
comparison functions
one good way to bloat a piece of software is to add several
ASCII pictures of the mona lisa
after all that's the whole point of bitvectors
some prettyprinting tweaks
more uniform way to handle forwarding pointers. fix forwarding
of gensyms
:keyword symbols
that could access the current environment dynamically. It also
differed unnecessarily from common lisp set in this respect.
So now setq is a builtin special form that sets lexical or
global variables, and set is a function that sets global variables.
Rather than eliminate the power of the dynamic set, I extended it
by adding eval*, which evaluates its argument in the current
environment. The justification for this is that the interpreter
is already dynamic enough to allow it with no overhead, so the
ability might as well be exposed.
cleanup; removing some magic numbers
beginning hash tables
fixnums still have 30 bits
moving towards making "guest functions" more opaque; their type is now
just 'builtin
pretty printing some forms better: defun, defmacro, for, label
support *print-pretty*