@@ -3862,8 +3862,18 @@ defmodule Kernel do
38623862 end
38633863
38643864 defp range ( :guard , first , last ) do
3865+ # We need to compute the step using guards. We don't have conditionals,
3866+ # but we can emulate them using a map access.
3867+ step =
3868+ quote do
3869+ :erlang . map_get (
3870+ :erlang . > ( unquote ( first ) , unquote ( last ) ) ,
3871+ % { false: unquote ( 1 ) , true: unquote ( - 1 ) }
3872+ )
3873+ end
3874+
38653875 # TODO: Deprecate me inside guard when sides are not integers on Elixir v1.17
3866- { :%{} , [ ] , [ __struct__: Elixir.Range , first: first , last: last , step: nil ] }
3876+ { :%{} , [ ] , [ __struct__: Elixir.Range , first: first , last: last , step: step ] }
38673877 end
38683878
38693879 defp range ( :match , first , last ) do
@@ -4355,18 +4365,6 @@ defmodule Kernel do
43554365
43564366 defp small_literal_list? ( _list ) , do: false
43574367
4358- defp in_range ( left , first , last , nil ) do
4359- # TODO: nil steps are only supported due to x..y in guards. Remove me on Elixir 2.0.
4360- quote do
4361- :erlang . is_integer ( unquote ( left ) ) and :erlang . is_integer ( unquote ( first ) ) and
4362- :erlang . is_integer ( unquote ( last ) ) and
4363- ( ( :erlang . "=<" ( unquote ( first ) , unquote ( last ) ) and
4364- unquote ( increasing_compare ( left , first , last ) ) ) or
4365- ( :erlang . < ( unquote ( last ) , unquote ( first ) ) and
4366- unquote ( decreasing_compare ( left , first , last ) ) ) )
4367- end
4368- end
4369-
43704368 defp in_range ( left , first , last , step ) when is_integer ( step ) do
43714369 in_range_literal ( left , first , last , step )
43724370 end
0 commit comments