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文を書く必要すらないのです!

他、様々なシチュエーションに対する各関数はこちらにあります 👇


ここまで書いた。

筆者プロフィール

my-latest-logo

aiya000(あいや)

せつラボ 〜圏論の基本〜」 「せつラボ2~雲と天使と関手圏~」 「矢澤にこ先輩といっしょに代数!」を書いています!

強い静的型付けとテストを用いて、バグを防ぐのが好き。Haskell・TypeScript。