日本語プログラミング言語Mindの小技 「二番目を捨てる」～スタックツートップのNo.1を生かしてNo.2を捨てる～

# はじめに
日本語プログラミング言語Mindの小技「二番目を捨てる」について説明したいと思います。

# 対象読者
日本語プログラミング言語Mindのユーザー、または日本語プログラミング言語に興味のある方

# この小技に関連するMind言語マニュアル

この小技に関連するMind言語仕様の記述はMind8プログラミングマニュアルに記載があります。
１１ スタック操作
└スタック操作語
　└二番目を捨てる

>構文＝＜データ１＞　＜データ２＞　二番目を捨てる　→　＜データ２＞
>
> スタックに２つのペアデータが積まれているとき、その奥の方にあるデータを捨てるのに使われる。
>
>例を示す。
　既に「座標を得る」という架空の単語が定義されているとする。仕様は次のようなものである。
>
>座標を得る　→　Ｘ座標、Ｙ座標
>
>次に、この上位語として、Ｘ座標だけ、あるいはＹ座標だけを単独で得るための処理単語「Ｘ座標を得る」と「Ｙ座標を得る」を定義してみよう。
>
>Ｘ座標を得るとは　（・　→　Ｘ座標）
　　　　座標を得て　捨てること。
>
>Ｙ座標を得るとは　（・　→　Ｙ座標）
　　　　座標を得て　二番目を捨てること。
>
> 上の定義では共に下位の処理単語として「座標を得る」を引用している。その単語はＸ座標とＹ座標の２つのデータをスタックに返すが、このうちの一方を捨てることにより、どちらか一つだけを返す上位単語が定義できるのである。一旦局所変数に入れてから参照しなおす方法よりもプログラムが簡潔になる。


本機能（本記事）は、下記のバージョンに対応しています。Mind８のLinux版も対応していると思いますが、本記事では特に検証を行っておりません。

# 対応バージョン
■Mind７　■Mind８　■Mind９
■Windows版　□Linux版

# 小技の解説
この記事の取り扱う「二番目を捨てる」はスタック志向言語Forthの流れを汲む日本語プログラミング言語Mindの特徴的な機能です。

この単語のランタイム定義を直接読んでいないので、Mindのいろいろな単語のランタイム定義（スタック操作マクロ）を読んだイメージとあくまで動きの結果からの推測ですが、

スタックトップにある値とその手前の値をPOPしてPOPして、最初にPOPした値だけをPUSHして、つまりスタックツートップのNo.1を生かしてNo.2を捨てるみたいな動作です。

スタック上にNo.3以降が存在するならばそれがNo.2に格上げされるみたいな。

# Mindプログラムソース

```mind:throwawaysecond.src
棚積みするは　無処理と　等価。

棚に荷物を二つ積むとは　（・　→　文字列１、文字列２）
    「これはＡ様のお荷物」を　棚積みし
    「これはＢ様のお荷物」を　棚積みすること。


棚から上の一つ目どかして上から二つ目を返すとは　（文字列１、文字列２　・　→　文字列１）
    捨てること。

棚の上から二つ目どかして上の一つ目を返すとは　（文字列１、文字列２　・　→　文字列２）
    二番目を捨てること。

メインとは　（・　→　・）
    棚に荷物を二つ積み、
    棚に荷物を二つ積み、
    棚から上の一つ目どかして上から二つ目を返し、一行表示し、
    棚の上から二つ目どかして上の一つ目を返し、一行表示すること。
```
Mindにとってスタックに変数を置くという記述は根源的なものなので、とりあえず変数名を記述すればスタックに置くことになるのですが、このソースではその点わかりやすくするため、「棚に積む」という無処理単語を等価定義しています。


「棚に荷物を二つ積み」を２回繰り返したことにより、棚の状態は下図のような状態となっています。

｜「これはＢ様のお荷物」
｜「これはＡ様のお荷物」
｜「これはＢ様のお荷物」
｜「これはＡ様のお荷物」
└ーーーーーーーーーーーーーーーーー

