Vim script でジェネレータを作ったり、遅延評価してみる
Keywords:
この記事は CAMPHOR- Advent Calendar 2016 8日目の記事です.
はじめに#
日本時間の2016年9月12日に,Vim 8.0 がリリースされた.Vim 7.4 のリリースからはおよそ3年振り,Vim 7.0 からは実におよそ10年振りのヴァージョンアップだそうだ.Vim 8.0 では様々な新機能が追加されたが,中でも Vim script にラムダ式*1が追加されたのには目を引くものがあった.
ラムダ式の登場により,標準の map()
関数や filter()
関数の使い勝手が大幅に改善されたが,これらで遊んでいるうちに,似た操作をリストだけではなくイテレータに対して適用したいという欲求が自然と生じてきた.しかしながら,Vim script にはリストはあれど,イテレータなどというものは存在するはずもないので,今回自前で実装する運びとなった.
本稿では,まず初めに,ECMAScript 2015 のインタフェースに似た*2,すなわち,next
を呼ぶと { value: 42, done: false }
という形式に近い値が返ってくるイテレータを Vim script で実装する.次に,このイテレータを返す関数,すなわちジェネレータを定義する.その後,イテレータを拡張し,map
や filter
などのよく知られたメソッドを定義することで,種々の操作を簡便に行えるようにする.
これまでの流れ#
- Ruby の Enumerator でジェネレータを作ったり、遅延評価してみる - blog.ryota-ka.me
- Python でジェネレータを作ったり、遅延評価してみる – ymyzk’s blog
- ECMAScript 6 でジェネレータを作ったり、遅延評価してみる – ymyzk’s blog
- Rust でジェネレータを作ったり、遅延評価してみる - blog.ryota-ka.me
- Swift でジェネレータを作ったり、遅延評価してみる – ymyzk’s blog
- PHP でジェネレータを作ったり遅延評価してみる - たにしきんぐダム
- Scala でジェネレータを作ったり、遅延評価してみる - たにしきんぐダム
- Perl 6 でジェネレータを作ったり、遅延評価してみる - blog.ryota-ka.me