Chicken-Schemeのいわゆるenv環境Dustの紹介

#はじめに
全世界70億人のSchemeファンの皆様、こんちにわ。
諸君らの愛してくれているScheme処理系[Chicken](http://wiki.call-cc.org/)のVersion5がリリースされているのは全世界の常識ですが、真に遺憾ながらライブラリの移植が現在進行中のため、泣く泣くVerision4から移行できていない方も多いと思います。
そこでVersion5のeggに登録されていた[Dust](http://wiki.call-cc.org/eggref/5/dust
)のご紹介です。
これを使うことで5系列と4系列を併存させて思いのままにSchemeを書く事が出来るでしょう。
公式のドキュメントに少し間違いがあるので、その部分もカバーしていこうと思います。これらは後でsend-pr予定です。
情報は2020年5月6日現在のものです。

#Dustとは
Dustとは公式ページにもある通り、
>Dust is a binary-based CHICKEN version manager. It lets one quickly install multiple CHICKEN versions and switch between them.」

するためのコマンドです。
複数のVersionをインストールし、それを切り替える事で環境の再現が容易となります。
本体をDustで管理し、ライブラリたるeggは`chicken-install -list-versions`から`chicken-install hoge:ver`で良いでしょう。
注意点としてenv環境としては公式にはバイナリのみの対応（後に伸べますが、現在の実装上は自分でコンパイルした物も使えます）。shimsなどは対応していません（chickenは保存場所などを環境変数かコンパイル時のハードコードで判断するので問題はなさそう）。
公式にはamd64 GNU libc-based Linuxとamd64 musl-based Linuxとamd64 FreeBSDのみサポートです（OpenBSDのバイナリもあるしissueも閉じているのでマニュアルの遅れだと思われます）。2020/05/08追記:付属マニュアルではOpenBSD公式対応です。Chickenサイトの更新がまだのようです。
もちろん*nix以外を利用する開発者などいないのでナニモモンダイハアリマセン。
またchicken一般の注意点としてmonoとcsc csiのコマンド名がかぶるのですが、一部Linux用のパッケージと異なり、Dustのインストールバイナリは改名されていないためmonoのコマンドを隠蔽します。2020/05/08追記:[off機能が導入予定です。](https://todo.sr.ht/~evhan/dust/14)。2020/6/10追記：導入されました。 `dust disable` でオフに出来ます。場合によっては ‘hash -r‘ 等でのシェルのハッシュテーブル更新が必要になるでしょう。

#インストール
適当な場所 ${HOME}/local/bin 等にて

```
wget -O dust https://foldling.org/dust/dust-$(uname -m)-linux
chmod +x dust
```

が公式の手順です。もちろん皆さんは頻繁に使うでしょうから、PATHを通した所に置くのがオススメです。
また公式ドキュメントの~~間違いと言えますが~~*BSDの場合には dust-amd64-bsd-openbsd などになりますので、[ダウンロードフォルダ](https://foldling.org/dust/)を直接確認してダウンロードした方が良いでしょう。2020/05/08追記:手順にOnLinuxが明記してありました。
~~公式に `chicken-install -n dust` でも良いよとありますが、エラーでコンパイル不能です。~~ 2020/05/08追記：[修正されました](https://todo.sr.ht/~evhan/dust/12)

#使用方法
環境変数DUST_HOMEを設定して主にホームフォルダ以下で利用する方法と、root権限で/opt/dustにフォルダを作成し、グループ権限で利用する方法があります。DUST_HOMEを設定していないと案内が出ます。

```
export DUST_HOME=${HOME}/.chicken
#もしくは dust init <group>

echo 'eval "$(./dust env)"' >> ~/.bash_profile
#bashの場合、公式推奨の~/.profileは.bash_profile等が存在する多くの環境では読まれません

#バイナリインストール
dust install master
dust install 4.13.0
#現在インストール可能なVersionを示す機能がありません。HP等で確認しましょう。

#状態確認と切り替え
dust status
dust switch 4.13.0
csi -p "(repository-path)"

dust switch master
csi -R chicken.platform -p "(repository-path)"
dust status
```

などと利用していくことになります。
モジュールシステムの変更のため~/.csirc はVer4とVer5で非互換のため、`csi -n`を利用する事が増えるでしょう。
DUST_HOME設定によって”＄｛DUST_HOME｝/user/ユーザー名/”以下、もしくは"/opt/dust/user/ユーザー名/"以下にインストールされます。セキュリティやパーティション容量などを考慮してお好きにどうぞ。

#ダークサイドへの誘惑
公式にはバイナリインストールのみ対応ですが、実際には設定ファイルでなくインストールディレクトリ自体を見ているため外部からインストールした物を管理させることが可能です。chickenのコンパイルには直近のバイナリが必要ですが、dustの導入によりソースからのコンパイルとインストールも容易になります。以下は [clang/llvmでのコンパイル例](https://qiita.com/KiyotakaTheBlack/items/3dbc73ce278c2b4b975d) 。chickenは必殺クロスコンパーイルも容易なため、調べてみるのも良いでしょう。
2020/05/08追記：[サポートされる可能性はありますが優先順位は低いそうです](https://todo.sr.ht/~evhan/dust/13)。認識はされたので多少は気にかけてくれるのではないでしょうか。

```
git clone git://code.call-cc.org/chicken-core
make PLATFORM=linux PREFIX=$HOME/chicken/user/ユーザー名/version/master-llvm \
C_COMPILER=clang CSC_PROGRAM=chicken-csc CSI_PROGRAM=chicken-csi
make PLATFORM=linux PREFIX=$HOME/chicken/user/ユーザー名/version/master-llvm \
C_COMPILER=clang CSC_PROGRAM=chicken-csc CSI_PROGRAM=chicken-csi install
make PLATFORM=linux PREFIX=$HOME/chicken/user/ユーザー名/version/master-llvm \
C_COMPILER=clang CSC_PROGRAM=chicken-csc CSI_PROGRAM=chicken-csi clean confclean

dust switch master-llvm
csi -R chicken.platform -p "(repository-path)"
```
なおコンパイル時に一部のファイル名情報などが埋め込まれているのか、たんにコンパイル後のファイル等を移動しただけでは動作しません。

#まとめ
Dustにはライブラリを含めたVer固定の可能性など、まだまだ発展途上な点が多いですが、Scheme系で複数環境を併存できるのは非常に便利です。みんなでドシドシ使って[公式issues](https://todo.sr.ht/~evhan/dust)に要望をあげていきましょう。
それでは皆様Happy Hacking!