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
basilisp.test/do-reportandbasilisp.test/assert-exprforclojure.testcompatibility in writing custom assertion expressions (#1334)
- Reimplemented
basilisp.lang.seqin Rust using PyO3 to improve performance (#1338, #1341) - Performance improvements for compile time and runtime (#1337)
- Arity 0 of
concatnow returns an unrealized lazy seq, rather than an empty seq (#1339) - Records disallow interface method and field names in field names (#758)
contains?now matches Clojure's behavior and checks only if a fast lookup key or index is in the collection (#1353)basilisp.string/split-linesnow matches Clojure's behavior and excludes trailing newlines (#1353)basilisp.string/replacenow supports both Python and Clojure backreferences (#1354)- Reader regex literals do not replace escape characters with their corresponding character (#1354)
- Fix a bug where
basilisp.test/arebased tests could fail to report line numbers for test failures (#635) - Fix a bug where not all UTF-8 symbols and keywords were accepted by the Basilisp reader and
basilisp.edn/read-string(#1346, #1349) - Fix a bug where scientific notation literals could not be read with an
Mprefix into decimal types (#1351) - Fix a bug where
partitioncould return an extra partition unexpectedly (#1353) - Fix a bug where regex patterns representation at the REPL printed special characters unescaped (#1353)
basilisp.test/gen-asserthas been removed and replaced withbasilisp.test/assert-expr(#1347)
- Added
basilisp.csvnamespace (#753) - Added
basilisp.reflectnamespace for Python VM runtime reflection (#837)
- Add
testandtestsdirectories toPYTHONPATHautomatically duringbasilisp testCLI invocations (#1069)
- Fix a bug where transient vectors were not callable and did not support
nth(#1331)
- Added support for Python 3.14 (#1282)
- Added support for Unicode escape sequences in string literals (#1295)
- Added environment variable configurations for the PyTest testrunner to allow more specific test discovery (#1301)
- Added no-op Clojure compatibility functions:
inc',dec',int-array,long-array,short-array,float-array,double-array,bool-array(#1305)
tryandcatchspecial form bodies may now be empty and will returnnilwhen no expressions are given (#1294)basilisp.str/blank?now matches the behavior of Clojure, which returns true fornil, empty strings, and strings consisting of all whitespace (#1305)- String representations of infinity and NaN values now matches Clojure (#1305)
- Promises can now be called to deliver the result (#1305)
- Calling
keywordonnilnow returnsnil(#1305) consalways returns anISeqnow, not specifically aPersistentList(#1305)seqable?now returnstruefornil(#1305)- Calling a vector with an invalid index will now raise
IndexError(#1305) keysandvalsnow returnnilrather than an empty seq if the input collection is empty (#1305)get-inalways returns the input mapping if no keys are given (#1305)assoc!allows an odd number of arguments, substitutingnilfor the missing value (#1305)nthrestandnthnextreturn the input collection unchanged if the index given is negative (#1305)even?andodd?predicates throw exceptions for non-integral inputs (#1305)minandmaxnow return##NaNif any input argument is##NaN(#1305)- Ratios which reduce to an integer are now returned from the reader as integers (#1305)
mod,quot, andremreturn values are now consistent with the Clojure return values for the same inputs (#1305)derivewill throw exceptions if the provided hierarchy is invalid or if the tag and parent are invalid types (#1305)- Map types now print out comma separators between key/value pairs (#1275)
- Fix a bug where
importrefers would incorrectly be applied to all import modules in the same form (#1274) - Suppress pytest assertion rewrite warning for basilisp when running
basilisp test(#1252) - Fix a bug where
+characters were not allowed after theein scientific notation literal numbers (#1292) - Fix a bug where namespaces created dynamically at the REPL could not be required from other namespaces in the REPL (#1302)
- Fix a bug where NaN floats were not properly represented in compiled code (#1305)
- Fix a bug where calling
dissocon a record type would throw an exception for keys which weren't defined on the record (#1305) - Fix a bug where arithmetic functions with operands of different types would throw exceptions (#1305)
- Fix a bug where
number?andinteger?would return true for Pythonbooltypes (#1305)
- Removed support for Python 3.9 (#1283)
- Improve the state of the Python type hints in
basilisp.lang.multifn(#800)
- Added support for referring imported Python names as by
from ... import ...(#1154) - Added the
basilisp.urlnamespace for structured URL manipulation (#1239) - Added support for proxies (#425)
- Added a
:slotsmeta flag fordeftypeto disable creation of__slots__on created types (#1241) - Added support for f-strings (#922)
- Added the
aslicemacro to facilitate the use of Python stylearray[start:stop:step]slicing in Basilisp (#1248) - Added the
IPendinginterface which is implemented by delays, futures, and promises (#1260) - Added the
basilisp.pprintnamespace (#513)
- Removed implicit support for single-use iterables in sequences, and introduced
iterator-seqto explicitly handle them (#1192) basilisp.core/strnow delegates to the builtin Pythonstrin all cases except for customizing the string output for builtin Python types (#1237)- Optimised mainstream seq-consuming functions by coercing their inputs into
sequpfront (#1234) - Renamed
awithandafortowith-asyncandfor-asyncfor improved clarity (#1248) basilisp.main.initwill only initialize the runtime environment on the first invocation (#1242)- Updated support for PyPy to 3.9 and 3.10 (#1265)
- Fix a bug where protocols with methods with leading hyphens in method names could not be defined (#1230)
- Fix a bug where attempting to
:refera non-existent Var from another namespace would throw an unhelpful exception (#1231) - Fix a bug where
(range 0)would return(0)rather than()as expected (#1258)
- Added
aforandawithmacros to support async Python interop (#1179, #1181)
- Function parameter names will not be automatically generated with unique suffixes unless the function meta key
^:safe-py-paramsis provided (#1212)
- Fix an issue where the compiler would generate an illegal
returnstatement for asynchronous generators (#1180) - Fix an issue where consecutive reader comment forms would not be ignored (#1207)
- Fix a regression introduced in #1176 where the testrunner couldn't handle relative paths in
sys.path, causingbasilisp testto fail when no arugments were provided (#1204) - Fix a bug where
basilisp.process/execcould deadlock reading process output if that output exceeded the buffer size (#1202) - Fix
basilisp boostrapissue on MS-Windows where the boostrap file loaded too early, before Basilisp was insys.path(#1208)
- Added support for the
:decoratorsmeta key in anonymousfns (#1178)
importnow returns nil instead of the last module's string representation (#1174)- The
:decoratorskey now works indefnwhen 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
defnwhere theattr-map?and function metdata were merged into a seq instead of a map, causingmacroexpandto fail in some cases (#1186) - Fix a bug where
basilisp.process/execthrew an exception when inheriting the stdout stream from the current process (#1190) - Fix a bug where
condpthrew an exception in certain cases (#1194)
alter-var-rootnow 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
nsmacro (#1173)
- Added support for the optional
attr-map?on thensmacro (#1159) - Added support for the optional pre- and post-conditions in
fnforms (#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
casemacro (#1148) - Fix a bug where
py->lispdid 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.processnamespace (#1108)
- The Custom Data Readers Loader will only now examine the top directory and up to its immediate subdirectories of each
sys.pathentry, 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
keywordandsymbolfunctions did not treat string arguments as potentially namespaced (#1131) - Fix a bug where
condpwould 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/timewould fail to expand withmacroexpand-allin a nested macro call (#1143) - Fix a bug where
defnanddefmacroforms 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 testcommand fails due to an invalidargparseconfiguration (#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
postwalkimplementation 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-tagsreader metadata syntax^[tag ...]from Clojure 1.12 (#1111) - Add support for tagged literals (#1104)
- Types generated by
reifymay optionally be marked as^:mutablenow to preventattrs.exceptions.FrozenInstanceErrors 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, andemptywould not preserve collection metadata (#1103)
- Added support for Python 3.13 (#1056)
- Added support for
.cljcfiles (#1097)
- Fix an issue with
basilisp teststandard 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
nilfor 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.testfor using and combining test fixtures (#980) - Added the
importing-resolvefunction 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-pathargument tobasilisp testCLI subcommand (#1075) - Added an empty entry to
sys.pathforbasilisp testCLI subcommand (#1075)
- Fix a bug where the reader was double counting the CRLF newline seq in metadata (#1063)
- Conform to the
cider-nreplinfoops spec by ensuring result's:fileis URI, also added missing :column number (#1066) - Fix a bug with
basilisp.edn/write-stringwhere nested double quotes were not escaped properly (#1071) - Fix a bug where additional arguments to
basilisp testCLI 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-pythonCLI 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
:reloadflag 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
doforms (not includingdoforms emitted by macros) (#1028)
- Fix a bug where Basilisp did not respect the value of Python's
sys.dont_write_bytecodeflag when generating bytecode (#1054) - Fix a bug where Basilisp import names existed in the same namespace as
defnames, which caused some unexpected behavior (#1045)
- Added the
-p/--include-pathCLI command to prepend entries to thesys.pathas an alternative toPYTHONPATH(#1027) - Added an empty entry to
sys.pathfor 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
Varindirection for top-leveldoforms unless those forms specify^:use-var-indirectionmetadata (which currently is only used in thensmacro) (#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-functionscompiler option is disabled (#1023) - Fix a bug where
defrecord/deftypeconstructors could not be used in the type's methods (#1025) - Fix a bug where
keysandvalswould fail for records (#1030) - Fix a bug where operations on records created by
defrecordfailed 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
nilwith several collection functions (#1011) - Fix a bug where
keysandvalsdid not yield keys and values from sequences of map entries (#1018) - Fix a bug where
setandvecdo not produce collections of map entries when called on map arguments (#1020) - Fix lazy sequences not propagating
AttributeError(#1019)
- Added the
CollReduceandKVReduceprotocols inbasilisp.core.protocolsand implementedreducein terms of those protocols (#927) - Added support for custom data readers (#924)
- Added
*default-data-reader-fn*(#924) - Added
basilisp.pprint/print-tablefunction (#983) - Added
basilisp.core/read-seqfunction (#986, #999) - Added various compiler arguments to CLI commands (#989)
- Added support for destructuring namespaced symbols using the
:ns/symssyntax 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
deftypeandreifymay declare supertypes as abstract (taking precedence over trueabc.ABCtypes) and specify their member list using^:abstract-membersmetadata (#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/derefwith Clojure to by updating the timeout input argument to be in milliseconds instead of seconds (#1007)
- Fix inconsistent behavior with
basilisp.core/withwhen thebodycontains more than one form (#981) - Fix an issue with
basilisp.core/timefailing when called outsidebasilisp.core(#991) - Fix an issue with
basilisp.core/promisewhere 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
SyntaxWarnings would be emitted for certain compiled code (#996) - Fix an issue where 2- and 3-arity
rangeinvocations returned unexpected results (#1004)
- Removed
python-dateutilandreaderwriterlockas 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
keepandkeep-indexedtwo-arity forms not preserving the transformed values (#962) - Fixed an issue with
basilisp.test/iswhere the expected value was misreported on failure of non(= ...)expr (#965)
- Added
:end-lineand:end-colmetadata to forms during compilation (#903) - Added
basilisp.repl/sourceto allow inspecting source code from the REPL (#205) - Added
conj1 and 0 arities (#954)
- Updated dozens of type annotations in the compiler to satisfy MyPy 1.11 (#910)
- Update the
StreamReadermethods 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, andconjcan 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
symbolandkeywordwould 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
^:redefmetadata (#916) - Fix a bug where reader column offset numbering began at 1, rather than 0 (#905)
- Fix a bug where
basilisp.core/booleanwas 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.LazySeqinstances 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
throwspecial form (#862) - Added
basilisp.stacktracenamespace (#721) - Added support for
*flush-on-newline*to flush theprnandprintlnoutput stream after the last newline (#865) - Added support for binding destructuring in
forbindings (#774) - Added
==as an alias to=(#859) - Added custom exception formatting for
basilisp.lang.compiler.exception.CompilerExceptionandbasilisp.lang.reader.SyntaxErrorto show more useful details to users on errors (#870) - Added
merge-withcore function (#860) - Added
fnextcore function (#879) - Added
INamedinterface 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
remandquotmethodologies with corresponding Clojure fns (#848)
- Fix a bug where
basilisp.lang.compiler.exception.CompilerExceptionwould nearly always suppress line information in it'sdatamap (#845) - Fix a bug where the function returned by
partialretained the meta, arities, andwith_metamethod 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
concaton 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
recurforms 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
:tagmetadata 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 runand bypython -m(#791) - Added the
memoizecore 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
operatormodule into their corresponding native operators (#754) - Allow vars to be callable to adhere to Clojure conventions (#767)
- Adjust input path compatibility in
basilisp.core/loadinput 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.fieldAPIs (#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
caseforms with only a default expression (#807) - Make
pra dynamic variable (#820) - Emit OS specific line endings for the
printlnandprnfns (#810) - Support any character in character literals (#816)
- Loosen
typing-extensionsdependency'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
TypeErrorwhen used as a function on vectors (#770) - Fix an issue where the constructors of types created by
deftypeanddefrecordcould 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
nilwhen 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/ismay 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.stacktracewithprint-cause-trace(part of #721) - Added support for
bytesliterals using a#bprefix (#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
bencodebinary encoding (part of #412) - Ported nbb's nrepl-server module to basilisp (#412)
- Basilisp now supports PyTest 7.0+ (#660)
- Fix issue with
caseevaluating 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-bysupport for maps and boolean comparator fns (#709) - Fix
sortsupport for maps and boolean comparator fns (#711) - Fix
(is (= exp act))should only evaluate its args once on failure (#712) - Fix issue with
withfailing 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
internfailing when used (#725) - Fix issue with
nsnot being available afterin-nson the REPL (#718) - Fixed issue with import modules aliasing using ns eval (#719)
- Fix issue with
ns-resolvethrowing an error on macros (#720) - Fix issue with py module
readerwritelocklocks 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
astorfor versions of Python 3.9+ (#736) - Removed
basilisp.__version__in favor of usingimportlib.metadatafor version info (#617) - Removed a shim to Python's
astmodule 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.corefunctions 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
withmacro definition to match the Python language spec (#656) - Fixed a bug where
py->lispdid 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.ionamespace with polymorphic reader and writer functions (#645) - Added support for coroutines and generators using
yieldsyntax (#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/aredocstring 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
seqing 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
tryspecial form (#640) - Fixed a bug where re-
defing a Var (regardless of^:redefmetadata) 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
::kwsyntax (#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-catfunction 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_seqtobasilisp.lang.seqso it can be used within that module and bybasilisp.lang.runtimewithout 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.templatetobasilisp.templateto match Clojure (#599) - Refactor compiler to use
functools.singledispatchfor type based dispatch (#605) - Rename
List,Map,Set, andVectortoPersistentList,PersistentMap,PersistentSet, andPersistentVectorrespectively (#605)
- Fixed a bug where
defforms did not permit recursive references to thedef'ed Vars (#578) - Fixed a bug where
concatcould cause aRecursionErorif used on aLazySeqinstance 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 threadnilfirst arguments (#599)
- Removed
pyfunctionaldependency in favor of Python standard library functions (#589)
- Basilisp uses
poetryfor dependency and virtual environment management, as well as for publishing to PyPI (#616)
v0.1.dev14 - 2020-06-18
- Added support for
futures (#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
deftypes (#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.jsonnamespace (#484) - Added support for generically diffing Basilisp data structures in
basilisp.datanamespace (#555) - Added support for artificially abstract bases classes in
deftype,defrecord, andreifytypes (#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) getnow respondsnil(or its default) for any unsupported types (#570)nthnow supports only sequential collections (ornil) and will throw an exception for any invalid types (#570)- Use
functools.singledispatchfor to achieve higher performance polymorphism on most runtime functions (#552, #559) - Update the keyword cache to use a Python
threading.Lockrather than an Atom (#552) restno longer returnsnil, it always returns an empty sequence (#558)
- Fixed a bug where the Basilisp AST nodes for return values of
deftypemembers could be marked as statements rather than expressions, resulting in an incorrectnilreturn (#523) - Fixed a bug where
defoncewould throw a Python SyntaxError due to a superfluousglobalstatement 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
deftypecould not be referred to directly (defeating the purpose of the static or class method) (#537) - Fixed a bug where
deftypeforms 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
deftypeforms 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
imported 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
reducerequired 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
letfnspecial form (#473) - Added
defn-,declare, anddefoncemacros (#480) - Added EDN reader in the
basilisp.ednnamespace (#477) - Added line, column, and file information to reader
SyntaxErrors (#488) - Added context information to the
CompilerExceptionstring output (#493) - Added Array (Python list) functions (#504, #509)
- Added shell function in
basilisp.shellnamespace (#515) - Added
apply-templatefunction tobasilisp.core.templatenamespace (#516)
- Change the default user namespace to
basilisp.user(#466) - Changed multi-methods to use a
threading.Lockinternally rather than an Atom (#478) - Changed the Basilisp module type from
types.ModuleTypeto a custom subtype with support for custom attributes (#482) - Basilisp's runtime function
Namespace.get_or_createno longer refersbasilisp.coreby default, which allows callers to excludebasilisp.corenames in thensmacro (#481) - Namespaces now use a single internal lock rather than putting each property inside of an Atom (#494)
- Refactor the testrunner to use fewer
atoms 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
quotespecial 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.walknamespace with generic tree-walker functions (#434) - Added several new higher-order functions (#433)
- Added
basilisp.templatenamespace with templating utility functions (#433) - Added
basilisp.test/arefor 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
Makefileutility for generating the Python code forbasilisp.core(#456)
- Compile
attrsinstances internally withoutcmpkeyword argument forattrs>= 19.2.0 (#448) - Small Python changes in the compiler to remove redundant operations (#450)
- Fixed an issue where
macroexpandandmacroexpand-1attempted 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
ISeqiterators could stack overflow for long sequences (#445) - Fixed the
importertest suite's use ofmultiprocessingfor Python 3.8 (#446) - Correct the
with-metainterface 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
macroexpandandmacroexpand-1functions (#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
ILookupinterface toIAssociative(#410) - Support for Reader Conditional syntax (#409)
- Python builtins may now be accessed using the
pythonnamespace 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
bindingbehavior to usepush-thread-bindingsandpop-thread-bindings, which use a thread-local for bindings, to more closely emulate Clojure (#405) - Internal
IAsssociative.entryusages 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.interfacesmodule (#370) - Organize interface hierarchy to match Clojure's (#372)
- Compile qualified
basilisp.lang.*module references down to aliased references (#366) letandloopforms 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)
defnforms 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
asyncfunctions (via:asyncmetadata ordefasyncform) and newawaitspecial form (#342) - Symbol and keyword completion at the REPL if
readlineis available (#340) - Macro environment is now being passed as the first argument of macros (#339)
- Create Python literals using
#pyreader 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
defforms 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
dictforlreprkwargs generation (#331) - Attach line and column metadata to functions, quoted, and deref forms (#333)
- Log internal
nthmessages asTRACErather thanDEBUG(#335)
v0.1.dev7 - 2018-12-18
- Add
loopspecial form (#317) - Add Lisp
reprsupport usingLispObjectabstract base class (#316) - Python imports may be aliased like
requireusing 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-resolvecan 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
fnand 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
catchblocks (#273) - Loosen syntax requirements for interop properties (#276)
- Fix
basilisp.core/maplazy 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.groupedfrom PyFunctional which throwStopIterationexceptions and cause Basilisp to be unusable with Python 3.7 (#221) - Fix a bug where the wrong namespace may be set in
deftestdefined 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/deftestmacro (#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_pathmultiple 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
docandpydocwill 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
\asyntax - 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 takencatchexpressions 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
Maptype now supportsconsing other maps. - Syntax quoted special forms are no longer resolved into namespaced symbols
v0.1.dev0 - 2018-08-31
- Basilisp language and compiler base.