@@ -3862,8 +3862,18 @@ defmodule Kernel do
3862
3862
end
3863
3863
3864
3864
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
+
3865
3875
# 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 ] }
3867
3877
end
3868
3878
3869
3879
defp range ( :match , first , last ) do
@@ -4355,18 +4365,6 @@ defmodule Kernel do
4355
4365
4356
4366
defp small_literal_list? ( _list ) , do: false
4357
4367
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
-
4370
4368
defp in_range ( left , first , last , step ) when is_integer ( step ) do
4371
4369
in_range_literal ( left , first , last , step )
4372
4370
end
0 commit comments