VimでCotowali
Cotowaliとは
zakuroさんが開発している静的型付き言語です。
Cotowali は、2021年度未踏に「シェルスクリプトへのコンパイルを行う静的型付けスクリプト言語の開発」のテーマで採択され、現在開発中のスクリプト言語です
とあるように、シェルスクリプトをバックエンドとするコンパイル型言語です。
この言語の主な特徴として、
- ポータブルなスクリプトが生成される
- コンパイル時に型チェックが行われる
- シェルスクリプトよりモダンなコードで開発が出来る
というところがあります。じつはかなり前からこの言語の存在は知っていたのですが、あまりユースケースが思いつかずやってませんでした。
しかし最近やっていたboostの再構築にあたり、いっそ全部シェルスクリプトで書いてみたらどうなんだろうと思い、この際にCotowaliもやってみようと思い手を付けてみた次第です。
Boostに求める機能として、
-
XDG_CONFIG_HOME/boost/
にあるスクリプトをあいまい検索し、それを実行する - スクリプトの追加機能(これはスクリプトとして実装されている)
- ネット上のスクリプトを実行/追加する機能(本家は未実装)
がある。これらをCotowaliで実装できるか試してみたい。
まずは環境構築
このサイトを見て環境を構築する。
ただ、この方法はBash前提なので自分が普段使っているFishだと書き方が違ってくる。
自分の場合はこう書いた。
set -x PATH "$HOME/.konryu/bin" $PATH
set -x PATH "$HOME/.konryu/cotowali/bin/" $PATH
eval (konryu init)
echo 'println("Hello Cotowali!")' | lic run
と実行してHello Cotowali!
と表示されればインストール完了。
次にハイライトの設定をしていく。このリポジトリにハイライトようのスクリプトがあるので任意のパッケージマネージャでインストールする。
僕はdeinを使っているのでこんな感じでインストールした
[[plugins]]
repo = 'https://github.com/cotowali/vim-cotowali'
on_ft = ["cotowali"]
Vimがファイルタイプを認識するように設定をする
au BufRead,FileType *.li set filetype=cotowali
これでハイライトが付くようになった。LSPはあるっぽんだけど説明がよくわからなかったのでパス。情報募集中です。
Cotowaliはポータビリティを重視しているので、文字列操作などの汎用的なメソッドは組み込みで提供されている。
例えば文字列シーケンスの末尾から、指定された個数の文字列を取り出すstring#lenは
"hello world!".len()
// 12
という感じで呼び出す。
また、osモジュールのように、複数の階層があるモジュールは
os::path::join()
のように::
とコロン2つで1つ下の階層にアクセス出来る。どうやら構文はRustの影響を受けていそう。
また、特に事前処理も必要なくランタイムが提供している関数もある。これはビルドイン関数と呼ばれ、string#len
みたいな関数はこれに当たる。
他にもprintln()
やecho()
関数などもある。特にecho()
関数は型の制約がゆるいのでデバッグでの使い勝手がとても良い。
ざっくりまとめると、
- 型固有のメソッドは
.
で呼び出す - 階層構造のモジュールは
::
を使ってアクセスする - ビルドインの関数もある
こんな感じ
キャスト
前述の通り、型にはそれぞれメソッドが実装されているのだけど、それを呼び出す為にはCotowaliに値がその型であることを伝える必要がある。
そのために使われるのがas
演算子で、
var pstr = p as string
こんな感じで使う。これを行うことで、pstr
には値がstring
に変換された値が格納される。
ちなみに変換元のp
は変換前の型のままになる。