Vim Advent Calendar 2018ボツ記事(vital.vimで関数型プログラミング入門)
最近はvital.vimというVim scriptの準標準ライブラリでData.List・Data.OptionalやData.Eitherを開発していたのですが、 Vim scriptのような動的型付き言語でnullや例外を使わずにoptionalやeitherを使う利点がわからなくなり、 絶望したので以下の記事をボツにしました。
ここに供養する。
vital.vimで関数型プログラミング入門
Hi, クリスマスVim 😳
皆さん、Vim scriptプログラミングをしていますか? vital.vimをご存知ですか? vital.vimはVim scriptの準標準ライブラリです。
僕個人の考えですが、Vim scriptは標準だと破壊的代入等を用いたプログラミングスタイル、いわゆる手続き型に特化しています。 しかしながらVim scriptはVimの機能を拡張する ✨ 汎用言語 ✨ ですので、明に手続きを書かずに簡潔に書きたい場合(破壊的代入を用いたくない場合)があります。 そこでvital.vimです!
今回はvital.vimの紹介を兼ね、いくつかの問題について簡潔に書くように試みてみます。
List
- ❌ <- 簡潔でない例
- ⭕ <- 簡潔な例
filter, map
リストの要素のうちある条件を満たすもののみを取ってみます。
❌
let list = [1, 'a', 2]
let nums = []
for x in list
if type(x) is type(0)
call add(nums, x)
endif
endfor
echo nums
" [1, 2]
⭕
echo filter([1, 'a', 2], { _, x ->
\ type(x) is type(0)
\ })
" [1, 2]
綺麗ですね!
Data.List.find
このfilter()
とmap()
は標準関数でした。
もう少し難しい例を、vital.vimのData.Listで書いてみましょう。
!
❌
let list = [v:null, 10, 'a', 3.14]
let float = v:null
for x in list
if type(x) is type(1.0)
let float = x
break
endif
endfor
echo float
" 3.14
⭕
let s:L = vital#vital#import('Data.List')
let list = [v:null, 10, 'a', 3.14]
echo s:L.find(list, v:null, { x ->
\ type(x) is type(1.0)
\ })
" 3.14
ワァオ! 我々の心を捉えて離さない実数、3.14がこんなに簡単に出てきました 😳
そう、find()
とは受け取った条件に、最初に合致した値を返す関数のことです。
(また「条件」とは引数を受け取って、boolを返す関数のことです)
我々はもはや、逐一for文を書く必要すらないのです!
他、様々なシチュエーションに対する各関数はこちらにあります 👇
ここまで書いた。