There is a "generic" `sequence-map`.

But it's not variadic like `map` -- and like you want in your example.

You could try writing a variadic `sequence-map`?


As for `for/list`, you _could_ write:

(for/list ([a as]
           [b bs]
           [n (in-naturals)])
  (foo a b n))

It's faster if you supply `in-list` for `as` and `bs`, as did David.
When you do, it expands to code that's about as fast as if you wrote
it by hand.  But if you know the list will have only a few items, and
it doesn't matter, you could omit `in-list`. Granted it's still more
verbose than `map` style.


Speaking of writing by hand, you could use `match*` to remove some
car/cdr textbook tedium -- but it's still fairly tedious:

(let loop ([as as] [bs bs] [n 1])  ;`in-naturals` is 1.. -- use 0 here
if you prefer
  (match* [as bs]
    [[(cons a as) (cons b bs)] (cons (foo a b n)
                                     (loop as bs (add1 n)))]
    [[_ _]                     '()]))


I think one theme here is a trade-off between abstraction and speed
Another is a trade-off between functions and macros. Macros like `for`
and `match` can expand into efficient code that you wouldn't want to
write by hand.

-- 
You received this message because you are subscribed to the Google Groups 
"Racket Users" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to racket-users+unsubscr...@googlegroups.com.
For more options, visit https://groups.google.com/d/optout.

Reply via email to