本文へスキップ
totonoe.tech

難解プログラミング言語を整える

専門

INTERCALを整える。

= PLEASE の回数まで検査される1972年の言語 INTERCAL を実行して、変数のビットと NEXT スタックを追えます

INTERCAL が初めての方は、先に そもそも INTERCAL とは をどうぞ。言語の紹介は INTERCAL の図鑑ページ にもあります。

サンプル(クリックでエディタに入れる)

プログラム 入力するだけ・送信ゼロ

出力

「実行」を押すと、ここに出力が出ます。

ステップ実行

今の行・変数のビット・NEXT スタックを見る

文の一覧(強調=次に実行する文)

変数(10進と2進)

NEXT スタック(上が次の RESUME で戻る先)

出力(途中経過)

 

そもそも INTERCAL とは

礼儀の回数まで検査される、冗談として作られた言語。

INTERCAL(インターカル)は、1972年に Don Woods と James M. Lyon が作った言語です。正式名称は Compiler Language With No Pronounceable Acronym(発音できる略語を持たないコンパイラ言語)で、略しても INTERCAL にはなりません。既存のどの言語にも似ないことを目指して作られました。

文は DO か PLEASE で始めます。意味は同じですが、C-INTERCAL(現在も使われている実装)は PLEASE の数を数え、文の数の約5分の1より少ないと「礼儀が足りません」、約3分の1より多いと「丁寧すぎます」とエラーにします。実行を始める前の検査なので、プログラムは1文も動きません。

足し算や引き算の演算子もありません。あるのは、2つの数のビットを交互に並べる $(mingle)、ビットを選んで詰める ~(select)、となり合うビットの AND・OR・XOR だけです。「足し算」のサンプルは、これらと NEXT・RESUME の組み合わせで作っています。

goto の逆にあたる COME FROM は、のちに C-INTERCAL が加えた命令です(esolangs.org)。ラベルのついた文を実行し終えると、次の行へ進まずに COME FROM のある行へ制御が移ります。

対応している命令

命令 意味
DO / PLEASE / PLEASE DO 文の始まり。DO と PLEASE は同じ意味で、PLEASE の割合が検査される
NOT / N'T(DON'T) 文を無効にする(ABSTAIN された状態で始まる)
%50 文を実行する確率(パーセント)。実行のたびに乱数で決まる
(n) 行頭のラベル。NEXT・COME FROM・ABSTAIN の行き先になる
.n :n #n 16ビット変数・32ビット変数・定数(65535まで)
.1 <- 式 代入。16ビット変数に 65535 を超える値を入れるとエラー
$ (mingle) 16ビット2つを1ビットずつ交互に並べて32ビットにする
~ (select) 右の1が立つ位置の左のビットだけを集めて下に詰める
& V ? 単項の AND・OR・XOR。となり合うビット同士(最上位は最下位と)で計算する
' と " グループ化。入れ子にするときは外側が ' 、その内側が " 、さらに内側が ' と交互に使う
(n) NEXT (n) へ飛び、戻り先をスタックに積む(79段まで)
RESUME 式 スタックから式の数だけ取り出し、最後に取り出した戻り先へ戻る
FORGET 式 スタックから式の数だけ捨てる
COME FROM (n) (n) の文を実行し終えたとき、次の行ではなくこの行へ来る
GIVE UP プログラムを終える
READ OUT 値をローマ数字で1行ずつ出す(変数・式を + でつなげて並べられる)。配列を渡すと文字として出す
WRITE IN 入力欄の1行ぶんを数字の英単語(ONE TWO THREE)として読み、変数に入れる
ABSTAIN FROM / REINSTATE ラベルの文、または動名詞(CALCULATING など)の種類ごとに無効にする・戻す
STASH / RETRIEVE 変数の値を退避する・戻す
IGNORE / REMEMBER 変数への書き込みを無視する・無視をやめる
,n ;n 1次元の配列(16ビット・32ビット)。,1 <- #13 で大きさを決め、,1 SUB #1 <- #238 で要素に入れる

