3 ms·
yes the syntax for 'do is simple, like that of lisp. however 'do allows you to make far more complex iteration constructs than 'loop. 'loop is just a DSL to mak
by medo-bear 2y ago
yes the syntax for 'do is simple, like that of lisp. however 'do allows you to make far more complex iteration constructs than 'loop. 'loop is just a DSL to make some of these constructs more concise. read up on it
- lispm 2y agoLOOP has the DO functionality included. Example: CL-USER 18 > (do ((a 1 (+ a 1)) (b 10 (* b 1.5)) (c nil)) ((> a 5) (list a b (reverse c))) (push (* a b) c)) (6 75.9375 (10 30.0 67.5 135.0 253.125)) CL-USER 19 > (loop for a = 1 then (+ a 1) and b = 10 then (* b 1.5) and c = NIL then c when (> a 5) do (return (list a b (reverse c))) do (push (* a b) c)) (6 75.9375 (10 30.0 67.5 135.0 253.125))
- medo-bear 2y agoYou can also express LOOP constructs in terms of DO. However if you were to construct a more exotic iterator that is not so straight forward in LOOP (beware of edge cases), I think it is more reasonable to pick DO. I think also that your example illustrates this.
- lispm 2y agoI would miss the in-order collects, actually collect/maximize/... features, destructuring of lists, direct type declarations, ... I also find DO not easy to read and understand. The code from above I would actually write in LOOP as (loop for a from 1 upto 5 and b = 10 then (* b 1.5) collect (* a b) into c finally (return (list a b c))) I find that to be readable.
- medo-bear 2y agoOf course to each their own. I like LOOP a lot actually when I need to do something familiar, however for something unfamiliar DO is often my choice. It also serves as a caution to tread and think carefully when I return to the code. Sometimes, after a while, I realise how to do the DO construct succintly with LOOP