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