← Back to context

Comment by Guthur

15 hours ago

The event loop is brilliant example for how much `loop` is a full blown iteration DSL... love it or hate it ;)

I used to scoff at it at first, but after a few years of CL programming loop is one of my favourite CL constructs :)

  • I'm with you there. Is a bit of a mind bend, as I really disliked it the first few times I saw it.

    For an even sillier mind bend, I'm using tagbody to be able to directly transcribe some of Knuth's algorithms as I am learning them.

    • Cool! Using tagbody feels like writing supercharged C or even assembler to me (not that I've used it much, but still).

    • I don't understand why turning a simple loop into a 'mindbend' is considered good. The downfall of programming is complexity, if you're getting your mind blown by a loop how are you going to do the rest of the program?

      14 replies →

Why loop when you can https://iterate.common-lisp.dev/ instead? No s-expr-less alien syntax, no need for `do` to switch to back to Lisp syntax, normal `if`/`when` without the ugly `else`/`end` and generally useful features added.

  • If I used Common Lisp more I'd probably have a go at copying Racket's `for` forms[1]; they're really nice because you can usally tell at a glance what they're going to return - `for/list` returns a list for example. No having to scan the body for a `collect`.

    But in the meantime since discovering iterate I've barely used `loop`. It just feels so much more lispy and I find myself running to the documentation less often.

    [1]: https://docs.racket-lang.org/reference/for.html

    • Interesting concept, but it visually has the same problem as loop IMO, using keywords to implement a new syntax instead of seamlessly blending with Lisp (at the cost of needing code walking, though).

      And it seems to lack all the iterations drivers (incl. builtin destructuring) that make half of loop/iterate's usefulness and "reads like English" comfy factor; especially liking

        (for (i j) on list [by #'cddr])
        (for i initially init-expr then then-expr)
        (for prev previous i [initially init-expr])
        (for i in-{file,stream} [using #'reader])
      

      The two lasts are iterate goodies and I often use the last with these custom readers: https://git.sr.ht/~q3cpma/cl-utils/tree/master/item/src/read...

      1 reply →