はじめに#
日本時間の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
などのよく知られたメソッドを定義することで,種々の操作を簡便に行えるようにする.