R, Python, Common Lispで内包表記っぽい何がしかの比較


内包表記、好きですか?僕は好きです。
シンプルな処理ならば簡潔に、しかも見通しよく書けますよね。
まあ、Pythonの内包表記については否定的な意見もあるようですが。。。

というわけで、いろいろな言語(というか、僕が知っている言語)で内包表記、または内包表記っぽいものを比較してみました。
ちなみにお題は1〜10の連番リストであるhogeから3の倍数を抽出しませう、というよくありがちなネタです

やはり、最初はPythonか。

Pythonの内包表記はすごくわかりやすくて柔軟だなーと思います。ただ、複雑になってくると可読性がものすごく下がるような。複雑な内包表記は避けるのがPython流?

次はCommon Lisp。CLで内包表記っぽいと言えば、LOOPマクロなんですか?よくわかってません。

最近、ちょこちょこCLを勉強しているのですが、とかくLOOPマクロは柔軟だな、と思いました。その代わり使いこなすには、結構時間がかかりそう。。。

最後は、Rいってみましょう。

三つの中でも、かなり特異です。これは、ベクトルを引数にとる論理演算子が論理値のベクトルを返すRならではの特徴を使ったフィルタリングなのです。

というわけで、三つ書いてみての感想。
一番トータル面で良さそうなのは、やはりPythonですかね。個人的な習熟度もありますがLOOPマクロは奥が深すぎる気がしますし、Rは柔軟性があまりありません。そんな書き方するんだったらapply関数族をさっさと使った方法が賢明だと思います。

この他の言語でも、Haskellとかにもあるんですね。ごめんなさい、全く知りません。多言語でこういう風にも書けるよ、というのがあったら教えてください。

  • HaskellだとPythonと似た感じです。[x|x <- [1..10], x `mod` 3 == 0]

    • myuhe

      おお、ありがとうございます!!
      確かに似てますね。こう比較してみると、なかなか面白いです。
      そもそも内包表記の発端ってどこだったんだろう。。。

  • HaskellだとPythonと似た感じです。[x|x <- [1..10], x `mod` 3 == 0]

  • myuhe

    おお、ありがとうございます!!
    確かに似てますね。こう比較してみると、なかなか面白いです。
    そもそも内包表記の発端ってどこだったんだろう。。。