All notable changes to this project will be documented in this file.
The format is based on Keep a Changelog, and this project adheres to Semantic Versioning.
- Added support for the
:decorators
meta key in anonymousfn
s (#1178)
import
now returns nil instead of the last module's string representation (#1174)- The
:decorators
key now works indefn
when passed as a metadata name key, expanding its support todefn
-derived macros likedefasync
(#1178). - Change Python import machinery to be centered around Python code, rather than Basilisp namespaces (#1155, #1165)
- Fix a bug in
defn
where theattr-map?
and function metdata were merged into a seq instead of a map, causingmacroexpand
to fail in some cases (#1186) - Fix a bug where
basilisp.process/exec
threw an exception when inheriting the stdout stream from the current process (#1190) - Fix a bug where
condp
threw an exception in certain cases (#1194)
alter-var-root
now returns the new value to align with Clojure behavior. Updated the docstring to highlight side effects of direct linking optimization (#1166)
- Fix a regression introduced in #1161 which prevented passing namespace metadata on the name in the
ns
macro (#1173)
- Added support for the optional
attr-map?
on thens
macro (#1159) - Added support for the optional pre- and post-conditions in
fn
forms (#1167)
- Fix a bug where
#
characters were not legal in keywords and symbols (#1149) - Fix a bug where seqs were not considered valid input for matching clauses of the
case
macro (#1148) - Fix a bug where
py->lisp
did not keywordize string keys potentially containing namespaces (#1156) - Fix a bug where anonymous functions using the
#(...)
reader syntax were not properly expanded in a syntax quote (#1160) - Fix a bug where certain types of objects (such as objects created via
deftype
) could not be unquoted correctly in macros (#1153)
- Added support for a subset of qualified method syntax introduced in Clojure 1.12 (#1109)
- Added the
basilisp.process
namespace (#1108)
- The Custom Data Readers Loader will only now examine the top directory and up to its immediate subdirectories of each
sys.path
entry, instead of recursive descending into every subdirectory, improving start up performance (#1135)
- Fix a bug where tags in data readers were resolved as Vars within syntax quotes, rather than using standard data readers rules (#1129)
- Fix a bug where
keyword
andsymbol
functions did not treat string arguments as potentially namespaced (#1131) - Fix a bug where
condp
would throw an exception if a result expression wasnil
(#1137) - Fix a bug where integer division which resulted in an integer would return a
fractions.Fraction
(#1140) - Fix a bug where
basilisp.core/time
would fail to expand withmacroexpand-all
in a nested macro call (#1143) - Fix a bug where
defn
anddefmacro
forms containing multiple arities could not be emitted by macros (#1163)
- Added support for constructing a data representation of reader conditionals (#1125)
- Fix a bug where
basilisp test
command fails due to an invalidargparse
configuration (#1119) - Fix a bug where
basilisp.walk/walk
(and any functions that depend on it) did not preserve collection metadata (#1123) - Fix a bug where the private
postwalk
implementation in the reader did not preserve collection metadata (#1123) - Fix a bug where unknown data reader tags in non-selected reader conditional branches prevented reading the forms (#1118)
- Added support for the
:param-tags
reader metadata syntax^[tag ...]
from Clojure 1.12 (#1111) - Add support for tagged literals (#1104)
- Types generated by
reify
may optionally be marked as^:mutable
now to preventattrs.exceptions.FrozenInstanceError
s being thrown when mutating methods inherited from the supertype(s) are called (#1088)
- Fix a bug where symbols and keyword containing
:
characters in the name were rejected by the reader (#1105) - Fix a bug where records did not support reducing via
reduce-kv
(#1102) - Fix a bug where collection modifying library functions such as
conj
,disj
,assoc
,dissoc
, andempty
would not preserve collection metadata (#1103)
- Added support for Python 3.13 (#1056)
- Added support for
.cljc
files (#1097)
- Fix an issue with
basilisp test
standard streams output that can lead to failures on MS-Windows (#1080) - Fix an issue where destructuring a vector would throw an exception rather than returning
nil
for invalid key types (#1090) - Fix an issue where destructuring default values would take precedence over falsey values in the source data structure (#1078)
- Fix a bug where imported Python names containing
-
(in lieu of_
) could not be referenced using the-
syntax (#1085) - Fix a compatibility issue where
*print-length*
defaulted to 50 instead ofnil
(#1093)
- Removed support for Python 3.8 (#1083)
- Added functions to
basilisp.test
for using and combining test fixtures (#980) - Added the
importing-resolve
function for dynamically importing and resolving a Python name (#1065, #1070) - Added support for highlighting matching parens, brackets, and braces at the REPL (#1074)
- Added the
-p
/--include-path
argument tobasilisp test
CLI subcommand (#1075) - Added an empty entry to
sys.path
forbasilisp test
CLI subcommand (#1075)
- Fix a bug where the reader was double counting the CRLF newline seq in metadata (#1063)
- Conform to the
cider-nrepl
info
ops spec by ensuring result's:file
is URI, also added missing :column number (#1066) - Fix a bug with
basilisp.edn/write-string
where nested double quotes were not escaped properly (#1071) - Fix a bug where additional arguments to
basilisp test
CLI subcommand were not being passed correctly to Pytest (#1075)
- Added a compiler metadata flag for suppressing warnings when Var indirection is unavoidable (#1052)
- Added the
--emit-generated-python
CLI argument to control whether generated Python code strings are stored by the runtime for each compiled namespace (#1045) - Added the ability to reload namespaces using the
:reload
flag onrequire
(#1060)
- The compiler will issue a warning when adding any alias that might conflict with any other alias (#1045)
- The compiler is now capable of unrolling top level
do
forms (not includingdo
forms emitted by macros) (#1028)
- Fix a bug where Basilisp did not respect the value of Python's
sys.dont_write_bytecode
flag when generating bytecode (#1054) - Fix a bug where Basilisp import names existed in the same namespace as
def
names, which caused some unexpected behavior (#1045)
- Added the
-p
/--include-path
CLI command to prepend entries to thesys.path
as an alternative toPYTHONPATH
(#1027) - Added an empty entry to
sys.path
for all CLI entrypoints (basilisp run
,basilisp repl
, etc.) (#1027) - Added command line arguments for enabling the development logger and configuring the logging level (#1047)
- The compiler will no longer require
Var
indirection for top-leveldo
forms unless those forms specify^:use-var-indirection
metadata (which currently is only used in thens
macro) (#1034) - nREPL server no longer sends ANSI color escape sequences in exception messages to clients (#1039)
- Fix a bug where the compiler would always generate inline function definitions even if the
inline-functions
compiler option is disabled (#1023) - Fix a bug where
defrecord
/deftype
constructors could not be used in the type's methods (#1025) - Fix a bug where
keys
andvals
would fail for records (#1030) - Fix a bug where operations on records created by
defrecord
failed for fields whose Python-safe names were mangled by the Python compiler (#1029) - Fix incorrect line numbers for compiler exceptions in nREPL when evaluating forms in loaded files (#1037)
- Fix issue where the compiler exception message from the nREPL server could refer to the initially loaded file instead of the updated one (#1042)
- Exceptions occurring during inlining during macroexpansion are no longer obscured by the outer macroexpansion exception (#1013)
- Fix the behaviour of
nil
with several collection functions (#1011) - Fix a bug where
keys
andvals
did not yield keys and values from sequences of map entries (#1018) - Fix a bug where
set
andvec
do not produce collections of map entries when called on map arguments (#1020) - Fix lazy sequences not propagating
AttributeError
(#1019)
- Added the
CollReduce
andKVReduce
protocols inbasilisp.core.protocols
and implementedreduce
in terms of those protocols (#927) - Added support for custom data readers (#924)
- Added
*default-data-reader-fn*
(#924) - Added
basilisp.pprint/print-table
function (#983) - Added
basilisp.core/read-seq
function (#986, #999) - Added various compiler arguments to CLI commands (#989)
- Added support for destructuring namespaced symbols using the
:ns/syms
syntax and non-keyword values in standard associative destructuring forms (#836)
- Improved on the nREPL server exception messages by matching that of the REPL user-friendly format (#968)
- Types created via
deftype
andreify
may declare supertypes as abstract (taking precedence over trueabc.ABC
types) and specify their member list using^:abstract-members
metadata (#942) - Load functions (
load
,load-file
,load-reader
, etc.) now return the value of the last form evaluated. (#984) - nREPL server no longer hangs waiting for client connections to close on exit (#1002)
- Align
basilisp.core/deref
with Clojure to by updating the timeout input argument to be in milliseconds instead of seconds (#1007)
- Fix inconsistent behavior with
basilisp.core/with
when thebody
contains more than one form (#981) - Fix an issue with
basilisp.core/time
failing when called outsidebasilisp.core
(#991) - Fix an issue with
basilisp.core/promise
where a thread waiting for a value from another thread might not wake up immediately upon delivery (#983). - Fix using keyword as a function not returning the default value in some cases (#997)
- Fix an issue where Python
SyntaxWarning
s would be emitted for certain compiled code (#996) - Fix an issue where 2- and 3-arity
range
invocations returned unexpected results (#1004)
- Removed
python-dateutil
andreaderwriterlock
as dependencies, switching to standard library components instead (#976)
- Run PyPy CI checks on Github Actions rather than CircleCI (#971)
- Added several missing functions to
basilisp.core
(#956)
- Fixed an issue where attempting to run a namespace from the CLI could fail in certain cases (#957)
- Fixed an issue with
keep
andkeep-indexed
two-arity forms not preserving the transformed values (#962) - Fixed an issue with
basilisp.test/is
where the expected value was misreported on failure of non(= ...)
expr (#965)
- Added
:end-line
and:end-col
metadata to forms during compilation (#903) - Added
basilisp.repl/source
to allow inspecting source code from the REPL (#205) - Added
conj
1 and 0 arities (#954)
- Updated dozens of type annotations in the compiler to satisfy MyPy 1.11 (#910)
- Update the
StreamReader
methods to stop using the term "token" to refer to individual UTF-8 characters (#915) - Update the list of Python dunder methods which are allowed to be implemented for all
deftype*
andreify*
types (#943) - ISeq now inherits from IPersistentCollection so
coll?
,empty
, andconj
can now be used with sequences (#954)
- Fix a bug where
.
characters were not allowed in keyword names (#899) - Fix a bug where nested quotation marks were not escaped properly by various print functions and at the REPL (#894)
- Fix a bug that caused a syntax error when presenting any filepath that includes the MS-Windows
\
file separator to the cli run command (#912) - Fix a bug where the core functions
symbol
andkeyword
would not accept non-string data types (#911) - Fix a bug where the compiler would emit warnings on when a Var was redef'ed even if that Var was initially defined with
^:redef
metadata (#916) - Fix a bug where reader column offset numbering began at 1, rather than 0 (#905)
- Fix a bug where
basilisp.core/boolean
was returning the boolean coercions like Python rather than like Basilisp (#928) - Fix a bug where Basilisp vectors were not callable (#932)
- Fix a bug where
basilisp.lang.seq.LazySeq
instances were not thread-safe (#934) - Fix a bug where Seqs wrapping Python Iterable instances were not thread-safe (#936)
- Fix several bugs where code was being executed from a string with interpolated variables, which could've allowed for code injection (#938)
- Fix a bug where record types and data readers whose fully qualified name started with a "b" could not be read (#947)
- Add several sections to Concepts documentation module (#666)
- Add REPL documentation module (#250)
- Add documentation module for Basilisp interfaces (#920)
- Add GitHub source links to generated API documentation (#921)
- Update Concepts documentation module with See Also links for most sections (#925)
- Update Sphinx documentation theme (#909)
- Update documentation to directly reference Python documentation and fix many other minor issues and misspellings (#907, #919)
- Added filename metadata to compiler exceptions (#844)
- Added a compile-time warning for attempting to call a function with an unsupported number of arguments (#671)
- Added support for explicit cause exception chaining to the
throw
special form (#862) - Added
basilisp.stacktrace
namespace (#721) - Added support for
*flush-on-newline*
to flush theprn
andprintln
output stream after the last newline (#865) - Added support for binding destructuring in
for
bindings (#774) - Added
==
as an alias to=
(#859) - Added custom exception formatting for
basilisp.lang.compiler.exception.CompilerException
andbasilisp.lang.reader.SyntaxError
to show more useful details to users on errors (#870) - Added
merge-with
core function (#860) - Added
fnext
core function (#879) - Added
INamed
interface for Keywords and Symbols (#884) - Added
*print-namespace-maps*
dynamic var support (#882)
- Cause exceptions arising from compilation issues during macroexpansion will no longer be nested for each level of macroexpansion (#852)
- Support for optional metadata argument in
defmulti
(#857) - Aligned
rem
andquot
methodologies with corresponding Clojure fns (#848)
- Fix a bug where
basilisp.lang.compiler.exception.CompilerException
would nearly always suppress line information in it'sdata
map (#845) - Fix a bug where the function returned by
partial
retained the meta, arities, andwith_meta
method of the wrapped function rather than creating new ones (#847) - Fix a bug where exceptions arising while reading reader conditional forms did not include line and column information (#854)
- Fix a bug where names
def
'ed without reader metadata would cause the compiler to throw an exception (#850) - Fix an issue where
concat
on maps was iterating over the keys instead of the key/value pairs (#871) - Fix a bug where the compiler would throw an exception partially macroexpanding forms with
recur
forms provided as arguments (#856) - Fix a bug where the original
(var ...)
form is not retained during analysis, causing it to be lost in calls tomacroexpand
(#888) - Fix issue with the reader var macro failing in syntax quote when unquoting a symbol, e.g. `(#'~symbol) (#889)
- Fix issue where
(str seq)
was printing seq string items without quotation marks (#891) - Fix issue where interop failed to access property name matching a builtins name (#896)
- Added support for passing through
:tag
metadata to the generated Python AST (#354) - Added support for calling symbols as functions on maps and sets (#775)
- Added support for passing command line arguments to Basilisp (#779)
- Added support for autocompleting names in the
python/
pseudo-namespace for Python builtins at the REPL (#787) - Added a subcommand for bootstrapping the Python installation with Basilisp (#790)
- Added support for executing Basilisp namespaces directly via
basilisp run
and bypython -m
(#791) - Added the
memoize
core fn (#812) - Added support for
thrown-with-msg?
assertions tobasilisp.test/is
(#831) - Added support for reading scientific notation literals, octal and hex integer literals, and arbitrary base (2-36) integer literals (#769)
- Added support for passing trailing maps to functions which accept Basilisp keyword arguments (#663)
- Added support for loading namespaces as an alias only (#664)
- Optimize calls to Python's
operator
module into their corresponding native operators (#754) - Allow vars to be callable to adhere to Clojure conventions (#767)
- Adjust input path compatibility in
basilisp.core/load
input path to be relative to the namespace or the root path (#782) - No longer warn on unused bindings when their name begins with
_
(#756) - Improve the Python generation for
do
,if
,let*
, andletfn*
forms to avoid unnecessary extra assignments (#793, #794, #799) - Generate Python classes for
deftype*
andreify*
forms using modern@attr.define
,@attr.frozen
, and@attr.field
APIs (#799) - Generate Protocol functions with nicer names based on the protocol function and dispatch type (#803)
- Loosen the dependency specification for Immutables and Pyrsistent to allow for a wider version range (#805)
- Allow
case
forms with only a default expression (#807) - Make
pr
a dynamic variable (#820) - Emit OS specific line endings for the
println
andprn
fns (#810) - Support any character in character literals (#816)
- Loosen
typing-extensions
dependency's minimal version to 4.7.0 (#809)
- Fix issue with
(count nil)
throwing an exception (#759) - Fix issue with keywords not testing for membership in sets when used as a function (#762)
- Fix an issue for executing Basilisp scripts via a shebang where certain platforms may not support more than one argument in the shebang line (#764)
- Fix issue with keywords throwing
TypeError
when used as a function on vectors (#770) - Fix an issue where the constructors of types created by
deftype
anddefrecord
could not be called if they contained-
characters (#777) - Fix issue with the variadic ampersand operator treated as a binding in macros (#772)
- Fix a bug the variadic arg symbol was not correctly bound to
nil
when no variadic arguments were provided (#801) - Fix a bug where the quotient of very large numbers was incorrect (#822)
- Fix a bug where
basilisp.test/is
may fail to generate expected/actual info on failures when declared inside a macro (#829) - Fix a bug where sequential destructuring bindings do not bind names correctly when nested within associative destructuring bindings (#834)
- Removed support for PyPy 3.8 (#785)
- Improve the state of the Python type hints in
basilisp.lang.*
(#797, #784) - Update Sphinx and its associated contrib libraries to
^7.1.0
(#815)
- Added rudimentary support for
clojure.stacktrace
withprint-cause-trace
(part of #721) - Added support for
bytes
literals using a#b
prefix (#732) - Added support for Python 3.12 (#734)
- Added a default reader conditional for the current platform (
windows
,darwin
,linux
, etc.) (#692) - Added support for
bencode
binary encoding (part of #412) - Ported nbb's nrepl-server module to basilisp (#412)
- Basilisp now supports PyTest 7.0+ (#660)
- Fix issue with
case
evaluating all of its clauses expressions (#699) - Fix issue with relative paths dropping their first character on MS-Windows (#703)
- Fix incompatibility with
(str nil)
returning "nil" (#706) - Fix
sort-by
support for maps and boolean comparator fns (#709) - Fix
sort
support for maps and boolean comparator fns (#711) - Fix
(is (= exp act))
should only evaluate its args once on failure (#712) - Fix issue with
with
failing with a traceback error when an exception is thrown (#714) - Fix issue with
sort-*
family of funtions returning an error on an empty seq (#716) - Fix issue with
intern
failing when used (#725) - Fix issue with
ns
not being available afterin-ns
on the REPL (#718) - Fixed issue with import modules aliasing using ns eval (#719)
- Fix issue with
ns-resolve
throwing an error on macros (#720) - Fix issue with py module
readerwritelock
locks handling (#722) - Fix issue with basilisp.io/writer :append mode not working (#741)
- Fix issue with attempting to inline functions which reference other Python modules that aren't available in the inline destination (#746)
- Removed the dependency
astor
for versions of Python 3.9+ (#736) - Removed
basilisp.__version__
in favor of usingimportlib.metadata
for version info (#617) - Removed a shim to Python's
ast
module to support compatibility with Python 3.6 and 3.7 (#749)
- Switch to PyLint and Ruff for linting from Prospector (#739)
- Added support for fixtures in
basilisp.test
(#654) - Added support for Python 3.10 and 3.11 (#659, #693)
- Added a Sphinx autodoc plugin for generating API documentation for Basilisp namespaces (#658)
- Added support for rewriting required namespaces starting with
clojure.
asbasilisp.
if the original name isn't found on the import path (#670, #676) - Added support for inlining simple functions (#673)
- Added the
clojure.core
functions from v1.11 (#672)
- Set tighter bounds on dependency version ranges (#657)
- Improved on and completed several different sections of the documentation (#661, #669)
- Delete unused utility functions after they are generated and executed by the REPL to save memory (#674)
- Fixed the
with
macro definition to match the Python language spec (#656) - Fixed a bug where
py->lisp
did not convert map keys or values into Basilisp objects (#679)
- Run CPython CI checks on Github Actions rather than CircleCI (#683)
- Remove support for Python 3.6 and 3.7, which are both EOL (#691)
- Fix test suite failures on Windows and add Github Actions runners for testing on Windows (#688)
- Update Prospector version for linting (#694)
- Added a bootstrapping function for easily bootstrapping Basilisp projects from Python (#620)
- Added support for watchers and validator functions on Atoms and Vars (#627)
- Added support for Taps (#631)
- Added support for hierarchies (#633)
- Added support for several more utility Namespace and Var utility functions (#636)
- Added
basilisp.io
namespace with polymorphic reader and writer functions (#645) - Added support for coroutines and generators using
yield
syntax (#652)
- PyTest is now an optional extra dependency, rather than a required dependency (#622)
- Generated Python functions corresponding to nested functions are now prefixed with the containing function name, if one exists (#632)
basilisp.test/are
docstring now indicates that line numbers may be suppressed on assertion failures created usingare
(#643)- Multimethods now support providing a custom hierarchy and dispatch to registered values using
isa?
(#644)
- Fixed a bug where
seq
ing co-recursive lazy sequences would cause a stack overflow (#632) - Fixed a spurious failure in the test runner and switched to using macro forms for test line numbers (#631)
- Fixed a bug that allowed dynamic Vars to be
set!
even if they weren't thread-bound (#638) - Fixed a bug where it was impossible to specify negative CLI options for the compiler flags (#638)
- Fixed a bug where it was impossible to use more than a single body expression in a
try
special form (#640) - Fixed a bug where re-
def
ing a Var (regardless of^:redef
metadata) would not update metadata or dynamic flag (#642) - Fixed a bug where private Vars could be resolved from the source namespace of a public macro during macroexpansion (#648)
- Fixed a bug where trailing quotes were not allowed in Symbols and Keywords (#650)
- Removed Click as a dependency in favor of builtin
argparse
(#622, #624, #636) - Removed Atomos as a dependency in favor of
readerwriterlock
(#624)
- Added support for auto-resolving namespaces for keyword from the current namespace using the
::kw
syntax (#576) - Added support for namespaced map syntax (#577)
- Added support for numeric constant literals for NaN, positive infinity, and negative infinity (#582)
- Added
*basilisp-version*
and*python-version*
Vars tobasilisp.core
(#584) - Added support for function decorators to
defn
(#585) - Added the current Python version (
:lpy36
,:lpy37
, etc.) as a default reader feature for reader conditionals (#585) - Added default reader features for matching Python version ranges (
:lpy36+
,:lpy38-
, etc.) (#593) - Added
lazy-cat
function for lazily concatenating sequences (#588) - Added support for writing EDN strings from
basilisp.edn
(#600) - Added a persistent queue data type (#606)
- Added support for transducers (#601)
- Added support for Python 3.9 (#608)
- Added support for 3-way comparators (#609)
- Moved
basilisp.lang.runtime.to_seq
tobasilisp.lang.seq
so it can be used within that module and bybasilisp.lang.runtime
without circular import (#588) - Keyword hashes are now pre-computed when they are created, so they do not need to be recomputed again to be fetched from the intern cache (#592)
- The compiler now uses the pre-computed hash to lookup keywords directly, which should improve lookup time for repeated invocations (#592)
- Symbol hashes are now pre-computed when they are created (#592)
- Moved
basilisp.core.template
tobasilisp.template
to match Clojure (#599) - Refactor compiler to use
functools.singledispatch
for type based dispatch (#605) - Rename
List
,Map
,Set
, andVector
toPersistentList
,PersistentMap
,PersistentSet
, andPersistentVector
respectively (#605)
- Fixed a bug where
def
forms did not permit recursive references to thedef
'ed Vars (#578) - Fixed a bug where
concat
could cause aRecursionEror
if used on aLazySeq
instance which itself callsconcat
(#588) - Fixed a bug where map literals in function reader macro forms caused errors during reading (#599)
- Fixed a bug where
some->
andsome->>
threading macros would threadnil
first arguments (#599)
- Removed
pyfunctional
dependency in favor of Python standard library functions (#589)
- Basilisp uses
poetry
for dependency and virtual environment management, as well as for publishing to PyPI (#616)
v0.1.dev14 - 2020-06-18
- Added support for
future
s (#441) - Added support for calling Python functions and methods with keyword arguments (#531)
- Added support for Lisp functions being called with keyword arguments (#528)
- Added support for multi-arity methods on
deftype
s (#534) - Added metadata about the function or method context of a Lisp AST node in the
NodeEnv
(#548) - Added
reify*
special form (#425) - Added support for multi-arity methods on
definterface
(#538) - Added support for Protocols (#460)
- Added support for Volatiles (#460)
- Added JSON encoder and decoder in
basilisp.json
namespace (#484) - Added support for generically diffing Basilisp data structures in
basilisp.data
namespace (#555) - Added support for artificially abstract bases classes in
deftype
,defrecord
, andreify
types (#565) - Added support for transient maps, sets, and vectors (#568)
- Basilisp set and map types are now backed by the HAMT provided by
immutables
(#557) get
now respondsnil
(or its default) for any unsupported types (#570)nth
now supports only sequential collections (ornil
) and will throw an exception for any invalid types (#570)- Use
functools.singledispatch
for to achieve higher performance polymorphism on most runtime functions (#552, #559) - Update the keyword cache to use a Python
threading.Lock
rather than an Atom (#552) rest
no longer returnsnil
, it always returns an empty sequence (#558)
- Fixed a bug where the Basilisp AST nodes for return values of
deftype
members could be marked as statements rather than expressions, resulting in an incorrectnil
return (#523) - Fixed a bug where
defonce
would throw a Python SyntaxError due to a superfluousglobal
statement in the generated Python (#525) - Fixed a bug where Basilisp would throw an exception when comparing seqs by
=
to non-seqable values (#530) - Fixed a bug where aliased Python submodule imports referred to the top-level module rather than the submodule (#533)
- Fixed a bug where static methods and class methods on types created by
deftype
could not be referred to directly (defeating the purpose of the static or class method) (#537) - Fixed a bug where
deftype
forms could not be declared without at least one field (#540) - Fixed a bug where not all builtin Basilisp types could be pickled (#518)
- Fixed a bug where
deftype
forms could not be created interfaces declared not at the top-level of a code block in a namespace (#376) - Fixed multiple bugs relating to symbol resolution of
import
ed symbols in various contexts (#544) - Fixed a bug where the
=
function did not respect the equality partition for various builtin collection types (#556) - Fixed a bug where collection types could evaluate as boolean
false
(#566) - Fixed a bug where
reduce
required a 1-arity function for the variant with an initial value, rather than returning that initial value (#567)
v0.1.dev13 - 2020-03-16
- Added support for Shebang-style line comments (#469)
- Added multiline REPL support using
prompt-toolkit
(#467) - Added node syntactic location (statement or expression) to Basilisp AST nodes emitted by the analyzer (#463)
- Added
letfn
special form (#473) - Added
defn-
,declare
, anddefonce
macros (#480) - Added EDN reader in the
basilisp.edn
namespace (#477) - Added line, column, and file information to reader
SyntaxError
s (#488) - Added context information to the
CompilerException
string output (#493) - Added Array (Python list) functions (#504, #509)
- Added shell function in
basilisp.shell
namespace (#515) - Added
apply-template
function tobasilisp.core.template
namespace (#516)
- Change the default user namespace to
basilisp.user
(#466) - Changed multi-methods to use a
threading.Lock
internally rather than an Atom (#478) - Changed the Basilisp module type from
types.ModuleType
to a custom subtype with support for custom attributes (#482) - Basilisp's runtime function
Namespace.get_or_create
no longer refersbasilisp.core
by default, which allows callers to excludebasilisp.core
names in thens
macro (#481) - Namespaces now use a single internal lock rather than putting each property inside of an Atom (#494)
- Refactor the testrunner to use fewer
atom
s inbasilisp.test
(#495)
- Fixed a reader bug where no exception was being thrown splicing reader conditional forms appeared outside of valid splicing contexts (#470)
- Fixed a bug where fully Namespace-qualified symbols would not resolve if the current Namespace did not alias the referenced Namespace (#479)
- Fixed a bug where the
quote
special form allowed more than one argument and raised an unintended exception when no argument was provided (#497) - Fixed a bug where compiler options specified via command-line argument or environment variable were not honored by the importer (#507)
- Fixed a bug where private Vars from other Namespaces could be referenced if the Namespace was aliased when it was required (#514)
- Fixed a bug where collections with trailing end tokens separated from the collection only by a comment (#520)
v0.1.dev12 - 2020-01-26
- Added new control structures:
dotimes
,while
,dorun
,doall
,case
,for
,doseq
,..
,with
,doto
(#431) - Added
basilisp.walk
namespace with generic tree-walker functions (#434) - Added several new higher-order functions (#433)
- Added
basilisp.template
namespace with templating utility functions (#433) - Added
basilisp.test/are
for writing multiple similar assertions (#433) - Added many new collection and sequence functions (#439)
- Added support for Promises (#440)
- Added support for Python 3.8 (#447)
- Added
vary-meta
,alter-meta!
, andreset-meta!
utility functions (#449) - Added support for the primitive type coercion API (#451)
- Added support for the unchecked arithmetic API (#452)
- Added a
Makefile
utility for generating the Python code forbasilisp.core
(#456)
- Compile
attrs
instances internally withoutcmp
keyword argument forattrs
>= 19.2.0 (#448) - Small Python changes in the compiler to remove redundant operations (#450)
- Fixed an issue where
macroexpand
andmacroexpand-1
attempted to resolve symbols rather than leaving them unresolved (#433) - Fixed an issue with transient macro namespace symbol resolution in the analyzer (#438)
- Fixed a bug where
ISeq
iterators could stack overflow for long sequences (#445) - Fixed the
importer
test suite's use ofmultiprocessing
for Python 3.8 (#446) - Correct the
with-meta
interface and replace incorrect usages withvary-meta
(#449) - Fixed an issue where line/column metadata was not properly being fetched by the analyzer (#454)
- Warnings for Basilisp code now indicate namespace and line number of that code (#457)
- Errors resolving nested symbols are now much more helpful (#459)
v0.1.dev11 - 2019-07-27
macroexpand
andmacroexpand-1
functions (#394)reset-vals!
andswap-vals!
Atom functions (#399)format
,printf
, and a few other formatting functions (#401)rand
,rand-int
, and a few other basic random functions (#402)assoc-in
,update-in
, and a few other associative utility functions (#404)- Several namespace utility functions (#405)
- Preliminary support for Python 3.8 (#406 and #407)
- Added the
ILookup
interface toIAssociative
(#410) - Support for Reader Conditional syntax (#409)
- Python builtins may now be accessed using the
python
namespace from within Basilisp code, rather thanbuiltins
(#400) - Basilisp code files can now be named and organized more like Clojure projects.
__init__
files are not necessary, though they may still be used. Folders can bear the same name as a namespace file, which will allow nesting. (#393) - Renamed Basilisp's parser module to analyzer, to more accurately reflect it's purpose (#390)
- Changed
binding
behavior to usepush-thread-bindings
andpop-thread-bindings
, which use a thread-local for bindings, to more closely emulate Clojure (#405) - Internal
IAsssociative.entry
usages have been changed toILookup.val_at
(#410)
- Allow direct code references to static methods and fields (#392)
v0.1.dev10 - 2019-05-06
- Added support for Record data types (#374, #378, and #380)
- Lots more useful core library functions (#373)
- Refactor core interfaces under
basilisp.lang.interfaces
module (#370) - Organize interface hierarchy to match Clojure's (#372)
- Compile qualified
basilisp.lang.*
module references down to aliased references (#366) let
andloop
forms may now have empty binding vectors and empty bodies (#382)
v0.1.dev9 - 2019-03-29
- Add support for custom data types (#352)
- Add an environment variable which allows users to disable emitting Python AST strings (#356)
- Functions now support metadata (#347)
defn
forms can attach metadata to functions via an attribute map (#350)- Basilisp code can be executed as a script via the CLI from standard in (#349)
- Support for
async
functions (via:async
metadata ordefasync
form) and newawait
special form (#342) - Symbol and keyword completion at the REPL if
readline
is available (#340) - Macro environment is now being passed as the first argument of macros (#339)
- Create Python literals using
#py
reader tag and corresponding Basilisp data structure (#337)
- Nested Python imports can no longer be obscured by their parent module name (#360)
v0.1.dev8 - 2019-03-10
- Basilisp compiler parses Basilisp code into an intermediate AST prior to Python code generation (#325)
- Add meta to
def
forms in the compiler (#324) - Switch builtin exceptions to use
attrs
(#334)
- Quoted interop forms and properties no longer emit errors (#326)
- Improve test suite performance by using a mutable
dict
forlrepr
kwargs generation (#331) - Attach line and column metadata to functions, quoted, and deref forms (#333)
- Log internal
nth
messages asTRACE
rather thanDEBUG
(#335)
v0.1.dev7 - 2018-12-18
- Add
loop
special form (#317) - Add Lisp
repr
support usingLispObject
abstract base class (#316) - Python imports may be aliased like
require
using a vector (#319) - The compiler emits a warning when a local symbol is unused (#314)
- The compiler can optionally emit a warning when a local name or Var name is shadowed (#303, #312)
- The compiler can optionally emit a warning when a Var reference requires indirection (#306)
basilisp.core/ns-resolve
can now resolve aliased symbols (#313)- Python interop calls can now be made within threading macros (#308)
- Basilisp source code is now released under the EPL 1.0
v0.1.dev6 - 2018-11-02
- Print functions respect output stream bound to
*out*
(#257) - Capture line numbers for test failures and errors (#270)
- Support threading macros (#284)
- Support redefinable Vars and suppressing warnings when Vars are redefined (#292)
- Add more core functions (#293, #296, #298)
- Support destructuring of arguments in
fn
and bindings inlet
(#289) - Add set library functions (#261)
- Keyword string and repr are now identical (#259)
- Don't attempt to resolve names inside syntax-quote (#272)
- Properly resolve names inside
catch
blocks (#273) - Loosen syntax requirements for interop properties (#276)
- Fix
basilisp.core/map
lazy sequence behavior (#278) - Allow empty function definitions (#280)
- Allow the dollar sign
$
in symbols (#286) - Report exceptions caught in the test runner as errors (#300)
v0.1.dev5 - 2018-10-14
- Add a logger to Basilisp library code (with a default NullHandler) (#243)
- Implement Bytecode caching for compiled Basilisp modules (#244)
v0.1.dev4 - 2018-09-29
- Bump version to support Python 3.7 on PyPI
v0.1.dev3 - 2018-09-29
- Add multi-methods to Basilisp (#222)
- The Basilisp PyTest runner now prints exception messages for non-failure errors (#235)
- Add a few new namespace functions to
basilisp.core
(#224) - Create namespace setting context managers for use in tests (#228)
- Removed usages of
seq.grouped
from PyFunctional which throwStopIteration
exceptions and cause Basilisp to be unusable with Python 3.7 (#221) - Fix a bug where the wrong namespace may be set in
deftest
defined tests (#232) - Fix a bug where non-symbols could not appear in the member position of Python interop special forms (#230)
- Fix several instances of bugs where Basilisp tests were changing
basilisp.core/*ns*
without resetting it, which would cause cascading test failures (#228)
v0.1.dev2 - 2018-09-27
- Add PyTest runner tests written using the
basilisp.test/deftest
macro (#195) - Throw a useful error when no Var is bound to a symbol (#197)
- Add a string library as
basilisp.string
(#187) - Add regex functions to
basilisp.core
(#193) - Add namespace functions to
basilisp.core
(#176) - The reader can return a custom EOF indicator (#218)
- Fixed a bug where comment literals were not be fully removed from reader outputs (#196)
- Fixed a bug where comment literals caused syntax errors inside collection literals (#196)
- Imported namespaces no longer create extra namespaces bound to munged Python module names (#216)
- Fixed a bug where
import*
s would not work within other forms - Fixed a bug where the Basilisp import hook could be added to
sys.meta_path
multiple times (#213) - Fixed a bug where keywords could not be used in function position (#174)
- Fixed a bug where macro symbols were not resolved using the same heuristics as other symbols (#183)
- Fixed a bug where lazy sequences were not resolved even if they were empty-checked (#182)
- Fixed a bug where new namespaces were created whenever the compiler checked if a namespace existed to resolve a symbol (#211)
- Fixed a bug where Python string escape sequences were not handled correctly by the reader (#192)
- Fixed a bug where character literals caused a syntax error inside collections (#192)
v0.1.dev1 - 2018-09-13
- Basic CLI for REPL and running scripts
- REPL convenience functions
doc
andpydoc
will return Basilisp and Python documentation respectively - Vars containing the last 3 expression results (
*1
,*2
,*3
) and last exception (*e
) are now included on the REPL - Added support for Decimal, Fraction, and complex types
- Support for Clojure style object instantiation syntax:
(new com.lisp.Object)
or(com.list.Object.)
- Read/eval functions in
basilisp.core
- Support for customizing data readers either by binding
*data-readers*
or supplying a keyword argument from Python - Support for character literals using
\a
syntax - Support for deref-literals using
@
- Dynamic vars are now properly compiled as dynamic, allowing thread-local bindings
let*
bindings can no longer eagerly evaluate binding expressions in conditional branches which will not be takencatch
expressions no longer throw an error when they appear in a syntax-quote- Basilisp files imported using the Basilisp import hook now properly resolve symbols in syntax quotes
- Basilisp's
Map
type now supportscons
ing other maps. - Syntax quoted special forms are no longer resolved into namespaced symbols
v0.1.dev0 - 2018-08-31
- Basilisp language and compiler base.