Releases: hylang/hy
1.0a1
Removals
- The core function
name
has been removed. Useunmangle
or thename
attribute of keyword objects instead. deftag
has been removed. Instead of(deftag foo …)
, say(defmacro "#foo" …)
.#doc
has been removed. Instead of#doc @
, say(doc "#@")
.__tags__
has been removed. Tag macros are now tracked in__macros__
.
Other Breaking Changes
- Lambda lists (function parameter lists) have been simplified.
&optional
is gone,&args
is#*
,&kwargs
is#**
, and&kwonly
is*
. Thus,[a &optional b [c 3] &rest args &kwargs kwargs]
is now[a [b None] [c 3] #* args #** kwargs]
. - Hy models have been renamed to remove "Hy", and are no longer automatically brought into scope. Thus,
HyList
is nowhy.models.List
. eval
is no longer automatically brought into scope. Call it ashy.eval
(or import it explicitly).- Calling a keyword object now does a string lookup, instead of a keyword-object lookup. Thus,
(:key obj)
is equivalent to(get obj (mangle (. :key name)))
. - To require a tag macro
foo
, instead of(require [module [foo]])
, you must now say(require [module ["#foo"]])
. - Mangling no longer converts leading hyphens to underscores, and unmangling no longer converts leading underscores to hyphens.
- F-strings now have their own model type, and store their code parts as models instead of strings.
New Features
- Python 3.10 is now supported.
- Lambda lists now support positional-only arguments.
- F-strings now support
=
syntax per Python. with
now supports unnamed context managers.defmacro
andrequire
can now take macro names as string literals.- New standard macros
do-n
,list-n
, andcfor
. - The location of the REPL history file can now be set with the environment variable
HY_HISTORY
. - REPL initialization scripts are now supported with the envrionment variable
HYSTARTUP
. - The module
hy.extra.reserved
has a new functionspecial
. - New module
hy.contrib.destructure
for Clojure-style destructuring. - New module
hy.contrib.slicing
for multi-index sequence slicing.
Bug Fixes
- Fixed the identifier
J
being incorrectly parsed as a complex number. - Attempts to assign to constants are now more reliably detected.
- Fixed a bug where AST nodes from macro expansion did not properly receive source locations.
- Fixed
doc
sometimes failing to find core macros. doc
now works with names that need mangling.- Fixed bugs with
require
of names that need mangling. - Fixed a compiler crash from trying to use
..
as an operator. - Fixed namespace pollution caused by automatic imports of Hy builtins and macros.
require
now works with relative imports and can name modules as members, as in(require [hy.contrib [walk]])
.- Fixed error handling for illegal macro names.
- Fixed
hyc
andhy2py
not finding relative imports. - Fixed
hy.contrib.walk.smacrolet
requiring a module name.
Misc. Improvements
- The library
astor
is no longer required on Pythons ≥ 3.9.
0.20.0
Removals
- Python 3.5 is no longer supported.
New Features
let
macro now supports extended iterable unpacking syntax.- New contrib module
pprint
, a Hy equivalent ofpython.pprint
.
Bug Fixes
- Fixed a bug that made
hy.eval
from Python fail onrequire
. - Fixed a bug that prevented pickling of keyword objects.
- Fixed a compiler crash from
setv
with an odd number of arguments indefclass
.
0.19.0
Breaking Changes
parse-args
is no longer implemented witheval
; so e.g. you should now say:type int
instead of:type 'int
.
New Features
- Python 3.9 is now supported.
Bug Fixes
- Improved support for nesting anaphoric macros by only applying symbol replacement where absolutely necessary.
- Quoted f-strings are no longer evaluated prematurely.
- Fixed a regression in the production of error messages for empty expressions.
- Fixed a scoping bug for code executed with
hy -c
. - Fixed a bug in the compilation of multiple
require
s. - Fixed various bugs in command-line option parsing.
0.18.0
Removals
- Python 2 is no longer supported.
- Support for attribute lists in
defclass
has been removed. Usesetv
anddefn
instead. - Literal keywords are no longer parsed differently in calls to functions with certain names.
hy.contrib.multi
has been removed. Usecond
or the PyPI packagemultipledispatch
instead.
Other Breaking Changes
HySequence
is now a subclass oftuple
instead oflist
. Thus, aHyList
will never be equal to alist
, and you can't use.append
,.pop
, etc. on aHyExpression
orHyList
.
New Features
- Added special forms
py
topys
that allow Hy programs to include inline Python code. - Added a special form
cmp
for chained comparisons. - All augmented assignment operators (except
%=
and^=
) now allow more than two arguments. - Added support for function annotations (PEP 3107) and variable annotations (PEP 526).
- Added a function
parse-args
as a wrapper for Python'sargparse
.
Bug Fixes
- Statements in the second argument of
assert
are now executed. - Fixed a bug that caused the condition of a
while
to be compiled twice. in
andnot-in
now allow more than two arguments, as in Python.hy2py
can now handle format strings.- Fixed crashes from inaccessible history files.
- Removed an accidental import from the internal Python module
test
. - Fixed a swarm of bugs in
hy.extra.anaphoric
.
Misc. Improvements
- Replaced the dependency
clint
withcolorama
.
0.17.0
Warning: Hy 0.17.x will be the last Hy versions to support Python 2, and we expect 0.17.0 to be the only release in this line. By the time 0.18.0 is released (in 2020, after CPython 2 has ceased being developed), Hy will only support Python 3.
Removals
- Python 3.4 is no longer supported.
New Features
- Python 3.8 is now supported.
- Format strings with embedded Hy code (e.g.,
f"The sum is {(+ x y)}"
) are now supported, even on Pythons earlier than 3.6. - Added a special form
setx
to create Python 3.8 assignment expressions. - Added new core functions
list?
andtuple
. - Gensyms now have a simpler format that's more concise when mangled (e.g.,
_hyx_XsemicolonXfooXvertical_lineX1235
is now_hyx_fooXUffffX1
).
Bug Fixes
- Fixed a crash caused by errors creating temporary files during bytecode compilation.
0.16.0
Removals
- Empty expressions (
()
) are no longer legal at the top level.
New Features
eval
/hy_eval
andhy_compile
now accept an optionalcompiler
argument that enables the use of an existingHyASTCompiler
instance.- Keyword objects (not just literal keywords) can be called, as shorthand for
(get obj :key)
, and they accept a default value as a second argument. - Minimal macro expansion namespacing has been implemented. As a result, external macros no longer have to
require
their own macro dependencies. - Macros and tags now reside in module-level
__macros__
and__tags__
attributes.
Bug Fixes
- Cleaned up syntax and compiler errors.
- You can now call
defmain
with an empty lambda list. require
now compiles to Python AST.- Fixed circular
require
\s. - Fixed module reloading.
- Fixed circular imports.
- Fixed errors from
from __future__ import ...
statements and missing Hy module docstrings caused by automatic importing of Hy builtins. - Fixed
__main__
file execution. - Fixed bugs in the handling of unpacking forms in method calls and attribute access.
- Fixed crashes on Windows when calling
hy-repr
on date and time objects. - Fixed a crash in
mangle
for some pathological inputs. - Fixed incorrect mangling of some characters at low code points.
- Fixed a crash on certain versions of Python 2 due to changes in the standard module
tokenize
.
0.15.0
Removals
- Dotted lists,
HyCons
,cons
,cons?
, andlist*
have been removed. These were redundant with Python's built-in data structures and Hy's most common model types (HyExpression
,HyList
, etc.). &key
is no longer special in lambda lists. Use&optional
instead.- Lambda lists can no longer unpack tuples.
ap-pipe
andap-compose
have been removed. Use threading macros andcomp
instead.for/a
has been removed. Use(for [:async ...] ...)
instead.(except)
is no longer allowed. Use(except [])
instead.(import [foo])
is no longer allowed. Use(import foo)
instead.
Other Breaking Changes
-
HyExpression
,HyDict
, andHySet
no longer inherit fromHyList
. This means you can no longer use alternative punctuation in place of square brackets in special forms (e.g.(fn (x) ...)
instead of the standard(fn [x] ...)
). -
Mangling rules have been overhauled; now, mangled names are always legal Python identifiers.
-
_
and-
are now equivalent, even as single-character names.- The REPL history variable
_
is now*1
.
- The REPL history variable
-
Non-shadow unary
=
,is
,<
, etc. now evaluate their argument instead of ignoring it. -
list-comp
,set-comp
,dict-comp
, andgenexpr
have been replaced bylfor
,sfor
,dfor
, andgfor
, respectively, which use a new syntax and have additional features. All Python comprehensions can now be written in Hy. -
&
-parameters in lambda lists must now appear in the same order that Python expects. -
Literal keywords now evaluate to themselves, and
HyKeyword
no longer inherits from a Python string type -
HySymbol
no longer inherits fromHyString
.
New Features
- Python 3.7 is now supported.
while
andfor
are allowed to have empty bodies.for
supports the various new clause types offered bylfor
.defclass
in Python 3 supports specifying metaclasses and other keyword arguments.- Added
mangle
andunmangle
as core functions. - Added more REPL history variables:
*2
and*3
. - Added a REPL variable holding the last exception:
*e
. - Added a command-line option
-E
per CPython. - Added a new module
hy.model_patterns
.
Bug Fixes
hy2py
should now output legal Python code equivalent to the input Hy code in all cases.- Fixed
(return)
so it can exit a Python 2 generator. - Fixed a case where
->
and->>
duplicated an argument. - Fixed bugs that caused
defclass
to drop statements or crash. - Fixed a REPL crash caused by illegal backslash escapes.
NaN
can no longer create an infinite loop during macro-expansion.- Fixed a bug that caused
try
to drop expressions. - The compiler now properly recognizes
unquote-splice
. - Trying to import a dotted name is now a syntax error, as in Python.
defmacro!
now allows optional arguments.- Fixed handling of variables that are bound multiple times in a single
let
.
Misc. Improvements
hy-repr
uses registered functions instead of methods.hy-repr
supports more standard types.
0.14.0
Removals
- Python 3.3 is no longer supported
def
is gone; usesetv
insteadapply
is gone; use the new#*
and#**
syntax insteadyield-from
is no longer supported under Python 2- Periods are no longer allowed in keywords
- Numeric literals can no longer begin with a comma or underscore
- Literal
Inf
\s andNaN
\s must now be capitalized like that
Other Breaking Changes
- Single-character "sharp macros" are now "tag macros", which can have longer names
xi
fromhy.extra.anaphoric
is now a tag macro#%
eval
is now a function instead of a special form
New Features
- The compiler now automatically promotes values to Hy model objects as necessary, so you can write
(eval `(+ 1 ~n))
instead of(eval `(+ 1 ~(HyInteger n)))
return
has been implemented as a special form- Added a form of string literal called "bracket strings" delimited by
#[FOO[
and]FOO]
, whereFOO
is customizable - Added support for PEP 492 (
async
andawait
) withfn/a
,defn/a
,with/a
, andfor/a
- Added Python-style unpacking operators
#*
and#**
(e.g.,(f #* args #** kwargs)
) - Added a macro
comment
- Added EDN
#_
syntax to discard the next term while
loops may now contain anelse
clause, likefor
loops#%
works on any expression and has a new&kwargs
parameter%**
- Added a macro
doc
and a tag macro#doc
get
is available as a function~@
(unquote-splice
) form now accepts any false value as empty
Bug Fixes
- Relative imports (PEP 328) are now allowed
- Numeric literals are no longer parsed as symbols when followed by a dot and a symbol
- Hy now respects the environment variable
PYTHONDONTWRITEBYTECODE
- String literals should no longer be interpreted as special forms or macros
- Tag macros (née sharp macros) whose names begin with
!
are no longer mistaken for shebang lines - Fixed a bug where REPL history wasn't saved if you quit the REPL with
(quit)
or(exit)
exec
now works under Python 2- No TypeError from multi-arity
defn
returning values evaluating toNone
try
forms are now possible indefmacro
anddeftag
- Multiple expressions are now allowed in
try
- Fixed a crash when
macroexpand
\ing a macro with a named import - Fixed a crash when
with
suppresses an exception.with
now returnsNone
in this case. - Fixed a crash when
--repl-output-fn
raises an exception - Fixed a crash when
HyTypeError
was raised with objects that had no source position assoc
now evaluates its arguments only once each- Multiple expressions are now allowed in the
else
clause of afor
loop else
clauses infor
andwhile
are recognized more reliably- Statements in the condition of a
while
loop are repeated properly - Argument destructuring no longer interferes with function docstrings
- Nullary
yield-from
is now a syntax error break
andcontinue
now raise an error when given arguments instead of silently ignoring them
Misc. Improvements
read
,read_str
, andeval
are exposed and documented as top-level functions in thehy
module- An experimental
let
macro has been added tohy.contrib.walk
0.13.1
Changed setup.py to require astor 0.5, since 0.6 isn't backwards-compatible.
0.13.0
Language Changes
- Pythons 2.6, 3.0, 3.1, and 3.2 are no longer supported
let
has been removed. Python's scoping rules do not make a proper implementation of it possible. Usesetv
instead.lambda
has been removed, butfn
now does exactly whatlambda
diddefreader
has been renamed todefsharp
; what were previously called "reader macros", which were never true reader macros, are now called "sharp macros"try
now enforces the usual Python order for its elements (else
must follow allexcept
s, andfinally
must come last). This is only a syntactic change; the elements were already run in Python order even when defined out of order.try
now requires anexcept
orfinally
clause, as in Python- Importing or executing a Hy file automatically byte-compiles it, or loads a byte-compiled version if it exists and is up to date. This brings big speed boosts, even for one-liners, because Hy no longer needs to recompile its standard library for every startup.
- Added bytestring literals, which create
bytes
objects under Python 3 andstr
objects under Python 2 - Commas and underscores are allowed in numeric literals
- Many more operators (e.g.,
**
,//
,not
,in
) can be used as first-class functions - The semantics of binary operators when applied to fewer or more than two arguments have been made more logical
(** a b c d)
is now equivalent to(** a (** b (** c d)))
, not(** (** (** a b) c) d)
setv
always returnsNone
- When a
try
form executes anelse
clause, the return value for thetry
form is taken fromelse
instead of thetry
body. For example,(try 1 (except [ValueError] 2) (else 3))
returns3
. xor
: If exactly one argument is true, return ithy.core.reserved
is nowhy.extra.reserved
cond
now supports single argument branches
Bug Fixes
- All shadowed operators have the same arities as real operators
- Shadowed comparison operators now use
and
instead of&
for chained comparisons partition
no longer prematurely exhausts input iteratorsread
andread-str
no longer raise an error when the input parses to a false value (e.g., the empty string)- A
yield
inside of awith
statement will properly suppress implicit returns setv
no longer unnecessarily tries to get attributesloop
no longer replaces string literals equal to "recur"- The REPL now prints the correct value of
do
andtry
forms - Fixed a crash when tokenizing a single quote followed by whitespace
Misc. Improvements
- New contrib module
hy-repr
- Added a command-line option
--repl-output-fn