yield と Common Lisp の collect clause

なんか似てるなって思ったことを。

例として素数の列挙を考えます。

F# だと,こんな風に書けます。

let primes n = seq { for x = 2 to n do if isprime x then yield x }

要するに,2 から順番に見ていって,素数だったときだけ yield するわけです。Python でも似たような書き方ができたと思います。

そういえば Haskell だったらこう書けますね。

primes n = [x | x <- [2..n], isprime x]

で,似たようなことを Common Lisp でもよくやることに気付きました。

(defun primes (n)
  (loop for x from 2 to n if (isprime x) collect x))

気付いたというか,Common Lisp でいつもこう書いてるのを F# でどう書けばいいかと考えたら yield がどうやら答えらしいという結論になった,というのが本当のところ。

思想としては似たものがあるのだろうか,どうなのだろうか,と思ったりするのですが。きっとそういうことをやりたいという需要は存在していたのだろうという気がします。