Ink

Contents related to tech, hobby, etc

vim9scriptで気をつけること

|

vim9scriptで気をつけること

vim9scriptは、新しく実装が進められているvim用のスクリプト言語で、 型を取り入れたりモジュールの概念を取り入れたりなど「モダンな言語」の機能をふんだんに取り入れています。

現在はまだ開発中であり不安定である ためプラグインの作成などには向かないようですが、あくまでも自己責任ということで使ってみたくなったので 自分のvimrc の新しく書く部分に少し使ってみたりしています。

が、如何せん開発中のものなのでバグが多かったり、ドキュメントが不足していたり。。。

取り急ぎ、自分で把握したものはメモしていきます。

なお当方のvimは現時点でのgitのマスターブランチから make コマンドのみによってコンパイルされたもので、

バージョンは 8.2 (2019 Dec 12, compiled Mar 2 2021 10:43:55) patch 1-2560 です。

又、コードの実行には thinca/vim-quickrun を使用させていただいております。

文字列連結は'..'。'.'ではない。

これは明確に「変更点」としては見当たらなかったのですが、恐らく変更されているところです。 . を使って連結しようとしてみたところ、 E15: 無効な式です と言われてしまいました。

<画像入れる>

これを .. に変えたところすんなり動きました。

'map()'と'mapnew()'を使い分ける

map() は、リストや辞書型のオブジェクトの要素ひとつひとつに対して関数を適用してくれる関数です。

Haskellとかやってると馴染みが深いですが、その分注意する必要がある点があります。

map() 関数、実は 与えられたリストや辞書型のオブジェクトをそのまま更新 します。 つまり 新しいオブジェクトを作って返すわけではない のです。

今まではこれで良かったのですが、=vim9script= になると違います。 使用する関数を気をつけないと、 型の不一致でコンパイルエラー を受けます。

例えば、

var ret = [1, 2, 3] map(ret, (n) => n + 1)

a -> a な関数を渡しているので動きますが、

var ret = [1, 2, 3] map(ret, (n) => n .. "th")

は~a -> b~ (number -> string) な関数を渡しているのでコンパイルエラーになります。

この場合、*新しいオブジェクトを作って返す* バージョンである mapnew() を使用して回避できます。

var ret = mapnew([1,2,3], (n) => n .. "th")