「棚から上の一つ目どかして上から二つ目を返し」では「捨てる」が実行されていますので、棚の状態は下図となります。

｜
｜「これはＡ様のお荷物」
｜「これはＢ様のお荷物」
｜「これはＡ様のお荷物」
└ーーーーーーーーーーーーーーーーー

「一行表示し」で一番上の「これはＡ様のお荷物」が使われるので下図の状態となり、

｜
｜
｜「これはＢ様のお荷物」
｜「これはＡ様のお荷物」
└ーーーーーーーーーーーーーーーーー

ここでお題の「二番目を捨てる」を呼び出している「棚の上から二つ目どかして上の一つ目を返し」が実行されると棚の状態は下図のようになります。

｜
｜
｜
｜「これはＢ様のお荷物」
└ーーーーーーーーーーーーーーーーー

そして、この棚の状態からまた「一行表示」が呼び出されますね。
みなさんは、コンソールに表示されたお荷物の状態はイメージできましたでしょうか？


# コンパイル結果
ではコンパイルしてみます。下位ライブラリはfileを指定します。

## Mind９
下図はMind９βです。
```cmd:
C:\developments\vscode\mind9>mind throwawaysecond file   

日本語プログラミング言語 Ｍｉｎｄ Version 8.11 for Windows
          Copyright(C) 1985 Scripts Lab. Inc.
コンパイル中 .. 終了
Coping.. C:\mind9-beta\mind9-beta\bin\mindex.exe --> throwawaysecond.exe
```
## Mind8
```cmd:
C:\developments\vscode\mind9>mind throwawaysecond file

日本語プログラミング言語 Ｍｉｎｄ Version 8.07 for Windows
          Copyright(C) 1985 Scripts Lab. Inc.
コンパイル中 .. 終了
Coping.. c:\pmind\bin\mindex.exe --> throwawaysecond.exe
```
## Mind7
```cmd:
C:\developments\vscode\mind9>mind throwawaysecond file
日本語プログラミング言語 Ｍｉｎｄ Version 7.5 for Windows
          Copyright(C) 1985-2004 Scripts Lab. Inc.
          Single user license.  Serial No:********
コンパイル中 - 終了
Coping.. C:\mind7\bin\mindexec.exe -> throwawaysecond.exe
```
# 実行結果
つづいて実行してみます。
Mind7の結果です。記述は割愛していますがMind8/9βも同じです。

```cmd:
C:\developments\vscode\mind9>throwawaysecond
これはＡ様のお荷物
これはＢ様のお荷物

C:\developments\vscode\mind9>
```
みなさん、結果は正しく予測できましたでしょうか？:relaxed:


# 参考情報
この小技「二番目を捨てる」を使った記述例の記事はまだないようです。見つけたら教えてください。


# おわりに
いかがでしたでしょうか？なにかの参考になれば幸いです。2025年は日本語プログラミング言語Mind生誕４０周年です。

## 本記事シリーズのご紹介
本記事シリーズ「日本語プログラミング言語Mindの小技」は「日本語プログラミング言語Mind生誕４０周年プロジェクト」の一環です。

興味を持たれた方は[日本語プログラミング言語Mind公式サイト](https://www.scripts-lab.co.jp/mind8download/download.html)にアクセスすると、Mindコンパイラをダウンロードできますよ。

[Mindプログラミングマニュアル（基本文法）](https://www.scripts-lab.co.jp/mind/ver8/doc/index.html)ページから気になるお題の構文を選んで、この記事のようにサンプル実装実行してQiitaにアウトプットしてみましょう！

筆者はMind7/8/9βで検証しておりますが、もちろんMind8だけでもじゅうぶんです。またお題が既存記事とかぶるのはまったく問題ありません。同じお題でみなさまの多様斬新なサンプルをお待ちしております:grinning:

面白い！、楽しい、カンタン、難しいのも書ける！みんなでやってみよう:relaxed: