Crystal 1.9.0 is released!
We are delivering a new Crystal release with several bugfixes and improvements.
Pre-built packages are available on GitHub Releases and our official distribution channels. See crystal-lang.org/install for installation instructions.
Stats
Section titled StatsThis release includes 167 changes since 1.8.2 by 27 contributors. We thank all the contributors for all the effort put into improving the language! ❤️
Changes
Section titled ChangesBelow we list the most remarkable changes in the language, compiler and stdlib. For more details, visit the changelog.
Breaking: Big number comparisons with floats
Section titled Breaking: Big number comparisons with floatsComparisons of Big number types against floats were fixed to respect special
values such as NAN
. As a result, the implementation of the comparison operator
#<=>
between Big*
(BigDecimal
, BigFloat
, BigInt
, BigRational
) and
Float::Primitive
(Float32
, Float64
) number types is now nilable.
When invoking these comparisons, Nil
values must be handled explicitly.
Windows
Section titled WindowsThe compiler and standard library take a big step improving Windows support. Only few outstanding issues remain and we expect them to be resolved in the following months.
Most notable features are a GUI installer (available in the release artifacts)
and dynamic linking of DLLs (currently available via compiler flag
-Dpreview_dll
).
More details and additional features are listed in a separate post about Windows support in Crystal 1.9.
Language
Section titled LanguageThere are two new macros in the language:
ASTNode#warning
is similar to#raise
but only creates a warning (#13262).::print
is similar to::puts
but without the trailing newline (#13336).
Standard library
Section titled Standard libraryDefault interrupt handlers are now in place to trigger at_exit
handlers
if the process is interrupted (#13568).
Instead of a single boolean parameter, file matching behaviour of Dir.glob
is controlled by File::MatchOptions
with portable options (#13550).
The stdlib spec suite makes good use of the spec helper assert_prints
and it’s
now available for user specs as well (#13599).
There’s a new method Regex#match!
with a non-nilable return type
(Regex::MatchData
) which is helpful if the regex is expected to match.
regex.match!(x)
is a convenient replacement for regex.match(x).not_nil!
(#13285).
All methods accepting a Regex
for matching now also have a parameter for
Regex::MatchOptions
(#13353).
Compiler
Section titled CompilerA new compiler command crystal clear_cache
offers a convenient way to clean
the compiler cache (#13553).
This release adds support for LLVM 16 (#13181).
The docs generator now features dark mode (#13512) and improved support for small viewports (#13515).
Deprecations
Section titled DeprecationsDir.[]
withmatch_hidden
parameter: Use the overload with amatch
parameter instead.Dir.glob
withmatch_hidden
parameter: Use the overload with amatch
parameter instead.LLVM::Module#write_bitcode_with_summary_to_file
: ThinLTO is no longer supported; use#write_bitcode_to_file
instead.LLVM::FunctionPassManager
: The legacy pass manager was removed in LLVM 17. UseLLVM::PassBuilderOptions
instead.LLVM::FunctionPassManager::Runner
: The legacy pass manager was removed in LLVM 17. UseLLVM::PassBuilderOptions
instead.LLVM::Module#new_function_pass_manager
: The legacy pass manager was removed in LLVM 17. UseLLVM::PassBuilderOptions
instead.LLVM::ModulePassManager
: The legacy pass manager was removed in LLVM 17. UseLLVM::PassBuilderOptions
instead.LLVM::PassManagerBuilder
: The legacy pass manager was removed in LLVM 17. UseLLVM::PassBuilderOptions
instead.LLVM::PassRegistry
: The legacy pass manager was removed in LLVM 17. UseLLVM::PassBuilderOptions
instead.