このWIKIを編集するにはパスワード入力が必要です

認証パスワード
RSSフィード

解消した問題(2008年5月3日版まで)

ドキュメントパーサで領域語をエスケープする記号を独立したトークンとして扱うための仕組みを検討します。(この提案は却下されました)

このプログラム(diction)がファイルを開くときにはバイナリモードで開きます。しかし、標準入力・標準出力を使うときにはシステムが開いたファイルハンドルをそのまま使います。後者はおそらくテキストモードです。これは設計の一貫性を損ないます。

POSIX準拠のシステムでは、ファイルを開くときバイナリ・モードとテキスト・モードの区別はありません。とりあえずPOSIX準拠であれば問題はないようです。

標準入出力が閉じていたり、典型的でない状態になっていたりするとまた別の問題が発生します。解決策として、標準入出力を使用しないためのコマンドライン・オプションを用意することにします。

コンティニュエーションを実行するには continue 命令を使います。continue 命令にコンティニュエーションでないデータを与えたときには、何もせずに次のステップに進みます。continuation 命令の戻り値を利用することはできません。

ループは単純な無限ループだけになりました。ループを抜けるには break 命令を使います。コンパイラはこれらの制御構造を単なるジャンプ命令に変換します。

集合から要素を一つ取り出す演算は、構想段階ではイオタ演算子と呼ばれていましたが、pick という命令になりました。

ディクションは struct singular を使わなくなりました。instruction.h は opecode.h に名前を変えて、ディクションとポーリンで共有されています。ただし、構造体 instruction の定義は統合されていません。

浮動小数点数を有理数で近似するアルゴリズムがバグっていましたが直しました。ついでにアルゴリズムを情報量の費用対効果を利用するように改定しました。円周率を 22/7、コピー用紙の縦横比を 7/5 というように思い切りのよい近似をします。

halt 命令は、現在の動的環境を破壊して、仮想マシンを終了します。


Windows でコンパイルしたものはいろいろと問題があります。ターシャリーは put_character 関数の戻り値を再代入していなかったことが原因で、問題は解決しました。ディクションはおそらくメモリを解放していないことが原因です。ポーリンは realloc 関数の呼び出しが多すぎることが原因で、問題はおそらく解決しました。


手続きをデータとして使用することはできません。読み出し演算で、アドレス変換の結果が手続きを指すアドレスだったとき、その手続きが起動されます。手続きを定義する領域 procedure は直接目的語をとります。(この提案は発展的に解消されました)

非局所制御は判断であるか、アドレス変換であるか、アドレスから値への変換です。読み出し演算の内部ステップはアドレス変換であるか、アドレスから値への変換であるか、「その他」です。situationは判断です。evacuate, appropriate, from-write、そして非局所制御ではありませんがローカル化継承はアドレス変換です。content-write と時間依存記憶層はアドレスから値を得ます。アドレス変換のうちevacuate以外のものは集約的です。(言ってることは正しいのですが抽象的です)

非局所制御 from-write と appropriate は集約的です。すなわち、複数のアドレスを1個のアドレスに集約します。これらの非局所制御によって起動された手続き(さらにそのサブルーチンを含む)では、集約先のアドレスから集約元のアドレスを得るシステム演算(名称未定)が使用できます。(内容が古いです)

手続き定義は非局所制御です。非局所制御としての強さは evacuate, overwrite より弱く write より強いです。引数の評価は実行開始時に行います。これは他の非局所制御にはない特徴です。実行開始時にベクトル格アドレスから自然数アドレスへの変換表を作り、実行時に変換表を引いて当たれば手続きを実行します。(この提案は却下されました)

読み出しの退避 evacuate は gate, source, drain の 2 引数を取るように書かれていますが、2 引数の命令を 2 個書いたほうが合理的です。この場合、overwrite との違いは、アドレス変換の連鎖をしないことだけです。名前についての議論も受け付けます。(この提案は、シンプルかつ驚くべき方法で発展的に解消しました)

ローカル化オフセットは、本来は represent_context ("offset") を通して獲得するべきですが、実際には context_holder->offset を直接読んでいるところが多いです。非局所制御に着手する以前の版からそうでした。直さないと気分が悪いです。offset_of_context_holder という関数が導入されている版であればこの問題は解消済みです。

予約語が 1024 字に制限されています。さらに、インストラクション構造体が固定長で 1024 字取っているのでメモリが非常にむだです。(この問題は解消されました)

break process は escape に名前が変わるかもしれません。そもそも現在のパステルステッチにはプロセスという概念がありません。(この提案は実現しました)

read procedure 命令は廃止されますが、ほぼ同等の read storage システムコールが新設されます。これは静的環境の時間依存記憶層を、非局所制御の影響なしに読み出します。(この提案は実現しました)

どうも文字列が符号ありか符号なしかでおかしなことになっているようです。いずれは unsigned char に統一するべきですが、そうすると string.h を読み込むのが絶望的になります。あと printf ファミリーの動作(特に %c)は問題です。(この問題はおそらく解消されましたが、将来的には再び蒸し返されるかもしれません)

文字の正当性は getc 関数の直後、まだ int 型の状態で判断するようにしました。これにより char 型が signed か unsigned かを考えなくてもよいはずです。ただし、この問題は非常に難しいので、将来的には再検討が必要になるでしょう。0 文字の名前を許すかどうかも謎です。

文字の安全性の判定はターシャリー、ディクション、ポーリンで共有します。多くの定数を enum 型にします。(この提案はおおむね実現しました)

ターシャリーの文字列の記法について検討中です。現在、表示不可能な文字は改行とスペースしか使用できません。また、ディクションが受け付ける制御文字は LF だけです。各プログラム間で文字のクラス定義がばらばらであることも懸念されます。(この問題はおおむね解消しました)

不等号 ^neq は廃止します。基底言語 C の != 演算子への貫通ではないためです。(この提案は実現しました)

ターシャリーで水平タブを表す記号は ^& です。(この提案は実現しました)

システム演算がコールフレームを読むところ(たぶん seek_adverb)で、メモリを確保したまま解放していません。(この問題は解決しました)

浮動小数点数から有理数への変換は、近似、切り捨て、そして四捨五入から選択できます。省略時は切り捨てです。有理数から浮動小数点数への変換は、分子を分母で割ります。(この提案は実現しましたが、省略時は近似になりました。理由は忘れました)

ターシャリーの include 命令がバグっています。(この問題は悲観的な方法で解消されました)

ターシャリーの include 命令がバグっているようですが、このまま廃止されるかもしれません。そもそもターシャリーはパステルステッチの処理系のなかではさほど本質的でないサブシステムなので、あまり手間をかけられません。include 命令はどうしても必要になったら作りなおせばいいでしょう。あと message 命令もたぶん廃止です。実質 name のみ(local は name と同じ動作)が残ります。(この提案は採用されましたが、将来的には蒸し返されるかもしれません)

ターシャリーをワンパスにして、パーサコマンドとプログラムを同時に処理させようと思います。パーサコマンドはプログラムとしては受理できない構文を持ちます。具体的には第1トークンが名前、第2トークンが小括弧です。(この提案は実現しました)

ターシャリーの単語が領域開始語でないことを指定するにはアポストロフィをうしろに付けます。領域の開始を強制するには文頭にアポストロフィをつけます。(この提案は実現しました)

Windows で使うとき、tertia sample.txt | diction - > sample.asm とやったら次の pauline でエラーが出ました。不正な文字 13、すなわち CR が含まれています。これはテキストモードで \n を出力すると CRLF になるのが原因です。tertia sample.txt | diction - -o sample.asm であれば、バイナリモードで開くので正しく動きます。むしろ load.cpp が CR を読み飛ばすようにしましょう。(次の段落に続く)

Windows 版でのいろいろですが、どうやらテキストの中に CR + LF が入ってしまうのがまずいようです。なぜかパイプはよくてリダイレクトはだめみたいです。わけがわかりません。(何度か蒸し返されていますが、ゲイツに何を言ってもむだだろうから深く考えないことにします。ただし予期せぬエラーを発見するためには Windows での動作確認は有益です)

ターシャリーからパーサコマンドの部分を取り外して身軽になりました。name コマンドだけはプログラムのなかに混ぜて書くことができます。(2008年5月3日版に反映されています)

サンプルプログラムが地味なところでバグっています。(治りましたが引き続き注意が必要です)

プログラムを終了する exit は引数が false のとき正常終了、引数が整数(分子1の有理数)であればそれをエラーレベルとして使います。(この提案は実現しました。bash のシェル変数 $? で確認できます)

積集合 intersection をどう略すべきか、名前についての議論を引きずっています。歴史的には cap、現状では ins、有力な案として insect があります。意味は「昆虫」。(^ins に落ち着きましたが、名前についての議論は何度でも蒸し返される危険があります)

2008年5月3日版がリリースされました。細かいところに問題はありますが(number_gismo が初期化されていないとか)、全般にはかなりきれいになったのではないでしょうか。



  • 最終更新:2008-05-03 22:41:48