Hylang環境構築

## はじめに

Hylangって何という話については、すでにいくつかの記事がありますので、そちらを参照してください。
簡単に言うとpythonの資産をフル活用できるLispです。

https://qiita.com/riktor/items/498a30d41f89d41ea168

https://qiita.com/masatoi0/items/8215353612bc32ad0717

## フォーマッターのインストール

HylangはClojureライクな記述スタイルなので、以下のClojure用のフォーマッターが利用できます。
Hylangが公式で提供している拡張機能だと保存時にファイル全体のフォーマットができないので、以下のコマンドをインストールします。

- cljfmt

以下のコマンドを実行してインストールする

```
/bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/weavejester/cljfmt/HEAD/install.sh)"
```

## 実行環境構築

Hylangはpythonのライブラリとして公開されているので、venvを利用してライブラリ管理の仮想環境を構築してからインストールを行います。

まず`hylang`という名前でライブラリ管理の仮想環境を作成します。

```sh
python -m venv hylang
```

次にvenvの仮想環境を有効化します。
これはシェルを起動する度に実行する必要があるので注意してください。

```sh
. hylang/bin/activate
```

最後に以下のライブラリをインストールします。

- hy
  - hylangの実体を提供するライブラリ
- hyrule
  - hylangのユーティリティを提供するライブラリ

```sh
pip install hy
pip install hyrule
```

## vscode拡張機能のインストール

vscodeで実行するに当たって以下の拡張機能をインストールします。

- `vscode-hy (hylang official)`
  - hylangの公式が提供している全体的なサポート機能

![スクリーンショット 2023-11-03 18.50.46.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3588954/04db2934-d30c-3e29-5c66-47f395a1c47c.png)

- `Save and Run` (wk-j)
  - 保存時に特定のコマンドを実行するための拡張機能

![スクリーンショット 2023-11-03 18.52.03.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3588954/98ecc959-6b0f-66f3-fe81-b78a3aa1365f.png)

## vscodeの設定ファイル変更

まず、設定ファイルは以下の手順で開きます。

1. `Command + Shift + p`を押下する
2. `Preferences: Open User Settings (JSON)`を選択する

以下の内容を追加して、ファイルの保存時に`cljfmt`を実行して、ファイル全体のフォーマットが行われるようにします。

```json
  "saveAndRun": {
    "commands": [
      {
        "match": "\\.hy$",
        "cmd": "cljfmt fix ${file}",
        "useShortcut": false,
        "silent": true
      }
    ]
  }
```

## ショートカットキーの追加設定

まず、ショートカットキーの設定ファイルを以下の手順で開きます。

1. `Command + Shift + p`を押下する
2. `Preferences: Open Keyboard Shortcuts (JSON)`を選択する

デフォルトの設定だと、コメント行でEnterを押下する度にコメント行が増えるので、以下の設定を追加して抑制します。

```json
    {
        "key": "enter",
        "command": "-hy.continueComment",
        "when": "editorTextFocus && hy:cursorInComment && hy:keybindingsEnabled && editorLangId == 'hy'"
    }
```

## 実行ファイル

実行ファイルの拡張子は`.hy`にします。
以下の内容で`test.hy`という名前でファイルを作成します。

```clojure
(print "Hello world.")
```

コマンドラインから以下コマンドを実行するとHylangプログラムが実行されます。

```sh
hy test.hy
```

いちいちコマンドラインからプログラムを実行するのはめんどくさいので、vscodeの機能でデバッグ＆実行を行いたいところなのですが、Hylangには対応するデバッガーが存在しないっぽいので自分で実行したほうが速いです。

また、関数単位の実行であれば、後述のREPL経由での実行が速くて便利です。

## REPL経由での実行

まず、vscode上でREPL実行をするためには、以下の手順を踏む必要があるので注意してください。

1. vscodeのターミナル上で`venv`の仮想環境をアクティブにする
    - 今回の場合は `. hylang/bin/activate` で行います
2. プログラムファイル上の実行したい関数にカーソルをあわせておく
3. `Alt + Enter`を押下する

以下のように関数の上にカーソルをあわせておき、`Alt + Enter`を押下すると

![スクリーンショット 2023-11-03 19.29.11.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3588954/7ae6fcaf-b2dc-b0f0-2dd7-0f3500c8b2c9.png)

REPLに関数を読み込み、実行までを行ってくれます。
初回実行時はREPLのプロセスを起動するので時間がかかりますが、2回目以降の場合は、すでに起動しているREPLに対して関数の読み込み＆実行を行うので、直ぐに実行結果を得ることができます。

![スクリーンショット 2023-11-03 19.29.53.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3588954/3734e76a-82cc-86a6-d3b8-7fd68af4a3d1.png)

## 最後に

今回はHylangの環境構築までを行いました。
数年ぶりにHylangを触ったのですが、知らないうちに色々と変わっていたので、次回は、そのあたりをまとめられると良いかなと思っています。

## 参考
- https://qiita.com/lagenorhynque/items/a5d83b4a36a1cf1cacbe
- https://github.com/weavejester/cljfmt#configuration