Releases: hylang/hy
1.0.0 ("Afternoon Review")
Supports Python 3.8 – Python 3.13
See also the announcement post for this release.
Bug Fixes
- Fixed a crash on Python 3.12.6.
- Keyword objects can now be compared to each other with
<
etc. - The order of evaluation in multi-item
with
s now matches that of nested one-itemwith
s. - Fixed a bug in which the REPL misinterpreted the symbol
pass
.
0.29.0
Removals
hy.disassemble
has been removed.(defn/a …)
is now(defn :async …)
.(fn/a …)
is now(fn :async …)
.(with/a […] …)
is now(with [:async …] …)
.- As with
for
,:async
must precede each name to be bound asynchronously, because you can mix synchronous and asynchronous types.
- As with
(yield-from …)
is now(yield :from …)
.
New Features
- You can now set
repl-ps1
andrepl-ps2
in yourHYSTARTUP
to customizesys.ps1
andsys.ps2
for the Hy REPL.
Bug Fixes
- Tracebacks now point to the correct code in more cases.
help
should no longer crash when objects are missing docstrings.hy -i < script.hy
now executesscript.hy
inside the REPL environment, like Python.
0.28.0
Removals
doc
has been removed. Use(help (get-macro foo))
or(help (get-macro :reader foo))
instead.delmacro
has been removed. Use(eval-when-compile (del (get _hy_macros (hy.mangle "foo"))))
instead.hy.reserved
has been removed. Use(.keys (builtins._hy_macros))
or Python's built-inkeyword
module instead.- The environment variables
HY_DEBUG
andHY_FILTER_INTERNAL_ERRORS
have been replaced withHY_SHOW_INTERNAL_ERRORS
.
Other Breaking Changes
defmacro
andrequire
can now define macros locally instead of only module-wide.- When a macro is
require
\d from another module, that module is no longer implicitly included when checking for further macros in the expansion. hy.M
has been renamed tohy.I
.hy.eval
has been overhauled to be more like Python'seval
. It also has a new parametermacros
.hy.macroexpand
andhy.macroexpand-1
have been overhauled and generalized to include more of the features ofhy.eval
.hy
now only implicitly launches a REPL if standard input is a TTY.hy -i
has been overhauled to work as a flag likepython3 -i
.hy2py
now requires-m
to specify modules, and uses the samesys.path
rules as Python when parsing a module vs a standalone script.- New macro
deftype
. - New macro
get-macro
. - New macro
local-macros
.
New Features
- New syntax
(hy.R.aaa/bbb.m …)
for calling the macrom
from the moduleaaa.bbb
without bringingm
oraaa.bbb
into scope. nonlocal
now also works for globally defined names.defn
,defn/a
, anddefclass
now support type parameters.HyReader
now has an optional parameter to install existing reader macros from the calling module.- New pragma
warn-on-core-shadow
.
Misc. Improvements
- Some syntax errors raised by core macros now have more informative messages.
- Logical operators now compile to simpler Python code in some cases.
Bug Fixes
- Implicit returns are now disabled in async generators.
- Fixed parsing of infinite and NaN imaginary literals with an uppercase "J".
- Double quotes inside of bracketed f-strings are now properly handled.
- Fixed incomplete recognition of macro calls with a unary dotted head like
((. defn) f [])
. ~@ #*
now produces a syntax error instead of a nonsensical result.nonlocal
now works for top-levellet
-bound names.require
now warns when you shadow a core macro, likedefmacro
already did.- Fixed
hy.eval
failing ondefreader
orrequire
forms that install a new reader. - The parameter
result-ok
that was mistakenly included in the signature ofhy.macroexpand
is now gone. hy -i
with a filename now skips shebang lines.
0.27.0
Removals
- Python 3.7 is no longer supported.
Other Breaking Changes
- Reader macros now always read a full identifier after the initial
#
. Thus,#*foo
is now parsed as a call to the reader macro named*foo
; to unpack a variable namedfoo
, say#* foo
. - The names of reader macros names are no longer mangled.
- Question marks (
?
) are no longer mangled specially, sofoo?
now mangles tohyx_fooXquestion_markX
instead ofis_foo
. hy2py
's recursive mode now expects a module name as input, not any old directory. You must be in the parent directory of the module directory.
New Features
- Python 3.12 is now supported.
- New built-in object
hy.M
for easy imports in macros. cut
now has a function version inhy.pyops
.- The
py
macro now implicitly parenthesizes the input code, so Python's indentation restrictions don't apply. try
no longer requiresexcept
,except*
, orfinally
, and it allowselse
even withoutexcept
orexcept*
.nonlocal
andglobal
can now be called with no arguments, in which case they're no-ops.- For easier reading,
hy --spy
now prints a delimiter after the Python equivalent of your code, before the result of evaluating the code.
Bug Fixes
- Fixed an installation failure in some situations when version lookup fails.
- Fixed some bugs with traceback pointing.
- Fixed some bugs with escaping in bracket f-strings
- The parser no longer looks for shebangs in the REPL or
hy -c
. require
with relative module names should now work correctly withhy -m
, as well ashy2py
's recursive mode.hy.models.Symbol
no longer allows constructing a symbol beginning with#
.
0.26.0
Removals
- Coloring error messages and Python representations for models is no longer supported. (Thus, Hy no longer depends on
colorama
.)
Other Breaking Changes
-
Various warts have been smoothed over in the syntax of
'
, `,~
, and~@
:- Whitespace is now allowed after these syntactic elements. Thus one can apply
~
to a symbol whose name begins with "@". - ` and
~
are no longer allowed in identifiers. (This was already the case for'
.) - The bitwise NOT operator
~
has been renamed tobnot
.
- Whitespace is now allowed after these syntactic elements. Thus one can apply
-
Dotted identifiers like
foo.bar
and.sqrt
now parse as expressions (like(. foo bar)
and(. None sqrt)
) instead of symbols. Some odd cases likefoo.
andfoo..bar
are now syntactically illegal. -
New macro
do-mac
. -
New macro
pragma
(although it doesn't do anything useful yet). -
hy.cmdline.HyREPL
is nowhy.REPL
. -
Redundant scripts named
hy3
,hyc3
, andhy2py3
are no longer installed. Usehy
,hyc
, andhy2py
instead.
New Features
- Pyodide is now officially supported.
.
,..
, etc. are now usable as ordinary symbols (with the remaining special rule that...
compiles toEllipsis
).- On Pythons ≥ 3.7, Hy modules can now be imported from ZIP archives in the same way as Python modules, via
zipimport
_. hy2py
has a new command-line option--output
.hy2py
can now operate recursively on a directory.
Bug Fixes
hy.REPL
now restores the global values it changes (such assys.ps1
) afterhy.REPL.run
terminates.hy.REPL
no longer mixes up Hy's and Python's Readline histories when run inside Python's REPL.- Fixed
hy.repr
of non-compilable uses of sugared macros, such as(quote)
and(quote 1 2)
.
0.25.0
Breaking Changes
dfor
no longer requires brackets around its final arguments, so(dfor x (range 5) [x (* 2 x)])
is now(dfor x (range 5) x (* 2 x))
.except*
(PEP 654) is now recognized intry
, and a placeholder macro forexcept*
has been added.
New Features
- Python 3.11 is now supported.
Bug Fixes
__file__
should now be set the same way as in Python.\N{…}
escape sequences are now recognized in f-strings.- Fixed a bug with
python -O
where assertions were still partly evaluated. - Fixed
hy.repr
ofslice
objects with non-integer arguments.
Misc. Improvements
hyc
now requires a command-line argument.hyc
prints each path it writes bytecode to, and its messages now go to standard error instead of standard output.
0.24.0
This release is a direct successor to 1.0a4. We've returned to 0.* version numbers to work around the inflexibility of PyPI and pip regarding the default version to install. (We skipped some version numbers because this release is several major releases since 0.20.0.) Sorry for the mess.
Removals
- Tag macros have been removed. Use reader macros instead, rewriting
(defmacro "#foo" [arg] …)
as(defreader foo (setv arg (.parse-one-form &reader)) …)
. with-decorator
and#@
have been removed in favor of decorator lists (see below).- Fraction literals have been removed. Use
fractions.Fraction
instead. - Unrecognized backslash escapes in string and byte literals are no longer allowed. (They've been deprecated in Python since 3.6.)
- A bare
#
is no longer a legal symbol. u
is no longer allowed as a string prefix. (It had no effect, anyway.)hy.read-str
has been removed. Usehy.read
, which now accepts strings, instead.
Other Breaking Changes
-
Tuples are now indicated with
#( … )
, as in#(1 2 3)
, instead of(, … )
, as in(, 1 2 3)
. -
Tuples have their own model type,
hy.models.Tuple
, instead of being represented asExpression
\s. -
if
now requires all three arguments. For the two-argument case (i.e., with no else-clause),when
is a drop-in replacement. -
cond
has a new unbracketed syntax:(cond [a b] [x y z]) ; Old (cond a b x (do y z)) ; New
-
defmacro
once again requires the macro name as a symbol, not a string literal. -
Annotations are now indicated by
#^
instead of^
. -
annotate
(but not#^
) now takes the target first and the type second, as in(annotate x int)
. -
The way f-strings are parsed has changed, such that unescaped double quotes are now allowed inside replacement fields.
-
Non-ASCII whitespace is no longer ignored during tokenization like ASCII whitespace.
-
The mangling rules have been refined to account for Python's treatment of distinct names as referring to the same variable if they're NFKC-equivalent. Very little real code should be affected.
-
hy.cmdline.run_repl
has been replaced withhy.cmdline.HyREPL.run
.
New Features
-
Added user-defined reader macros, defined with
defreader
. -
defn
anddefclass
now allow a decorator list as their first argument. -
...
is now understood to refer toEllipsis
, as in Python. -
Python reserved words are allowed once more as parameter names and keyword arguments. Hy includes a workaround for a CPython bug that prevents the generation of legal Python code for these cases (cpython#90678).
-
New macro
export
.- Or you can set the variable
_hy_export_macros
to control what macros are collected by(require module *)
.
- Or you can set the variable
-
New macro
delmacro
. -
New function
hy.read_many
. -
New function
hy.model_patterns.parse_if
. -
New function
hy.model_patterns.in_tuple
. -
Added a command-line option
-u
(or--unbuffered
) per CPython. -
Tab-completion in the REPL now attempts to unmangle names.
Bug Fixes
- Fixed a crash when using keyword objects in
match
. - Fixed a scoping bug in comprehensions in
let
bodies. - Literal newlines (of all three styles) are now recognized properly in string and bytes literals.
defmacro
no longer allows further arguments after#* args
.!=
with model objects is now consistent with=
.- Tracebacks from code parsed with
hy.read
now show source positions. - Elements of
builtins
such ashelp
are no longer overridden until the REPL actually starts. - Readline is now imported only when necessary, to avoid triggering a CPython bug regarding the standard module
curses
(cpython#46927). - Module names supplied to
hy -m
are now mangled. - Hy now precompiles its own Hy code during installation.
1.0a4
Removals
- Python 3.6 is no longer supported.
Other Breaking Changes
-
import
andrequire
no longer need outer brackets.(import [foo [bar]])
is now(import foo [bar])
and(import [foo :as baz])
is now(import foo :as baz)
. To import all names from a module, use(import foo *)
. -
Lots of objects (listed below) have been spun off to a new package called Hyrule, from which you can
import
orrequire
them. Thus Hy now brings only thehy
module and a limited set of core macros into scope automatically.- Functions:
butlast
,coll?
,constantly
,dec
,destructure
,distinct
,drop-last
,end-sequence
,flatten
,inc
,macroexpand-all
,parse-args
,pformat
,postwalk
,pp
,pprint
,prewalk
,readable?
,recursive?
,rest
,saferepr
,walk
- Classes:
PrettyPrinter
,Sequence
- Macros:
#%
,#:
,->
,->>
,ap-dotimes
,ap-each
,ap-each-while
,ap-filter
,ap-first
,ap-if
,ap-last
,ap-map
,ap-map-when
,ap-reduce
,ap-reject
,as->
,assoc
,cfor
,comment
,defmacro!
,defmacro/g!
,defmain
,defn+
,defn/a+
,defseq
,dict=:
,do-n
,doto
,fn+
,fn/a+
,ifp
,let+
,lif
,list-n
,loop
,ncut
,of
,profile/calls
,profile/cpu
,seq
,setv+
,smacrolet
,unless
,with-gensyms
- Functions:
-
Functions that provide first-class Python operators, such as
+
in constructs like(reduce + xs)
, are no longer brought into scope automatically. Say(import hy.pyops *)
to get them. -
Hy scoping rules more closely follow Python scoping in certain edge cases.
-
let
is now a core macro with somewhat different semantics. In particular, definition-like core macros (defn
,defclass
,import
) now introduce new names that shadow correspondinglet
-bound names and persist outside the body of thelet
. -
The constructors of
String
andFString
now check that the input would be syntactically legal as a literal. -
hy.extra.reserved
has been renamed tohy.reserved
.
New Features
hy.repr
now supports several more standard types.- The attribute access macro
.
now allows method calls. For example,(. x (f a))
is equivalent to(x.f a)
. hy.as-model
checks for self-references in its argument.- New function
hy.model_patterns.keepsym
.
Bug Fixes
- In comprehension forms other than
for
, assignments (other than:setv
and loop clauses) are now always visible in the surrounding scope. match
now only evaluates the subject once.let
will no longer re-evaluate the default arguments of a
function it's used in.hy.repr
now properly formats bracket strings.- The
repr
andstr
of string models now includebrackets
if necessary. - When standard output can't accommodate Unicode,
hy2py
now crashes instead of emitting incorrect Python code. - Fixed a bug with self-requiring files on Windows.
- Improved error messages for illegal uses of
finally
andelse
.
1.0a3
Bug Fixes
- Fixed a dependency-management bug that prevented installation of Hy from a wheel on Pythons < 3.9.
1.0a2
Removals
-
All reimplementations of functions in the package Toolz have been removed. Import these from Toolz (or CyToolz) instead. Beware that the Toolz functions are not all drop-in replacements for the old Hy functions; e.g.,
partition
has a different order of parameters.complement
,compose
(formerlycomp
in Hy),drop
,first
,identity
,interleave
,interpose
,iterate
,juxt
,last
,merge-with
,nth
,partition
,second
,take-nth
,take
-
All aliases of objects in Python's standard library have been removed. Import these objects explicitly instead.
- From
itertools
:accumulate
,chain
,combinations-with-replacement
(formerlymulticombinations
in Hy),combinations
,compress
,count
,cycle
,dropwhile
(formerlydrop-while
),filterfalse
(formerlyremove
),groupby
(formerlygroup-by
),islice
,permutations
,product
,repeat
,starmap
(formerly*map
),takewhile
(formerlytake-while
),tee
,zip-longest
- From
functools
:reduce
- From
fractions
:Fraction
(formerlyfraction
)
- From
-
The following core predicate functions have been removed. Use
isinstance
etc. instead.empty?
,even?
,every?
,float?
,integer-char?
,integer?
,iterable?
,iterator?
,keyword?
,list?
,neg?
,none?
,numeric?
,odd?
,pos?
,some
,string?
,symbol?
,tuple?
,zero?
-
Several other core functions and macros have been removed:
keyword
: Use(hy.models.Keyword (hy.unmangle …))
instead.repeatedly
: Usetoolz.iterate
instead.if-not
: Use(if (not …) …)
instead.lif-not
: Use(lif (not …) …)
instead.macro-error
: Useraise
instead.calling-module
: Now internal to Hy.calling-module-name
: Now internal to Hy.
Other Breaking Changes
-
if
no longer allows more than three arguments. Usecond
instead. -
cut
with exactly two arguments (the object to be cut and the index) now works like Python slicing syntax and theslice
function:(cut x n)
gets the firstn
elements instead of everything after the firstn
. -
In
defn
, the return-value annotation, if any, is now placed before the function name instead of after. -
Python reserved words are no longer allowed as parameter names, nor as keywords in keyword function calls.
-
Hy model objects are no longer equal to ordinary Python values. For example,
(!= 1 '1)
. You can promote values to models withhy.as-model
before making such a check. -
The following functions are now called as attributes of the
hy
module:hy.disassemble
,hy.gensym
,hy.macroexpand
,hy.macroexpand-1
,hy.repr
(formerlyhy.contrib.hy-repr.hy-repr
),hy.repr-register
(formerlyhy.contrib.hy-repr.hy-repr-register
)
-
cmp
has been renamed tochainc
. -
defclass
no longer automatically addsNone
to the end of__init__
method definitions. -
All special forms have been replaced with macros. This won't affect most preexisting code, but it does mean that user-defined macros can now shadow names like
setv
. -
hy.repr
no longer uses the registered method of a supertype. -
The constructors of
Symbol
andKeyword
now check that the input would be syntactically legal. -
Attempting to call a core macro not implemented on the current version of Python is now an error.
-
hy.extra.reserved.special
has been replaced withhy.extra.reserved.macros
.
New Features
hy-repr
is now the default REPL output function.- The command
python -m hy
now works the same ashy
. - New function
hy.as-model
. - New macro
match
(Python 3.10 only). annotate
is now a user-visible macro.
Bug Fixes
- Fixed issues with newer prereleases of Python 3.10.
- The REPL now properly displays
SyntaxError
s. - Fixed a bug in
pprint
in whichwidth
was ignored. - Corrected
repr
andhy.repr
for f-strings. --spy
and--repl-output-fn
can now overwriteHYSTARTUP
values.