- Add a `vec` built-in function in step7 so that `quasiquote` does not require `apply` from step9. - Introduce quasiquoteexpand special in order to help debugging step7. This may also prepare newcomers to understand step8. - Add soft tests. - Do not quote numbers, strings and so on. Should ideally have been in separate commits: - elisp: simplify and fix (keyword :k) - factor: fix copy/paste error in let*/step7, simplify eval-ast. - guile: improve list/vector types - haskell: revert evaluation during quasiquote - logo, make: cosmetic issues |
||
---|---|---|
.. | ||
tests | ||
core.pm | ||
Dockerfile | ||
env.pm | ||
interop.pm | ||
Makefile | ||
printer.pm | ||
reader.pm | ||
readline.pm | ||
README.md | ||
run | ||
step0_repl.pl | ||
step1_read_print.pl | ||
step2_eval.pl | ||
step3_env.pl | ||
step4_if_fn_do.pl | ||
step5_tco.pl | ||
step6_file.pl | ||
step7_quote.pl | ||
step8_macros.pl | ||
step9_try.pl | ||
stepA_mal.pl | ||
types.pm |
Notes on the mal implementation in Perl5.
This implementation should work in any perl from 5.19.3 onwards.
Earlier versions are likely to work too as long as you install a new
List::Util. The implementation uses the experimental switch
feature, which may make it vulnerable to future changes in perl.
Mal objects are all in subclasses of Mal::Type
, and can be treated
as scalar, array, or hash references as appropriate.
Metadata support uses Hash::Util::FieldHash
to attach external
metadata to objects. This means that in the metadata system imposes
no overhead on the normal use of objects.
Hash-maps are slightly magical. They're keyed by the stringified
versions of mal objects, and Mal::Scalar
overloads stringification
so that this works properly.
Tail-call optimisation uses Perl's built-in goto &NAME
syntax for
explicit tail calls. This allows functions defined by fn*
to be
implemented as functions at the Perl layer.
Perl's garbage-collection is based on reference counting. This means
that reference loops will cause memory leaks, and in particular using
def!
to define a function will cause that function to have a
reference to the environment it's defined in, making a small reference
loop and hence a memory leak. This can be avoided by carefully
undefining any function before it goes out of scope.