みなさん、こんにちは。

5月に始めたこの講座も6回目になりました。夏を越え、冷たい風が吹いていますが、皆さま、風邪などひかないようにしてください。

さて、今日は前回の補足から始めたいと思います。前回さらっと紹介した #informatについて、もう少し説明しましょう。TELNET クライアントの漢字コード設定を Shift_JIS にしてコマンド入力してください。

まずは単純に #informat を直接入力してみましょう。

多くの環境では

と出力されたはずです。前回紹介した expanded to: がまた出ましたが、これは built-in function ではなく、built-in variable です。組み込み変数ということですね。built-in variable は TACL が native で持つ環境変数群です。#informat は TACL の会話モードで入力した文字列をどう解釈するかを指定する built-in variable で、値としては PLAIN, QUOTED, TACL のいずれかをとります。

  • PLAIN
    特殊文字の処理を行ないません。前回出てきた [ ] も特殊文字です。他に{ } == | といったものがあります。
  • QUOTED
    特殊文字の処理を行ないます。ただし “” で囲われた部分では特殊文字の処理を行ないません。
  • TACL
    特殊文字の処理を行ないます。

通常は特殊文字の処理をしてほしいので、#informat は TACL になっている環境がほとんどです。#informat と入力して TACL と出力された環境では特になにもする必要はありません。それ以外の環境は、管理者と相談してみた方がいいかもしれません。とりあえずの方策としては、前回のように

と1回入力しておけば、logoff するまで設定が有効です。

入力があれば出力もある、というわけで #outformat built-in variable というものがあります。とり得る値は PLAIN, PRETTY, TACL の三つです。ですが、これをしっかり理解するにはもう一度 #informat の話に戻らないといけません。まず、次のコマンドを入力してみましょう。

するとこうなるはずです。

ここでは2つの問題が出ています。1つは文字化け。1つはエラー。文字化けについてはリモートエコーによるビット落ちのためなので気にしないでください。(TELNET クライアントによっては文字化けしないこともあります)

で、問題はエラーです。5分差し上げますので、何が悪いか推理してみてください。ヒントは文字化けの中にあります。

<チッ、チッ、チッ、チッ、5分経過>

さあ、時間切れです。解答にたどり着きましたか?

文字化けの定番に5C問題というのがあります。¥という文字を半角で表示すると文字コードは5Cになります。英語圏ではこのコードは backslash に割り当てられていて、文字列の escape として使われているため、文字コードに5Cを含む漢字が化けてしまう問題のことです。例えば「表」という文字がその例です。

で、上記の #set コマンドに「表」が含まれているではないか!!

と、思った方はうっかりさん!

TACL では backslash を escape code として使うことはありません。従って「表」という漢字はまったく問題なく使用できます。では TACL の特殊文字は何か?

といえば、上記の通り、 [ ] などですね。「票」には [ が、「評」には ] が含まれているのです。文字化けしたところにも、しっかり [ とか ] が出ていることでも分かります。で、#informat が TACL であるために [ ] を処理してしまい、エラーになったというわけです。

なので、対策は特殊文字の処理を抑止することですね。つまり #informat をplain にすることです。

と入力すると、こうなります。

今度はエラーにはなりませんでした。(文字化けはしょうがない)

さあ、ここで #outformat に戻ります。とり得る値は PLAIN, PRETTY, TACL の3つでした。これによって表示が変わります。まずは TACL から。

おやおや、何だかまた怪しげな文字化けです。解説は後廻しにして、残りも見ておきましょう。

PRETTY と PLAIN はちゃんと出ましたね。ではそれぞれの解説です。

  • TACL
    特殊文字は escape code として ~ を付与して表示します。
  • PRETTY
    特殊文字の処理を行ないません。特殊文字もそのまま素直に表示します。ただし、~_ のみ空白として処理します。
  • PLAIN
    特殊文字の処理を行ないません。特殊文字もそのまま素直に表示します。

ということなのですが、pretty のところによく判らないことが書いてありましたね。~_ ってなんでしょうか。次のコマンドを実行してみましょう。

4行目で ~_ を使っています。3行目との結果の違いに注目してください。

結果はこの通りです。

“x” が表示される場所が1桁ずれています。

では、#output と x の間にいくら空白を入れても表示の時にはすべて欠落してしまいます。PRETTY の場合、~_ を空白として扱ってくれるので、表示の中に空白を入れることができます。

次に進む前に #informat を TACL に忘れずに戻しておきましょう。

#setmanyについても、詳しく説明しましょう。GMT 時刻から JST 時刻に変換するときは #CONVERTTIMESTAMP built-in function を使いました。この関数は戻り値を2つ持っていました。

このうち変換された JST だけ、つまり 212340112287808120 だけを他のvariable に代入するにはどうしたらいいかという問題でした。TACL のプロンプトで……

とやってみましょう。

Time1 には #CONVERTTIMESTAMP の戻り値が2つとも代入されてしまいました。これではダメです。そこで、ひと工夫します。

を追加宣言して

ではどうでしょうか。

事態はさらに悪化してしまいました。

そこで登場するのが #setmany です。複数の値を複数の variable に分配してくれるので、

としてやれば

無事変換後の値だけ取り出せました。

#setmany が処理できる variable や値の数に制限はありません。

ちゃんとそれぞれ代入されています。また値の数と variable の数が合ってなくてもエラーになりません。

大量の項目に展開させるマクロの場合、ここから後ろは要りません!ということもありますよね。その場合は必要な部分の variable だけを書いておけば不要な項目は読み飛ばせるわけです。

頭や途中の項目が要らない!というケースもあります。その時は次のように記述します。

無事 30 と 31 が読み飛ばされました。“_” に相当する部分を読み飛ばしてくれたのです。fl マクロのケースでも #CONVERTTIMESTAMP がエラーコードを返すことは考えられないので、

と書いても十分でした。実際エラー処理もしてないしね。補足で始めると言っときながら補足だけで終ってしまいそうですが、キリがいいので今日はここまでにしておきましょうか。あ、補足ついでにあと1つ。

TACL プロンプトで [ とだけ入力してみてください。

何も起こりませんね。それではさらに何かコマンドを入力してみてください。fileinfo でも fup でも何でもいいです。どうでしょうか。またまた何も起こりませんね。TACL がコマンドを一切無視しているかのようです。どうしてこうなるのでしょう。

[ ] は variable の展開でも使われますが、複数の処理や行をまとめる働きもあります。[ で始まり ] で終わる一連の記述がブロックとして扱われますので、今は TACL がブロックの宣言を受け付けている状態になっています。この状態から ] を入力すれば、ブロック宣言が完了して TACL はそのブロックを実行してくれます。それでは ] を入力してみましょう。

やっと何かが起きましたね。これで TACL が生き返りました。めでたし、めでたし。

次回は fl マクロの話に戻って、表示の成型をやりますよ。Au revoir!