対応していないもの

  • 多次元配列(BY)と、配列への WRITE IN(文字の入力)・STASH・IGNORE。
  • C-INTERCAL の拡張(NEXT FROM、計算式による COME FROM、^ や @ などの演算子、マルチスレッド)。同じラベルへの COME FROM が2つあると、このページではエラーにします。
  • エラー番号は PLEASE の検査(E079・E099)だけ載せています。ほかのエラーは日本語の説明と、マニュアルにある英語の文言を出します。

出力の読み方

  • READ OUT は値をローマ数字で1行ずつ出します。4000 以上は文字の上に線を引いて「×1000」、100万以上は小文字で「×100万」を表します。0 は上線だけの「‾」です。
  • 文字の出力は、配列に数値を入れて READ OUT する方式(Turing Text Model)です。1つ前の値との差をビット反転して文字にするので、サンプルの数値は Hello, world! のために並べてあります。
  • WRITE IN は ZERO(OH)・ONE〜NINE(NINER)を空白で区切って1行に書きます。16ビット変数には 65535 まで入ります。
  • 実行は1回につき最大100万文までで、それを超えると止まります。

参考資料: The INTERCAL Revised Reference Manual(mingle・select・単項演算の定義と例、READ OUT・WRITE IN の形式、NEXT スタック)、 esolangs.org: INTERCAL。 PLEASE の検査の割合(文のおよそ5分の1〜3分の1)は、C-INTERCAL の挙動として広く紹介されている目安です。正確な境目の公式の記述は確かめられず、このページはその目安で判定しています。原典の1972年のマニュアルには比率の記載がありません。

このツールについて

INTERCAL は「PLEASE と書く回数が少なすぎても多すぎてもエラー」という決まりを持つ、1972年生まれの言語です。基本の命令に対応していて、実行すると今の行・変数の中身(2進数つき)・NEXT スタックを1歩ずつ追えます。

INTERCAL を実行し、PLEASE の割合の検査と COME FROM、変数のビットと NEXT スタックをステップで確かめられます。

主な機能

  • PLEASE の割合を実行前に検査(E079・E099)
  • COME FROM・NEXT・RESUME・FORGET に対応
  • mingle・select・単項 AND/OR/XOR を式で評価
  • 変数を10進と2進で表示し、NEXT スタックを1文ずつ追える
  • ローマ数字の出力と、配列による Hello, world!

よくある質問

Q. INTERCAL の PLEASE は何回書けばよいですか。

A. C-INTERCAL の実装では、文の数を n として、PLEASE で始まる文が n÷5(切り捨て)より少ないと『礼儀が足りません』(E079)、n÷3(切り捨て)より多いと『丁寧すぎます』(E099)でエラーになります。このページもその基準で検査します。原典の1972年のマニュアルには比率の記載はありません。

Q. INTERCAL に足し算の演算子はありますか。

A. ありません。あるのは2つの数のビットを交互に並べる mingle($)、ビットを選んで詰める select(~)、となり合うビットの AND・OR・XOR をとる単項演算だけです。サンプルの足し算は、これらと NEXT・RESUME を組み合わせて作っています。

Q. COME FROM とは何ですか。

A. goto の逆にあたる命令です。DO COME FROM (10) と書くと、ラベル (10) の文を実行し終えたとき、次の行へ進まずに COME FROM のある行へ制御が移ります。INTERCAL-72 にはなく、C-INTERCAL が加えました。

Q. このページで動かせない INTERCAL の機能はありますか。

A. 多次元配列(BY)、配列への WRITE IN(文字の入力)・STASH・IGNORE、NEXT FROM や計算式による COME FROM、^ や @ などの拡張演算子は未対応です。同じラベルへの COME FROM が2つあるプログラムもエラーにします。

Q. 入力した内容は外部に送られますか。

A. 送られません。プログラムも入力もブラウザの中だけで実行します。

入力値はURLの「#」以降に入るためサーバーには送信されません。リンクを開くと同じ状態を復元します。

続けて整える

運営サイト

私たちが運営するサイト