From 03fc4ead48cb8b92beb0273a99f08bb5692e3fa7 Mon Sep 17 00:00:00 2001 From: smeghead Date: Sat, 18 May 2024 23:37:50 +0900 Subject: [PATCH] Add loop blog post Create a blog post to help resolve errors due to `recur` position. #491 --- content/blog/loop.md | 47 ++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 47 insertions(+) create mode 100644 content/blog/loop.md diff --git a/content/blog/loop.md b/content/blog/loop.md new file mode 100644 index 0000000..f25cce2 --- /dev/null +++ b/content/blog/loop.md @@ -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.