# Launcherスクリプト仕様書：文法編

## 1. 目的

本書は Launcher スクリプトの**文法**を整理したものである。  
Launcher スクリプトは `.ini` 風の独自 DSL であり、メニュー定義、GUI ダイアログ定義、設定保存、ファイル操作、外部プログラム起動を統合して記述する。

本書では、PDF 版の仕様資料を最新仕様として優先する。 fileciteturn7file0 fileciteturn7file1

---

## 2. 全体構造

Launcher スクリプトは、**セクションの集合**からなる。

基本形:

```ini
[SectionName]
...
End
```

ルール:

- セクションは `[名前]` で始まる
- `End` が現れるまで、そのセクションの命令列が続く
- `call [section]` により別セクションへ制御を移せる fileciteturn7file0

---

## 3. セクション種別

### 3.1 ボタンセクション

```ini
[Button1.CIF]
Caption=CIF
...
End
```

ボタンとメニューに対応する標準的なセクション。

### 3.2 ヘルプセクション

```ini
[Button1.CIF].help
message_dialog 使い方
End
```

小さい `?` ボタンから呼ばれるヘルプ用セクション。  
これは古い資料で明示されている。 fileciteturn6file0

### 3.3 起動時セクション

```ini
[Boot]
...
End
```

Launcher 起動時に実行される特別セクション。  
これは古い資料と実例の両方で確認できる。 fileciteturn6file0turn3file15

### 3.4 現行実例に見られる拡張セクション

最近の `.ini` 実例では次のような拡張も使われている。

- `[MenuName].select`
- `[TButton].onload`
- `[RButton].onload`

これらは PDF の主説明には前面には出ていないが、現行実装のフックとして実例で確認できる。 fileciteturn3file15turn3file2

---

## 4. 実行モデル

### 4.1 順次実行

各セクション内部では、命令が上から下へ順に実行される。

### 4.2 call は制御移動

```ini
call [Button1.Fitting]
```

`call [section]` は、指定セクションへ**制御を移動**する。  
関数呼び出しというより goto 的に理解するのが近い。 fileciteturn7file0

### 4.3 変数は共有される

Launcher は環境変数領域を使って値を保持する設計であり、スクリプト全体で変数を共有する。  
したがって、あるセクションで設定した変数を別セクションからそのまま利用できる。

---

## 5. 変数

### 5.1 通常変数

通常変数は `set` 系コマンドや環境変数で定義され、参照時は次の形式を使う。

```ini
$(varname)
```

### 5.2 特殊変数

古い資料では、次の特殊変数が明示されている。 fileciteturn6file0

- `$p`
- `$i`
- `$s`
- `$w`
- `$0 - $999`
- `$a`
- `$n`
- `$o`

特に `$o` は、ファイル選択系コマンドの結果を受け取る変数として重要である。 fileciteturn7file0

### 5.3 ダイアログ変数

`add_dialog widget_type var_name options` の `var_name` が、ウィジェットの値を受け取る変数になる。  
初期値は `set`, `set_if_blank`, `set_if_null` などで事前に設定しておく。 fileciteturn7file1

---

## 6. コメント

### 6.1 コメント行

以下はコメント行として扱われる。 fileciteturn7file0

```ini
# comment
: comment
; comment
rem comment
```

### 6.2 コメント付き値

選択肢や変数値には、人間向けの `#コメント` を含められる。

例:

```ini
"nelder-mead # Downhill simplex"
```

実行時に `remove_comment var` で `#` 以降を除去できる。 fileciteturn7file0turn7file1

---

## 7. 文字列とクオート

ファイルパスや引数文字列は、空白を含む可能性があるため、基本的に `"` でクオートして渡す。  
PDF でも `variable=value` 形式や `def_val=$(python3_path)` 形式の記法が示されている。 fileciteturn7file1

---

## 8. 行継続

行末に `\` がある場合、その行は継続行として扱われる。  
これは `add_dialog`, `create_menu` などの長い引数列で多用される。 fileciteturn7file1

---

## 9. GUI 文法

### 9.1 ダイアログ開始と表示

```ini
new_dialog
...
custom_dialog "title" close
```

- `new_dialog` : ダイアログ定義開始
- `custom_dialog` : ダイアログ表示  
  最下部ボタン種別として `ok`, `cancel`, `yes`, `no`, `close` が使える。 fileciteturn7file1

### 9.2 add_dialog の基本形

```ini
add_dialog widget_type var_name options
```

- `widget_type` : ウィジェット種別
- `var_name` : 値を受ける変数
- `options` : 各ウィジェットへのオプション

### 9.3 主なウィジェット種別

PDF で確認できる主な種別は以下。 fileciteturn7file1

- `tab`
- `reset_tab`
- `choose_file`
- `choose_dir`
- `label`
- `message`
- `combobox`
- `listbox`
- `radiobutton`
- `entry`
- `spinbox`
- `checkbox`
- `dummy`
- `frame`
- `button`
- `pack_frame`

### 9.4 add_dialog オプションの特徴

PDF では次のようなオプションが明示されている。 fileciteturn7file1

- `label_head=`
- `label_tail=`
- `entry_width=`
- `width=`
- `height=`
- `init_val=`
- `def_val=`
- `help_text=`
- `state=readonly`
- `check_exist=1`
- `show_path_button=1`
- `button1_text=`
- `button1_command=`
- `side=top|left`
- `anchor=w|e|n|s|...`
- `var_type=int|float|double|str`
- `from=`
- `to=`
- `increment=`

### 9.5 追加 GUI コマンド

PDF の widget 仕様書では、GUI 周辺の次のコマンドも確認できる。 fileciteturn7file1

- `eval`
- `copy_svars2config`
- `copy_config2scars`
- `add_tooltip`
- `create_menu`
- `add_context_menu`
- `show_context_menu`

---

## 10. パス・ファイル・外部実行文法

### 10.1 ファイル選択

```ini
get_open_file_name "*.xlsx"
get_save_file_name "*.xlsx"
get_open_dir_name "$(last_dir)"
```

さらに、Cancel しても処理継続する `*_continue` 系もある。 fileciteturn7file0

### 10.2 パス生成

```ini
join_path parameter_path $(dir_name) $(filebody).prm
```

`join_path` は引数を連結してパスを作り、指定変数へ設定する。 fileciteturn7file0

### 10.3 外部コマンド実行

既知の内部コマンド以外は、実行可能プログラムとその引数として扱う。  
これは旧資料でも明示されている。 fileciteturn6file0

---

## 11. この文法の特徴

Launcher スクリプトの文法は、次の特徴を持つ。

- セクションベース
- 1行命令中心
- `call` は制御移動
- 変数は環境変数領域ベース
- GUI 構築と実行処理を同居可能
- 複雑なブロック構文を持たず、複合コマンドで表現力を補う

---

## 12. ひとことで言うと

Launcher スクリプトの文法は、

**「環境変数共有を前提にした、1行命令型・セクション型の GUI ランチャー DSL」**

である。
