Skip to content

Commit

Permalink
Merge pull request #79 from phel-lang/add-blog-loop
Browse files Browse the repository at this point in the history
Add loop blog post
  • Loading branch information
Chemaclass committed May 19, 2024
2 parents e7bebfb + 03fc4ea commit 403f81f
Showing 1 changed file with 47 additions and 0 deletions.
47 changes: 47 additions & 0 deletions content/blog/loop.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,47 @@
+++
title = "Loop"
date = "2024-05-18"
+++

Many functional programming models prefer to express repetition by recursive function calls.

In Phel's iteration process, there is a highly functional and convenient `for` macro, but there is also a `loop` special form that performs more primitive loop processing.

[Loop Document | Control flow | The Phel Language](https://phel-lang.org/documentation/control-flow/#loop)

Phel's `loop` allows you to write repetitive processing just like a recursive function.

```phel
(loop [sum 0
cnt 10]
(if (= cnt 0)
sum
(recur (+ cnt sum) (dec cnt))))
=> 55
```

When the same function is written as a recursive function, it looks like this:

```phel
(defn my-sum-to-n [sum cnt]
(if (= cnt 0)
sum
(my-sum-to-n (+ cnt sum) (dec cnt))))
(my-sum-to-n 0 10)
=> 55
```

There are some differences between the `loop` format and the recursive function format.
When calling as recursion, the `loop` format specifies `recur`, but the recursive function format specifies its own function name `my-sum-to-n`.
For everything else, you can see that you can use `loop` to write iterations in the same way you would write recursive functions.

However, there is one more thing to keep in mind.
The recursive structure of `loop` must be tail recursive.
This means that `recur` can only be placed at the location where it is evaluated last in the iteration process within `loop`.
If you try to place `recur` in any other location, the following error will be displayed.

```
ERROR: Can't call 'recur here
```

If this error is displayed, please check whether the recursive structure of `loop` is tail recursive.

0 comments on commit 403f81f

Please sign in to comment.