# Macro not working anymore

**URL:** <https://forum.crystal-lang.org/t/macro-not-working-anymore/2379>\
**Category:** Help & Support\
**Created:** [July 26, 2020, 10:48pm UTC](https://forum.crystal-lang.org/t/macro-not-working-anymore/2379 "2020-07-26T22:48:26Z")\
**Posts on this page:** 6\
**Page:** 1

<div class="post-metadata">

**Author:** ![gummybears](https://yyz2.discourse-cdn.com/flex036/user_avatar/forum.crystal-lang.org/gummybears/32/1886_2.png) [@gummybears](https://forum.crystal-lang.org/u/gummybears)\
**Post date:** [July 26, 2020, 10:48pm UTC](https://forum.crystal-lang.org/t/macro-not-working-anymore/2379/1 "2020-07-26T22:48:26Z")

</div>

I found this macro on the internet (don’t know the author) which I use  
for loops. I could rewrite those statements so it is not that important.

Following macro works with Crystal 0.34 but not with Crystal 0.35

Crystal 0.35 error

```auto
syntax error in eval:9
Error: expecting token '%}', not 'in'

```

```auto
macro for(*exp, &block)
  {% if exp[0].is_a?(Assign) %}
    {{exp[0]}}
    while {{exp[1]}}
      {{block.body}}
      {{exp[2]}}
    end
  {% else %}
    {% in = exp.last.args.first; in2 = in.args.last %}
    {% variables = exp.stringify.split('(')[0][1..-1].id %}
    {% block = in.block.stringify.empty? ? in2.block : in.block %}
    {% if in2.is_a?(Call) && !in2.block.stringify.empty? %}
      {% enumerable = in2.stringify.split(" do\n")[0].id %}
    {% else %}
      {% enumerable = in2 %}
    {% end %}
    ({{enumerable}}).each { |{{variables}}| {{block.body}} }
  {% end %}
end

# usage
for i in 0..9 do
  puts i
end

```

---

<div class="post-metadata">

**Author:** ![Blacksmoke16](https://yyz2.discourse-cdn.com/flex036/user_avatar/forum.crystal-lang.org/blacksmoke16/32/1241_2.png) [@Blacksmoke16](https://forum.crystal-lang.org/u/Blacksmoke16)\
**Post date:** [July 26, 2020, 11:25pm UTC](https://forum.crystal-lang.org/t/macro-not-working-anymore/2379/2 "2020-07-26T23:25:16Z")

</div>

Exhaustive case made `in` a keyword.

---

<div class="post-metadata">

**Author:** ![gummybears](https://yyz2.discourse-cdn.com/flex036/user_avatar/forum.crystal-lang.org/gummybears/32/1886_2.png) [@gummybears](https://forum.crystal-lang.org/u/gummybears)\
**Post date:** [July 26, 2020, 11:44pm UTC](https://forum.crystal-lang.org/t/macro-not-working-anymore/2379/3 "2020-07-26T23:44:49Z")

</div>

A working version where ‘in’ is replaced by ‘witihin’

```auto
macro for(*exp, &block)
  {% if exp[0].is_a?(Assign) %}
    {{exp[0]}}
    while {{exp[1]}}
      {{block.body}}
      {{exp[2]}}
    end
  {% else %}
    {% within = exp.last.args.first; in2 = within.args.last %}
    {% variables = exp.stringify.split('(')[0][1..-1].id %}
    {% block = within.block.stringify.empty? ? in2.block : within.block %}
    {% if in2.is_a?(Call) && !in2.block.stringify.empty? %}
      {% enumerable = in2.stringify.split(" do\n")[0].id %}
    {% else %}
      {% enumerable = in2 %}
    {% end %}
    ({{enumerable}}).each { |{{variables}}| {{block.body}} }
  {% end %}
end

# usage
for i within 0..9 do
  puts i
end

```

---

<div class="post-metadata">

**Author:** ![gummybears](https://yyz2.discourse-cdn.com/flex036/user_avatar/forum.crystal-lang.org/gummybears/32/1886_2.png) [@gummybears](https://forum.crystal-lang.org/u/gummybears)\
**Post date:** [July 26, 2020, 11:44pm UTC](https://forum.crystal-lang.org/t/macro-not-working-anymore/2379/4 "2020-07-26T23:44:59Z")

</div>

Thanks

---

<div class="post-metadata">

**Author:** ![asterite](https://yyz2.discourse-cdn.com/flex036/user_avatar/forum.crystal-lang.org/asterite/32/60_2.png) [@asterite](https://forum.crystal-lang.org/u/asterite)\
**Post date:** [July 27, 2020, 12:40am UTC](https://forum.crystal-lang.org/t/macro-not-working-anymore/2379/5 "2020-07-27T00:40:18Z")

</div>

And here’s a non-macro version where code is easier to understand and it actually compiles faster:

(0…9).each do |i|  
puts i  
end

---

<div class="post-metadata">

**Author:** ![Blacksmoke16](https://yyz2.discourse-cdn.com/flex036/user_avatar/forum.crystal-lang.org/blacksmoke16/32/1241_2.png) [@Blacksmoke16](https://forum.crystal-lang.org/u/Blacksmoke16)\
**Post date:** [July 27, 2020, 12:44am UTC](https://forum.crystal-lang.org/t/macro-not-working-anymore/2379/6 "2020-07-27T00:44:11Z")

</div>

Or better yet:

```auto
9.times do |i|
  puts i
end

```
