👾

V 言語のモジュールを作る

2021/07/06に公開
4

こんにちは、最近 V 言語の仕様変更に追従する作業のおかげで暇しない tkm です。

少し前から vdotenv という V 言語向けの dotenv モジュールを作っていて、少しは知見が溜まってきたので V 言語のモジュール開発のチュートリアルを書きたいと思います。

V 言語について

GitHub リポジトリ

V 言語自体については本記事の本題ではないので特記しませんが、V 言語の Contributor の方が開発者から見た V 言語とその(誇大)広告についてという記事を書かれているので参考になると思います。

僕は「V」という名前がかっこいいという理由から使い始めました。

V 言語のインストール

V 言語をインストールしていない方は https://github.com/vlang/v#installing-v-from-source を参考にインストールしてください。

既にインストール済の方は以下のコマンドでアップデートしてください。

v up

v up が失敗する場合は以下のコマンドを試してください。

コマンド
# Vのローカルリポジトリに移動
cd path/to/v

# ローカルの master ブランチにリモートリポジトリからの変更を取り込む
git pull

# ビルドする
make

これで v up がしばらく失敗しなくなります。

V モジュール開発チュートリアル

このチュートリアルは以下の順序で構成されています。

  1. モジュールの初期化
  2. 他のモジュールから呼び出すことができる関数を持つモジュールを作成
  3. 他のモジュールから呼び出して実行してみる
  4. test を追加する

1. モジュールの初期化

はじめにモジュールの初期化を行います。 V 言語には初期化用のコマンドがあるので今回はそちらを利用します。

まずは、任意の場所に以下のようにチュートリアル用のフォルダを作成します。

mkdir tutorial-modules
cd tutorial-modules

次に v new [module name]でモジュール開発用のディレクトリを作成します。

v new mymodule
# 対話式で入力していきます
Input your project description: my first v module
Input your project version: (0.0.0)
Input your project license: (MIT)
Initialising ...
Complete!

すると以下のようなファイル構造でモジュールが初期化されていることが確認できます。

ls -a mymodule/
.  ..  .git  .gitignore  mymodule.v  v.mod

因みにモジュールに関するルールは以下のようになっています。

・ Module names should be short, under 10 characters.
・ Module names must use snake_case.
・ Circular imports are not allowed.
・ You can have as many .v files in a module as you want.
・ You can create modules anywhere.
・ All modules are compiled statically into a single executable.

https://github.com/vlang/v/blob/master/doc/docs.md#modules より

2. 他のモジュールから呼び出すことができる関数を持つモジュールを作成

初期化時に作成されたmymodule.vを以下のように書き換えます。

// mymodule/mymodule.v
module mymodule

// To export a function we have to use `pub`
pub fn hello(name string) string {
    return 'Hello, $name!'
}

このhello関数は string の name パラメータを受け取り、受け取った name パラメータを用いて補完された文字列を返します。

V 言語の文字列補間については #string-interpolation

3. 他のモジュールから呼び出して実行してみる

tutorial-modules 直下に main.v を作成して以下のように編集します。

// main.v
import mymodule

fn main() {
    message := mymodule.hello('tkm') 
    println(message)
}

実行:

v run main.v
hello tkm

4. test を追加する

test に関する詳細は #testing
ファイル名などのルールは #test-files
から確認できます。

mymodule_test.v という名前でテストファイルを作成します。

// mymodule/mymodule_test.v
module mymodule

fn test_hello() {
    assert hello('tkm') == 'hello tkm'
}

以下のコマンドで test を実行します。

# mymodule 内のテストが実行されます
v test mymodule

その他の実行方法については #running-tests を参考にしてください。

CHANGELOG

2021-07-06

  • 初公開
    • どうでも良いが筆者の誕生日です

2022-10-11

  • タブをスペースに変換

Discussion

catnosecatnose

分かりやすかったです!
(& 誕生日おめでとうございました🎉 )

zztkmzztkm

感想とお祝いありがとうございます!!!

ついでに質問なのですが、V言語のシンタックスハイライトをzennで有効化するには、そもそものPrism.js の方で対応させる必要がありますよね…??(zenn-cliのソースコードを覗いたらPrism.jsを使っていたので)

catnosecatnose

実はちょうど今日V言語のシンタックスハイライトに対応しました。

現状では今後作成される記事or本文を更新した記事にのみ適用されます。
投稿済みの記事については(一文字でも構わないので)本文を更新する必要があります。

zztkmzztkm

更新したらできてました!ありがとうございます!