# An SKI combinator interpreter in kakoune!

**URL:** <https://discuss.kakoune.com/t/an-ski-combinator-interpreter-in-kakoune/3024>\
**Category:** Off Topic\
**Tags:** language\
**Created:** [October 3, 2026, 8:29pm UTC](https://discuss.kakoune.com/t/an-ski-combinator-interpreter-in-kakoune/3024 "2026-10-03T20:29:27Z")\
**Posts on this page:** 2\
**Page:** 1

<div class="post-metadata">

**Author:** ![mackeye](https://discuss.kakoune.com/user_avatar/discuss.kakoune.com/mackeye/32/1675_2.png) [@mackeye](https://discuss.kakoune.com/u/mackeye)\
**Post date:** [October 3, 2026, 8:29pm UTC](https://discuss.kakoune.com/t/an-ski-combinator-interpreter-in-kakoune/3024/1 "2026-10-03T20:29:27Z")

</div>

hi everyone! i’ve written [an SKI interpreter in kakoune (without shell)](https://git.sr.ht/~orchid/kakoune-ski), partially for practice with reduction strategies and inference rules for class, and mostly for a challenge 🙂 it isn’t quite a proof that kakoune is turing complete because it takes a finite number of reduction steps. perhaps this is a good thing, so that trying to reduce SII(SII) doesn’t hang, but i would love to hear of an unbounded loop or recursion method if anyone has found one! (kakoune could also be patched to remove its nest depth and recursion limits, but that feels like cheating.)

---

<div class="post-metadata">

**Author:** ![Screwtapello](https://discuss.kakoune.com/user_avatar/discuss.kakoune.com/screwtapello/32/12_2.png) [@Screwtapello](https://discuss.kakoune.com/u/Screwtapello)\
**Post date:** [October 4, 2026, 12:50am UTC](https://discuss.kakoune.com/t/an-ski-combinator-interpreter-in-kakoune/3024/2 "2026-10-04T00:50:12Z")

</div>

This seems to produce regular tick events you could use to drive a continuous process, but I don’t know how easy it would be to turn it off again when the computation was done.

```auto
# A counter, so we have work to do
decl int counter 0

# A tick handler that does our work
def tick %{
    set-option -add window counter 1
    echo %opt{counter}
}

# A clock that ticks forever
hook window NormalIdle .* %{ exec -with-hooks i ; tick }
hook window InsertIdle .* %{ exec -with-hooks <esc> }

# Make the clock tick slowly,
# so we have a chance to interrupt it
set window idle_timeout 1000

```
