The Crystal Programming Language
Class#nilable?
for recursive unions and root types (#12353, thanks @HertzDevil)Float#abs
and Number#format
for -0.0
(#12424, thanks @straight-shoota)Base64.encode
(#12377, thanks @dscottboggs)@needs_value
(#12444, thanks @asterite)homogeneous_aggregate?
check for aarch64 types (#12445, thanks @mattrberry)Union(*T)
and similar (#12438, thanks @asterite)\{{...}}
syntax in macro inside comments (#12175, thanks @asterite)Crystal::Macros::ASTNode#is_a?
(#12086, thanks @HertzDevil)Path
for chdir
arg in Process
methods (#11932, thanks @caspiano)Enum#value
(#11947, thanks @lbguilherme)contain
expectations in more specs (#11950, thanks @HertzDevil)Hash#reject!
for non-equality key (#10511, thanks @straight-shoota)Tuple.element_type
and NamedTuple.element_type
(#12011, thanks @HertzDevil)Array#-
with different generic type arguments (#12049, thanks @straight-shoota)GC_set_stackbottom
on Windows (#12186, thanks @HertzDevil)Atomic
primitives (#11583, thanks @HertzDevil)Enumerable(Channel)
parameter for Channel.send_first
, .receive_first
(#12101, thanks @carlhoerberg)Digest#hexfinal
(#9292, thanks @didactic-drunk)Path#join(Enumerable)
(#12032, thanks @straight-shoota)Path#join
to convert argument path to base kind (#12033, thanks @straight-shoota)Dir.glob
with multi components after recursive wildcard (#12057, thanks @straight-shoota)File#delete?
and Dir#delete?
(#11887, thanks @didactic-drunk)Path
arguments in Compress::Zip
(#11925, thanks @didactic-drunk)File#chown
and #chmod
(#11886, thanks @didactic-drunk)Log
emitters to not emit event when block output is nil
(#12000, thanks @robacarp)StaticFileHandler
paths (#11884, thanks @straight-shoota)HTTP::Server::Response#status_message
(#10416, thanks @straight-shoota)Complex.multiplicative_identity
(#12051, thanks @I3oris)Float
, BigFloat
rounding methods (#12004, thanks @marksiemers)__ashlti3
, __ashrti3
and __lshrti3
for wasm32 (#11948, thanks @lbguilherme)Spec::Be
, BeClose
failure message to other messages (#11946, thanks @jgaskins)File#tempfile
args (#12076, thanks @straight-shoota)SC_PAGESIZE
constant for aarch64-darwin
(#12037, thanks @carlhoerberg)File.tempfile
(#12077, thanks @straight-shoota)Enumerable
as argument to File.join
(#12102, thanks @caspiano)#value
explicitly in Pointer
overview. (#12184, thanks @elebow)String#char_bytesize_at
(#11872, thanks @straight-shoota)String#encode
(#11993, thanks @HertzDevil)String
s correctly (#12108, thanks @HertzDevil)String#%
(#12125, thanks @asterite)UUID.parse?
(#11998, thanks @jgaskins)Time.parse!
when end of input is reached (#12124, thanks @asterite)NO_COLOR
to Colorize
(#11984, thanks @didactic-drunk)Crystal::Macros::Self
and Underscore
(#12085, thanks @HertzDevil)NamedTuple()
(#12009, thanks @HertzDevil)EXPORT
in interpreter spec (#12201, thanks @HertzDevil)Crystal::Loader
: don't check if file exists, leave that to dlopen (#12207, thanks @asterite).class
for modules and unions (#12205, thanks @asterite)Crystal::Loader
for MSVC (#12140, thanks @HertzDevil)librt
and libdl
on GNU systems (#12038, thanks @1player)fun
parameter names (#11967, thanks @HertzDevil)Crystal::Parser
(#12067, thanks @lbguilherme)exp.@x
(#12183, thanks @asterite)with_scope
if Call has a receiver (#12138, thanks @asterite)Proc(...)
(#12129, thanks @asterite)Def#raises?
(#12121, thanks @asterite)ASTNode#unbind_all
(#12120, thanks @asterite)modalContenDom
typo (#12188, thanks @HertzDevil)update-distributions-scripts.sh
(#12156, thanks @straight-shoota)pax_global_header
on Windows CI (#12173, thanks @HertzDevil)Symbol
variables (#11923, thanks @HertzDevil)NamedTuple
s. (#12007, thanks @I3oris)__xstat
(#11985, thanks @straight-shoota)pthread
link annotations in lib bindings (#12013, thanks @straight-shoota)Int128
in codegen and macros (#11576, thanks @BlobCodes)ProcPointer
s with global path and top-level method references (#11777, thanks @HertzDevil)system
and run
(#11740, thanks @lbguilherme)@[Deprecated]
on constants (#11680, thanks @HertzDevil)OptionParser
(#11546, thanks @HertzDevil)self
in documentation (#11718, thanks @HertzDevil)Iterator.of(Iterator.stop)
from implementations (#11613, thanks @asterite)Enumerable
arguments for Hash#select
and #reject
(#11750, thanks @mamantoha)Hash#reject!
(#11691, thanks @wontruefree)Enumerable#find!
and #index!
(#11566, thanks @yxhuvud)BitArray#fill
(#11450, thanks @HertzDevil)Array#replace
(#11682, thanks @wontruefree)BitArray
's counting methods (#11591, thanks @HertzDevil)Hash#update
(#11881, thanks @ftarulla)Bytes[]
to construct an empty Bytes
(#11897, thanks @HertzDevil)BitArray
's constructors (#11898, thanks @HertzDevil)Enumerable#tally
and #tally_by
accepting a hash (#11815, thanks @mamantoha)2b
(#11595, thanks @docelic)chown
(#11885, thanks @didactic-drunk)Dir#each_child
(#11688, thanks @wontruefree)Dir#path
(#11689, thanks @wontruefree)File.open
(#11817, thanks @HertzDevil)Dir#entries
(#11701, thanks @wontruefree)IO#getb_to_end
(#11830, thanks @HertzDevil)IO::FileDescriptor#pos
giving incorrect position after write (#10865, thanks @didactic-drunk)File.open
(#11824, thanks @HertzDevil)#parse_type
(#11126, thanks @Blacksmoke16)URI.decode
(#11741, thanks @asterite)address_spec
expectation for Windows Server 2022 (#11794, thanks @straight-shoota)space_to_plus
option in URI::Params
everywhere (#11821, thanks @asterite)URI::Params#inspect
to use hash-like literal (#11880, thanks @straight-shoota)MIME::Multipart
and HTTP::FormData
(#11617, thanks @HertzDevil)BigDecimal::ZERO
and BigDecimal::TEN
(#11820, thanks @lbguilherme)BigFloat#to_s
(#10632, thanks @HertzDevil)Complex#zero?
(#11697, thanks @wontruefree)BigDecimal
(#9577, thanks @stevegeek)pthread
is missing (#11807, thanks @straight-shoota)Intrinsics.pause
for aarch64 (#11742, thanks @lbguilherme, @jgaskins)NamedTuple#from
(#11816, thanks @straight-shoota)WeakRef
(#11911, thanks @straight-shoota)ignore_serialize
on JSON::Field
(#11804, thanks @cyangle)Iterator.from_json
and #to_json
(#10437, thanks @wonderix)file
and line
arguments to it_iterates
(#11628, thanks @straight-shoota)Path.home
on Unix (#11544, thanks @HertzDevil)ENV.fetch(key, &)
's block restriction (#11779, thanks @HertzDevil)Path
support for UNC shares (#11827, thanks @straight-shoota)getrandom
is available (#11953, thanks @lbguilherme)Colorize
overloads and fix docs (#11832, thanks @asterite)Colorize::Mode
enum (#11663, thanks @straight-shoota)UUID
(#11683, thanks @wontruefree)UUID#urn
(#11693, thanks @wontruefree)String#[]
(#11690, thanks @wontruefree)libiconv
(#11876, thanks @luislavena)IO::Memory#to_s
(#11875, thanks @straight-shoota)self
return type to UUID
constructor methods (#10539, thanks @straight-shoota)StringPool
initial capacities (#11929, thanks @HertzDevil)Time::Format
methods (#11713, thanks @ThunderKey)%j
) in Time
parsers (#11791, thanks @HertzDevil)Crystal::ToSVisitor
: Remove decorate_*
methods (#11724, thanks @HertzDevil)--m*
flags to crystal spec
and crystal eval
(#11767, thanks @yxhuvud)Crystal::Program#check_deprecation
(#11684, thanks @HertzDevil)CRYSTAL_OPTS
for build commands (#11922, thanks @HertzDevil, @beta-ziliani)LibLLVM::IS_LT_*
during macro expansion time (#11913, thanks @HertzDevil)Proc#call
(#11675, thanks @HertzDevil)Proc#call
body (#11676, thanks @HertzDevil)pointerof
detection with generic splat type variables (#11811, thanks @HertzDevil)Tuple#[]
with range literals (#11783, thanks @HertzDevil)dlopen
(#11852, thanks @FnControlOption)Crystal::Loader
in the interpreter (#11579, thanks @straight-shoota)Crystal::Loader
errors (#11860, thanks @straight-shoota)YAML
(#11801, thanks @straight-shoota)Expressions
(#11769, thanks @straight-shoota)ASTNode#to_s
(#11851, thanks @FnControlOption)else
, ensure
, end
keywords (#11476, thanks @FnControlOption)Crystal::Token::Kind
enum instead of symbols (#11616, thanks @HertzDevil)Generic
nodes with no type variables (#11906, thanks @HertzDevil)skip_abstract_def_check
flag support (#9217, thanks @makenowjust)instance_sizeof
on structs (#11856, thanks @mattrberry)Path
in def parameter restriction as free variable (#11862, thanks @HertzDevil)Hash
in the compiler (#11707, thanks @HertzDevil)OptionParser
in crystal env
(#11720, thanks @HertzDevil)scripts/release-update.sh
(#11716, thanks @straight-shoota)$CC
in EXPORT_CC
(#11548, thanks @straight-shoota)etc/completion.bash
(#11719, thanks @HertzDevil)arch-os-job
or arch-build-job
(#11207, thanks @beta-ziliani)scripts/github-changelog.cr
(#11770, thanks @straight-shoota)make install
for BSD (#11758, thanks @straight-shoota)be_empty
expectations in more specs (#11937, thanks @HertzDevil)String#index
(#11747, thanks @asterite, @straight-shoota)BIO_*
functions in OpenSSL < 1.1.0 (#11736, thanks @daliborfilus)GC_set_warn_proc
(#11729, thanks @straight-shoota)ProcLiteral
s with Union
return type (#11709, thanks @HertzDevil)T.class
as "metaclass" in error messages, not "class" (#11378, thanks @HertzDevil)Reason
enum for exhaustive case in nil-reason check (#11449, thanks @rymiel)vswhere
(#11496, thanks @HertzDevil)--emit
compiler options to stack (#11556, thanks @HertzDevil)cl.exe
's path for compiler specs requiring a C compiler (#11560, thanks @HertzDevil)StaticArray#sort_by
on broken targets (#11359, thanks @straight-shoota)dllimport
storage class (#11573, thanks @HertzDevil)initialize
methods (#11313, thanks @HertzDevil)~check_proc_is_not_closure
(#11311, thanks @HertzDevil)crystal i
, a Crystal interpreter (#11159, thanks @asterite)Crystal::Loader
(#11434, #11662, thanks @straight-shoota, @HertzDevil)bswap32
instrinsic with interpreter primitive annotation (#11582, thanks @rymiel)IsA
node (#11351, thanks @FnControlOption)ProcLiteral
s with parameters (#11365, thanks @HertzDevil)end
in macro body (#11463, thanks @straight-shoota)unless
(#11440, thanks @rymiel)yield
with parenthesis (#11469, thanks @straight-shoota)String#to_i
(regression fix) (#11672, thanks @BlobCodes)ToSVisitor
(#11677, thanks @homonoidian)Class
's methods in error messages (#10590, thanks @HertzDevil)ProcNotation
variable declarations (#11372, thanks @HertzDevil)Proc
literals and pointers (#11367, thanks @HertzDevil)semantic
with assert_no_errors
in compiler specs whenever possible (#11288, thanks @HertzDevil)inject_primitives = false
default for semantic specs (#11297, thanks @HertzDevil)Indexable
(#11545, thanks @HertzDevil)Process::INITIAL_PWD
for non-existent path (#10525, thanks @straight-shoota)Slice(UInt8)#fill
in the standard library (#11468, thanks @HertzDevil)spec/win32_std_spec.cr
(#11432, #11637, thanks @HertzDevil)#finalize
specs (#11619, thanks @HertzDevil)Enum.parse
to handle case-sensitive member names (#11659, thanks @straight-shoota)Object#not_nil!
(#11661, thanks @straight-shoota)start
as parameter in subrange-accepting methods (#11350, thanks @HertzDevil)Indexable::Mutable#fill
's overloads (#11368, thanks @HertzDevil)StaticArray
(#10889, thanks @HertzDevil)StaticArray
(#11364, thanks @henrikac)BitArray#reverse!
(#11363, thanks @HertzDevil)Indexable::Mutable#map!
(#11349, thanks @HertzDevil)Slice#unsafe_slice_of
, #to_unsafe_bytes
(#11379, thanks @HertzDevil)Enumerable#each_cons
and Iterator#cons
's default reused array (#10384, thanks @HertzDevil)Array#unshift
for large arrays (#11656, thanks @HertzDevil)Crypto::Bcrypt
(#9647, thanks @j8r)getrandom
for interpreter (#11624, thanks @straight-shoota)UInt32
to bytes in Crypto::Blowfish
(#11594, thanks @BlobCodes)__xstat
, __fxstat
and __lxstat
for x86_64-linux-gnu (#11361, #11536, thanks @straight-shoota)IO::Memory#to_s
appending to itself (#11643, thanks @straight-shoota)LLVMExtDIBuilderCreateArrayType
argument alignInBits
should be UInt64
(#11644, thanks @lbguilherme)Log.with_context
with kwargs (#11517, thanks @caspiano)Log::BroadcastBackend#single_backend?
(#11530, thanks @straight-shoota)Return
, Break
, Next
, Yield
, and exception handlers (#10822, thanks @HertzDevil)Crystal::Macros::ProcNotation#resolve
and #resolve?
(#11373, thanks @HertzDevil)ProcLiteral
s (#11402, thanks @HertzDevil)ASTNode
macro methods (#10811, thanks @HertzDevil)#[](Range)
macro methods (#11380, thanks @HertzDevil)Metaclass
nodes (#11375, thanks @HertzDevil)UNIXServer
(#11426, thanks @carlhoerberg)WebSocket#stream
flushing for not exactly buffer size, add specs (#11299, thanks @will)check_headers
to HTTP::Server::Response
(#11253, thanks @straight-shoota)LogHandler
address for win32 (#11465, thanks @straight-shoota)TCPServer
: explain how to get an ephermal port (#11407, thanks @rdp)HTTP::Server::Response#close
when replaced output syncs close (#11631, thanks @straight-shoota)Random.rand(max : Float32)
return Float32
(#9946, thanks @j8r)Math
linking errors on Windows MSVC (#11435, thanks @HertzDevil)__multi3
for arm (#11499, thanks @straight-shoota)Big*
numbers on Windows (#11412, thanks @HertzDevil)BigRational#to_big_r
(#11462, thanks @HertzDevil)primitives_spec
(#11298, thanks @HertzDevil)Number.significant
to return 0
as is, not as Float64
(#11321, thanks @Sija)Float
-to-Int
conversions (#11230, thanks @HertzDevil)UInt64
numbers. (#11395, thanks @hugopl)YAML::Any
deserialize with alias (#11532, thanks @straight-shoota)Spec
-related types (#11585, thanks @HertzDevil)Path.home
on Windows (#11503, thanks @HertzDevil)~\
for Windows paths in Path#expand
and File.expand_path
(#11559, thanks @HertzDevil)kernel_spec.cr
on Windows CI (#11554, thanks @HertzDevil)getrandom
syscall was blocking and didn't had proper error checking (#11460, thanks @lbguilherme)PCRE_UCP
(#11265, thanks @asterite)it
in UUID
spec (#11353, thanks @darkstego)Char#unicode_escape
and fix #dump
and #inspect
format (#11421, thanks @straight-shoota)Char#letter?
to include all letter categories (#11474, thanks @straight-shoota)study
(#11325, thanks @Blacksmoke16)Char#printable?
(#11429, thanks @straight-shoota)String#inspect
and Char#inspect
escape all non-printable characters (#11452, #11626, thanks @straight-shoota)Regex#name_table
to return Hash(Int32, String)
(#11539, thanks @straight-shoota)Char#succ
and #pred
(#11506, thanks @straight-shoota)Char#ascii_control?
restrict to ASCII characters (#11510, thanks @straight-shoota)Char#to_s
(#11593, thanks @BlobCodes)Colorize
(#11664, thanks @straight-shoota)shard.yml
version when no git tag present (#11232, thanks @superhawk610)PlaygroundPage
resources list (#11608, thanks @straight-shoota)test_dist_linux_on_docker
(#11512, thanks @straight-shoota)LLVM_CONFIG
only when LLVM is used (#11519, thanks @straight-shoota)LIBXML_STATIC
when building xml2.lib on Windows (#11574, thanks @HertzDevil)README.md
(#11587, thanks @athix)shards
with Windows build artifacts (#11543, thanks @neatorobito)libatomic_ops
(#11598, thanks @straight-shoota)Class
(#11377, thanks @HertzDevil)BitArray#toggle
when toggling empty subrange (#11381, thanks @HertzDevil):nodoc:
flags to the right place to hide the __mul*
functions. (#11326, thanks @wyhaines)Proc#call
and abstract defs. (#10899, thanks @HertzDevil)proc_spec
forcing normal compilation instead of JIT (#10964, thanks @straight-shoota)ProcNotation#to_s
remove whitespace for nil output type (#10935, thanks @straight-shoota)is_a?
for virtual metaclass types (#11121, thanks @asterite)Call.def_full_name
print full block parameter (#10915, thanks @straight-shoota)typeof
start a nested lexical scope (#10796, thanks @HertzDevil)Proc
pointers (#11243, thanks @HertzDevil)CrystalPath#find_in_path_relative_to_dir
for readability (#10876, #10990, #10988, thanks @straight-shoota)CrystalPath.expand_paths
, expand relative to compiler path (#11030, thanks @straight-shoota)for
's loop variables (#11141, thanks @HertzDevil)LLVM::ABI::AArch64#homogeneous_aggregate?
(#11199, thanks @asterite)inject_primitives: false
to macro_spec (#11269, thanks @straight-shoota)TypeNode#includers
(#11116, thanks @HertzDevil).as?(NoReturn)
always return nil
(#10896, thanks @HertzDevil)is_a?(union)
work correctly for virtual types (#11176, thanks @asterite)Crystal::Macros::HashLiteral#[]
(#10930, thanks @kevinsjoberg)#is_a?
in macros respect the AST node hierarchy (#11062, thanks @HertzDevil)SymbolLiteral
and MacroId
(#9298, thanks @MakeNowJust)instance_vars
can be called (#11171, thanks @willhbr)file_exists?
macro method (#10540, thanks @Sija)SystemError.from_winerror
(#11220, thanks @straight-shoota):nodoc:
when overriding public methods (#11096, thanks @HertzDevil)Array#product
to Indexable#cartesian_product
(#10013, thanks @HertzDevil)Slice(T).new(Int)
where T
is a union of primitive number types (#10982, thanks @HertzDevil)Array#transpose
, Enumerable#reject
, Enumerable#to_h
work with tuples (#10445, thanks @HertzDevil)Enumerable#each
block return type (#10928, thanks @straight-shoota)NamedTuple
be Symbol
(#10942, thanks @caspiano)BitArray#[](Int, Int)
for sizes between 33 and 64 (#10809, thanks @HertzDevil)Range#step
for non-integer Steppable
types (#11130, thanks @straight-shoota)NamedTuple#map
(#10950, thanks @caspiano)Slice#fill
(#10924, thanks @HertzDevil)BitArray#toggle
(#10743, thanks @HertzDevil)Slice
, Array
and Indexable::Mutable
(#10163, #11029, #11254, thanks @MakeNowJust, thanks @straight-shoota)Enumerable(T)#reduce
's return type to differ from T
(#11065, thanks @HertzDevil)Enumerable#tally_by
(#10922, thanks @caspiano)Indexable::Mutable(T)
module (#11059, thanks @HertzDevil)#rotate!
(#11198, thanks @HertzDevil)Fiber.timeout
(#11271, thanks @toddsundsted)Scheduler#reschedule
: Shortcut lookup for current fiber. (#11156, thanks @yxhuvud)File.match?
to accept Path
type as path
argument (#11075, thanks @fishnibble)FileUtils
method specs with String
and Path
arguments (#10987, thanks @straight-shoota)IO#read_char
's default behaviour UTF-8-strict (#10446, thanks @HertzDevil)gets
without peek involving \r
and limit (#11241, thanks @asterite)FileUtils.mv
work across filesystems (#10783, thanks @naqvis)Path#dirname
and Path#extension
(#11001, thanks @BlobCodes)Nil
in HTTP-related methods and Log
(#10624, thanks @oprypin)rescue
syntax (#11083, thanks @straight-shoota)HTTP::Params
can't run on its own (#11128, thanks @asterite)Domain
attribute with leading dot (#11098, thanks @mamantoha)OpenSSL::SSL::Error
in HTTP::Server#handle_client
(#11146, thanks @straight-shoota)TCPSocket
constructors (#11049, thanks @straight-shoota)URI
in websockets (#10854, thanks @willhbr)max-age
and expires
for cookies (#10564, thanks @straight-shoota, @watzon)HTTP::Client
requests once if io is closed (#11088, thanks @carlhoerberg)Socket
for win32 (#10784, thanks @straight-shoota)URI.encode_path
and deprecate URI.encode
(#11248, thanks @straight-shoota)Math.frexp(BigFloat)
(#10998, thanks @straight-shoota)BigInt#to_s
emitting null bytes for certain values (#11063, thanks @HertzDevil)Float#humanize
for values outside 1e-4...1e15
(#10881, thanks @straight-shoota)BigFloat#to_x
methods (#10996, thanks @straight-shoota)#next_float
and #prev_float
to Float32
and Float64
(#10908, thanks @HertzDevil)Int#to_s
(#10926, thanks @HertzDevil)Int128
compiler-rt methods (#11206, thanks @BlobCodes)BigDecimal
operations with floats (#10874, thanks @stakach)String#to_(u/i)128(?)
methods (#11245, thanks @BlobCodes)libunwind
from callstack (#11205, thanks @straight-shoota)Nil
: JSON and YAML (#10622, thanks @oprypin)YAML::PullParser#location
(#10997, thanks @straight-shoota)JSON::PullParser.new
(#10864, thanks @Blacksmoke16)JSON::PullParser#consume_number
to use stdlib number parsing (#10447, thanks @straight-shoota)URI
(#10404, thanks @straight-shoota)iterator_spec
(#11148, thanks @asterite)describe
without requiring an argument (#10974, thanks @straight-shoota)String#unsafe_byte_at
(#10559, thanks @straight-shoota)IO#write_utf8
to #write_string
. (#11051, thanks @straight-shoota)#write_string
instead of #write
whenever writing strings to unknown IO
s (#11011, thanks @HertzDevil)#write_byte
whenever writing ASCII characters to unknown IO
s (#11124, thanks @HertzDevil)Int#chr
reject surrogate halves (#10451, thanks @HertzDevil)String::Builder
(#11025, thanks @HertzDevil)(-> )
correctly (#10945, thanks @HertzDevil)return
/break
/next
properly (#10597, thanks @HertzDevil)crystal init
: Improve transformation of project name with hyphens (#11170, thanks @Kanezoh)WARNING
an admonition keyword (#10898, thanks @HertzDevil)test_linux_32
and add smoke test for 32-bit gnu (#11127, thanks @straight-shoota)package_build
workflow (#11240, thanks @straight-shoota)make install
(#10878, thanks @straight-shoota)maintenance_release
and tagged_release
workflows (#11273, thanks @straight-shoota)push_obs_nightly
(#11301, thanks @straight-shoota)