Open5

VimでCotowali

こまもか🦊こまもか🦊

Cotowaliとは

zakuroさんが開発している静的型付言語です。

https://zenn.dev/zakuro9715/articles/mitou-2021-cotowali#playground-%2F-オンラインコンパイラ

Cotowali は、2021年度未踏に「シェルスクリプトへのコンパイルを行う静的型付けスクリプト言語の開発」のテーマで採択され、現在開発中のスクリプト言語です

とあるように、シェルスクリプトをバックエンドとするコンパイル型言語です。
この言語の主な特徴として、

  • ポータブルなスクリプトが生成される
  • コンパイル時に型チェックが行われる
  • シェルスクリプトよりモダンなコードで開発が出来る

というところがあります。じつはかなり前からこの言語の存在は知っていたのですが、あまりユースケースが思いつかずやってませんでした。
しかし最近やっていたboostの再構築にあたり、いっそ全部シェルスクリプトで書いてみたらどうなんだろうと思い、この際にCotowaliもやってみようと思い手を付けてみた次第です。

こまもか🦊こまもか🦊

Boostに求める機能として、

  • XDG_CONFIG_HOME/boost/にあるスクリプトをあいまい検索し、それを実行する
  • スクリプトの追加機能(これはスクリプトとして実装されている)
  • ネット上のスクリプトを実行/追加する機能(本家は未実装)

がある。これらをCotowaliで実装できるか試してみたい。

こまもか🦊こまもか🦊

まずは環境構築

このサイトを見て環境を構築する。

https://cotowali.org/ja/docs/getting-started

ただ、この方法は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!と表示されればインストール完了。

次にハイライトの設定をしていく。このリポジトリにハイライトようのスクリプトがあるので任意のパッケージマネージャでインストールする。

https://github.com/cotowali/vim-cotowali

僕はdeinを使っているのでこんな感じでインストールした

ft.toml
[[plugins]]
repo = 'https://github.com/cotowali/vim-cotowali'
on_ft = ["cotowali"]

Vimがファイルタイプを認識するように設定をする

init.lua
au BufRead,FileType  *.li set filetype=cotowali

これでハイライトが付くようになった。LSPはあるっぽんだけど説明がよくわからなかったのでパス。情報募集中です。

https://github.com/cotowali/cotowali/tree/taika-dev/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は変換前の型のままになる。