blog.ryota-ka.me

Vim scriptでジェネレータを作ったり、遅延評価してみる

この記事は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で実装する.次に,このイテレータを返す関数,すなわちジェネレータを定義する.その後,イテレータを拡張し,mapfilterなどのよく知られたメソッドを定義することで,種々の操作を簡便に行えるようにする.

これまでの流れ#

続きを読む