モジュールバンドラstkpackを利用してStackスクリプトを配布する

こんにちは、今回はStackのモジュールハンドラstkpackについて紹介します。
stkpackは、Stackスクリプトの依存関係を1つのファイルに纏め、余分なスペースを削除してファイルを軽くするための便利なツールです。

**stkpackの特徴**

- Stackスクリプトの依存関係を1つの`.pack.stk`ファイルにパック
- 不要なスペースを削除し、スクリプトファイルを軽くする
- 簡潔なコマンドラインインターフェース

## 使い方
以下はこれからパックするStackのスクリプトファイルです。

これは素数判定をするアプリなのですが数学ライブラリ`math.stk`に依存しています。
このままだと配布する際にユーザが`math.stk`も一緒にインストールして貰わなければいけません。
```prime.stk
(../library/math.stk) read-file eval

cls (Prime number judgement apps) println
(> ) input (target) var

(
    cls (Prime number judgement apps) println
    
    (
        (exiting...) println 
        0 exit
    ) (
        (
            now-time (start) var ( 
                target ( is a prime number \(time: ) concat time concat ( second\))
                concat println target set-clipboard
            ) (
                target ( is not a prime number \(time: )  concat time concat ( second\))
                concat println
            )
            target prime? eval now-time start sub (time) var if  
        ) (
            (Please enter the number.) println
        ) 
        target ([0-9]) regex () join (target) var target if
    )
    target (exit) regex if
    (> ) input (target) var
) 
(true) while

```
**こんな状況こそstkpackの出番です！**

ターミナルのstackの所を[stack-lang](https://github.com/stack-community/stack-lang)の処理系のパスに置き換えて実行してください。既にパスが通ってるならそのままでOKです。
起動するとウェルカムメッセージの後に入力プロンプトが出るので、パックしたいStackスクリプトファイルのパスを入力します。

```bash
$ stack ./stkpack.stk
Welcome to stkpack !!!
Please enter Stack script file you want to pack
> prime.stk
Deleted verbose spaces.
Loading ../library/math.stk
The packing is done.
Deleted verbose spaces.
All of the packing is completed!
Created pack file at ./prime.pack.stk
```

すると、以下のファイルが作成されます。
```prime.pack.stk
# This file was created by stkpack # # Stack programming language mathematics standards library # # Pi # 3.141592653589793 (pi) var ( # Solve abs # (num) var num (-) () replace (number) cast ) (abs) var ( # Solve sum of list # (array) var array (i) (  i total add (total) var ) for total ) (sum) var ( # Solve radian form angle # pi mul 180 div ) (radian) var ( # Solve average of list # (array2) var array2 sum eval array2 len div ) (average) var ( # Solve cumulate value from the range # (max) var (count) var (count copy 1 add max cumulate eval add) (count) count max less if ) (cumulate) var ( # Solve max value in list # (array) var array 0 get (temp) var array (i) (  (i (temp) var) ()  temp i less if ) for temp ) (max) var ( # Solve max value in list # (array) var array 0 get (temp) var array (i) (  (i (temp) var) ()  i temp less if ) for temp ) (min) var ( # Judgement is it prime number # (number) var 2 (i) var true (flag) var ( (false) (true)  number 2 less if (flag) var ) (  (false (flag) var) (  ( ( false (flag) var ) () number i mod 0 equal if i 1 add (i) var  )  (i number 0.5 pow 1 add less flag and) while  ) number 2 mod 0 equal number 3 mod 0 equal or if ) number 4 less if flag ) (prime?) var ( # Split the number # (num) var 1 num 1 range rand (r) var [r num r sub] ) (split-number) var cls (Prime number judgement apps) println (> ) input (target) var ( cls (Prime number judgement apps) println  (  (exiting...) println  0 exit ) (  (  now-time (start) var (  target ( is a prime number \(time: ) concat time concat ( second\))  concat println target set-clipboard  ) (  target ( is not a prime number \(time: ) concat time concat ( second\))  concat println  )  target prime? eval now-time start sub (time) var if ) (  (Please enter the number.) println  )  target ([0-9]) regex () join (target) var target if ) target (exit) regex if (> ) input (target) var ) (true) while 
```
これでStackスクリプトの依存関係が1つのファイルに纏められ、さらに余分なスペースが削除された事によってファイルも軽くなりました。
これで素数判定アプリを皆に使ってもらえます(Stack自体のインストールは必要ですが)。


## ソースコード

stkpackのソースコードは以下のGithubリポジトリにあります。
ぜひご覧ください！

https://github.com/stack-community/examples/blob/main/apps/stkpack.stk