はじめに
この記事では 2021 年に行った Paraphrase 開発状況をまとめています。現在は Paraphrase ver.0.95 の開発している状況です。ここに記された事柄の多くは、おそらく ver.0.95 に反映されることとなるかと思います。
※ 本稿は言語実装アドベントカレンダー 2021 の 15 日目の記事です。
https://qiita.com/advent-calendar/2021/lang_dev
2021 年を振り返っての所感
この記事を書くため、今年発行したメルマガ - Paraphrase の開発現場より( https://www.mag2.com/m/0001690503 )を読み返してみました。年初より、Paraphrase の記述能力を示すため Lisp 処理系の実装を目標としていたんだなぁ、と改めて感じました。
当初は Make a Lisp (MaL https://github.com/kanaka/mal/blob/master/process/guide.md ) の手引に沿って Lisp 処理系を実装しようとしていました。しかし、なかなか作業が進まず、最終的には Python で書かれたコンパクトな Lisp 処理系である Lispy ( http://www.aoky.net/articles/peter_norvig/lispy.htm )を移植する形で(最低限の)Lisp 処理系の実装が実現できました。これは今年における大きな成果となりました。
また、as-counter ワードの導入も Paraphrase の歴史の中では大きな出来事であったようにも思います。これは多重ループにおけるループカウンタ情報をどのように扱うのか - といった、Paraphrase の開発における割と初期段階からの問題を解決する方法となりました。
気がつけば今年ももうあと 2 週間ほどを残すのみとなりました。現在開発中の ver. 0.95 を今年度内にリリースすべく、3 月までは頑張りたいと思っております。次々期リリース予定の ver. 0.96 では、念願のソースレベルデバッグ機能が提供できれば…と思っております。なかなか予定通りには進まない状況ですが、2022 年も応援して頂ければ幸いです。
■ 開発状況に関する主なもの
- Paraphrase ver. 0.94 のリリース
- Paraphrase 処理系を実装する C++ のソースコード上での変更
- ターゲットプラットフォームとして Raspberry Pi OS の追加
- 関連文書の冊子体への対応作業を開始しました
以下順次説明していきます:
Paraphrase ver. 0.94 のリリースを行いました( 2021 年 3 月)
現在公開されている最新の Paraphrase は ver. 0.94 系列です。
https://github.com/iigura/Paraphrase/releases/tag/v0.94.0
ver. 0.94 で搭載された主な機能としては、以下のようなものがありました。
- デバッガの追加
- 疑似標準入出力(pseudo-stdio)
- AOP 機能の実装
※ デバッガ機能も AOP を用いて実装されています。 - ワードへの属性情報の追加
- 連想配列型の値の追加
- 無効な値を正式な値として追加
- 前方参照機能の追加
※ この機能を用いて相互参照が実現できるようになりました。 - ヒアドキュメント機能の追加
Paraphrase 処理系を実装する C++ のソースコード上での変更
ソースコード上での変更としては、単なる enum ではなく、enum class への移行を行いました。これは VisualStudio でビルドを行うと大量に警告が発生してしまっていたためです。
ターゲットプラットフォームとして Raspberry Pi OS を追加
Python における microPython のように、将来、組み込み用途むけに microParaphrase をリリースするための準備を始めました。このような考えに至った背景については、Paraphrase の開発で参考にしている Forth という言語の生い立ちまでさかのぼります。Forth は天体望遠鏡の制御用途として開発された - とも言われています。ラズパイの GPIO 経由で各種機器の制御を、Paraphrase を使って対話的に実現できれば面白いだろうな - という想いは Paraphrase 開発当初より存在しています。
関連文書の冊子体への対応作業を開始しました
現在は印刷時も考慮した HTML 版のドキュメントを同梱していますが、書籍としての体裁にも対応できるよう Re:VIEW という文書生成システムへと移行を行っています。まずはワードリファレンスより対応すべく現在は作業を行っています。
■ 言語仕様の変更
局所変数への代入を参照に変更
集合型を含めて、これまで局所変数への値の設定は full clone を行っていました。実行速度を考慮し、これを廃止します。必要であれば、明示的に full-clone を呼び出すようにして下さい。
無名ワードをメモリ管理対象としました
これまで無名ワードは一度作成されるとメモリ上から削除されることはありませんでした。しかし、属性を用いたオブジェクト指向的な使用方法なども考えられるため、今回、これら無名ワードに関してもメモリ管理機構を導入することとしました。これにより、大量の無名ワードを生成・消滅させても、メモリが浪費される状況は発生しなくなりました。また、これに関連して、無名ワードをラムダ型と名付けました。
デバッガをマルチスレッドに対応させました
これまでの実装では、ワードの属性を用いてデバッガ用ワードからデバッガ用外部インタプリタへ情報を伝達していました。この方式では、マルチスレッド時に同じワードをデバッグすることができません。そのため、コンテキストに専用の情報連絡用変数を設け、この問題を解決しました。
@ から始まるシンボルの許可
ワード定義時におけるワード名をシンボルに変更する関係上、@ から始まる文字列もシンボルとして認めるように変更しました。
Paraphrase プログラムの拡張子を .p8e に変更しました
以前より .pp という拡張子は、英語圏では少々微妙な印象になると思っていました。今回、.pp から .p8e に変更しました。中央にある 8 の意味は、Paraphrase という語の先頭の P と最後の e に囲まれた araphras という 8 文字を表しています(p8e = P[araphras]e)。
言語処理系 para に関する新機能の追加および仕様変更
show-size オプションの追加
言語処理系プログラム para の起動時オプションとして、--show-size を追加しました。このオプションは C 言語における、Paraphrase の各種の値がそれぞれ何バイト分メモリを消費するのかを表示します。本オプションの登場当時は show-build-info という名前でしたが、表示される情報に合わせたオプション名に変更しました。
para の終了ステータスに関する変更
これまで para では、ヘルプメッセージやバージョン情報を表示させた場合(つまりオプション h や v を与えて起動させた場合)、終了ステータスとしてエラーを表す -1 (255)を返していました。ver.0.94.1 ではこれを変更し、ヘルプメッセージやバージョン情報表示でもエラーなしを表す 0 を返すように変更しました。
■ 追加されたワード:
:( , );
word-name :( word parameters ... ); という形で使用します。例えば 2 の平方根を求める場合、2 sqrt と書きますが、これらのワードを用いると現在主流のプログラミング言語と同様
sqrt :( 2 ); と書けます。
as-counter
for+ や for- ループで使用することを想定しているワードです。本ワードの直前にコンパイルされているシンボルを局所変数名と解釈し、その局所変数に現在のカウンタ値(=ワード i で得られる値)を代入します。
カウンタ値として使用する局所変数名が、本ワード実行時に宣言されていない場合は、局所変数の宣言も併せて行います。
(< および >)
動的にリストを生成し、スタックに積みます。実行時に動的にリストを生成するため、リストの要素として局所変数の値を利用できます。
map-local
TOS にあるリストもしくは配列の各要素の値で初期化を行いつつ、局所変数を宣言するワードです。
map-let
TOS にあるリストもしくは配列の各要素それぞれを局所変数に代入します。map-local の変数宣言無し版です(事前に local-decl 等している変数に対して使用します)。
++, --
直前にコンパイルされたシンボル名により示される局所変数の値を 1 だけ増やしたり(ワード ++)、減らしたりします(ワード --)。
<- および += , -= , *= , /= , %=
ワード <- で対象となる局所変数を指定し、+= 等のワードでは、実行時の TOS の値をその局所変数に加えたりするコードを生成します。
self
このワードを呼び出したワードのポインタをスタックに積みます。トップレベルで直接呼び出した場合は無効な値をスタックに積みます。
when
loop - when ... repeat というように使用します。loop - repeat ブロックにループの終了判定処理部を追加します。本ワードは ver.0.94.0 で既に実装を終えていましたが、ワードリファレンスへの記述がされていませんでした。
cond
Forth 系では他の言語にあるような else-if を記述できないので、Lisp に存在する cond 関数のようなものを導入しました。switch - dispatch と同様に cond - dispatch ブロックを形成します。
switch と異なるのは case にて dup が実行されないところです。TOS の値を case 〜 -> で利用することは想定しておらず、単に条件判断が列挙されている処理を想定して導入されました。
reverse-foreach
ワード foreach はセカンドに格納されているリストの先頭の要素から順次 TOS にあるワードを適用していましたが、本ワード reverse-foreach はリストの末尾の要素から順次 TOS にあるワードを適用します。
otherwise-drop , otherwise-2drop
これらのワードは if と対で用いられます。otherwise-drop は else drop then と同値であり、otherwise-2drop は else 2drop then と同値です。
set-delete-by-forget , clear-delete-by-forget , check-delete-by-forget
ワード forget の動作モードを設定および確認します。set-delete-by-forget を実行すると、forget にてワード本体が削除されるようになります。一方、clear-delete-by-forget では forget は当該ワードへのアクセス方法が失われるだけであり、ワードの中身自体は消去されません(なので、既に使用しているワードも支障なく実行されます)。check-delete-by-forget は、これら forget の動作モードを確認します。set-delete-by-forget と同様の状態の場合は true を返し、clear-delete-by-forget と同様の場合は false を返します。
this-word-is-removed
ワードが削除されていることを示すワードです。set-delete-by-forget が実行されている場合に、短縮名および正規名それぞれを forget すると対象のワードの処理部分は本ワードの処理部分に差し替えられます。このワードを実行すると、当該ワードの名前と共に、そのワードが削除されている旨を表示し、実行を中断します。
panic
本ワードを実行するとインタプリタのトップレベルに戻ります。
>array
TOS にある文字列またはリストを取り出し、その値を分割し、分割された要素からなる配列を生成し、スタックに積みます。
文字列の場合は、空白文字列を区切りとして分割し、分割された文字列を要素として持つ配列を生成します。
リストの場合はリストの要素からなる配列を生成します。リストの先頭の要素が配列の 0 番目の要素となり、以下順次配列に格納されてゆきます。
連想配列の場合はキーと値から成る組(タプル)が配列の要素となります。連想配列の場合は、どの順序で配列に格納されていくのかは分かりません。
>assoc
キーと値とで構成されるタプルを要素に持つリストから、連想配列を生成します。
>list
TOS にある値をリストにします。整数など集合型でない場合は en-list と同じですが、配列など集合型の場合はそれらの要素からなるリストを生成します。連想配列の場合は、キーと値からなるタプルを要素として、リストを構成します(連想配列はタプルリストに変換されます)。
>bool
TOS にある値を真偽型に変換します。
>int? , >long? , >float? , >double?
TOS にある値がそれぞれの型に変換できるか否かを調べ、変換できる場合は true を、さもなければ false をスタックに積みます。
is?
セカンドと TOS より値を取り出し、それらが同じオブジェクトであるか否かを調べ、同じオブジェクトである場合には true を、さもなければ false をスタックに積みます。
int? , long? , big-int? , float? , double? , big-float? , bool? , array? , list? , assoc? , @array? , @assoc? , string?
TOS より値を取り出し、または参照し、その値がそれぞれの型であるか否かを調べ、当該の型である場合は true を、さもなければ false をスタックに積みます。
@type> , >type
@type> は TOS の値より型情報を取り出し、>type は TOS の値を型情報としてセカンドの値に設定します。値のビットパターンを変更せず、別の型として解釈しなおす場合などに利用できるワードです。
bool-type , int-type, long-type , float-type , double-type
それぞれの値の型を表す long 値をスタックに積みます。ワード >type とあわせてt買うと、C 言語で言うところのキャストが実現できます。
last-defined-word
最後に定義したワードへのポインタをスタックにプッシュします。ワードが定義されていない場合は invalid をプッシュします。処理系が終了すると直前に定義したワードの情報は失われます(なので、処理系を起動した直後に本ワードを実行すると、invalid がプッシュされます)。
docol-target-word
このワードは、set-worded-docol-callee で設定されたワード内で使用されることが想定されています。docol で呼び出されるワードへのポインタをスタックにプッシュします。
append
リストを消費する版の @append を append として追加しました。
pop-front
TOS にあるリストの先頭要素を取り出します。@pop-front の TOS を消費する版です。
push-back
TOS とセカンドより値を取り出し、セカンドにあるリストの末尾に TOS に格納されていた値を追加するワード push-back を追加しました。
zip , min-zip , max-zip , max-zip-with
TOS とセカンドに格納されている 2 つのリストそれぞれの要素から成る 2 つ組のリストを生成し、スタックに積みます。
例: ( a b ) ( 11 22 ) zip は ( ( a 11 ) ( b 22 ) ) というリストを生成します。zip では 2 つのリストのサイズは等しくなければなりません(リストのサイズが違う場合はエラーとなります)。一方、min-zip はリストの要素の少ない方に合わせられます。例えば、( a b c ) ( 11 22 ) min-zip は ( ( a 11 ) ( b 22 ) ) というリストを生成し、エラーとはなりません。
max-zip はリストの要素数の多い方に合わせられます。不足する要素に対応する値は invalid です。max-zip-with は、この不足する部分の値を TOS より取り出した値で設定します。
word-type
ワード型を示す整数値をスタックに積みます。無名ワードへのポインタ値を本ワードと >type を用いてポインタ値に変換し、dump 等を活用できるようになります。
tron?
トレースモードが有効になっているか否かを調べ、有効であるならば true を、さもなければ false をスタックに積みます(つまり、tron を実行していれば true を積み、troff を実行していれば false を積みます)。
replace-str
文字列中の部分文字列を別の文字列に置き換えるワードです。置換対象の部分文字列には正規表現を使用します。
split-str-by
TOS の 1 文字から成る文字列を区切り記号として、セカンドにある文字列を分割し、その結果を配列に格納してスタックに積みます。区切り文字が連続する場合は、長さ 0 の文字列が生成されます。
trim
TOS より文字列を取り出し、その文字列の文頭および文末の空白文字列を削除した文字列をスタックに積みます。
sputf
TOS にある書式指定文字列を用いて、セカンドにある値を文字列として書式出力します。putf の文字列出力版です。
round
TOS より数値を取り出して、少数第一位を四捨五入した値をスタックに積みます。
set-random-seed
乱数の種(seed)を設定するワードです。rand や random および rand-to の乱数列に影響を与えます。
+@, -@, *@, /@, %@
演算子を OP とすると、TOS = Second OP TOS という演算を行います。例えば 1 2 @+ とすると、計算後のスタックはセカンドが 1、TOS が 3 (=1+2) という状態となります(+@: 1 2 --- 1 3)。
@set-attr
set-attr の参照型ワードを追加しました。本ワードでは、セカンドと TOS に格納されている値をキーとそのキーに関連付けられる値として、スタックから取り出しますが、スタックの上から 3 番目に格納されている対象のワードについては参照するのみで取り出しは行いません。
@sqrt
TOS を参照し、その値の平方根をスタックに積みます。dup sqrt と同値です。
■ 仕様変更となったワード:
: , ::
ワード定義では TOS にある文字列を使用していましたが、ver 0.95 からは文字列ではなくシンボルも利用可能に変更しましたす。これまで、
"hello" : "HELLO WORLD" .cr ;
と定義していたワードは、
`hello : "HELLO WORLD" .cr ;
と記述できるようになりました。ソースコードの表現状も 1 文字少なくなりますので、今後はできるだけシンボルを用いてワード定義を行っていただければ…と思っています。
とは言え、記号から始まるシンボルはバッククォートでは作れませんので、そのようなワード名を利用したい場合は引き続き文字列を用いて定義するようにして下さい。
break
Paraphrase では C の switch - case 処理とは異なり、case 〜 -> 部にて条件判断処理が記述できます。そのため、複数の case からなる処理をひとつにまとめる場面も少なくなると判断し、今回、ワード break を明示的に使用せずとも、正しく switch - dispatch ブロックの処理が記述できるように仕様の変更を行いました。
例えば、次の case の直前に break が無くとも、すぐ後に記述される case や default および dispatch といったワードで、break を記述した時と同様の処理は実現できます。このような場面で break を配置する必要がなくなったため、例えば、return break などといった記述が不要になり、より分かりやすい記述ができるものと期待しています。
なお、ワード break は明示的に任意のタイミングで switch - dispatch ブロックを抜けるためのワードとして利用されるものになりました(なので、ワード break 廃止とはせず、引き続き存在します)。
case , -> , ->> , dispatch
cond にも対応するようにしました。
default
case true と等価になりました。
local を local-decl に変更
局所変数の宣言のみを行う場合は、次に示す初期値と共に宣言する場合と比較し、使用頻度が低いようです。そのため、少し文字数を増やして local-decl としました。
local-with を local に変更
初期値と共に宣言される local-with は使用頻度が高いため、より文字数の少ない local という名前のワードに変更しました。
docol の属性変更(即時実行ワードに変更)
これまで、簡易 AOP におけるワードへのアドバイスの織り込みでは、各ワードの属性を使用していました。しかし、この方法ではマルチスレッド時に破綻してしまいます。今回、属性を利用しない方法へと実装方法を変更しました。それに関連して本ワードの実行属性が変更となりました。
foreach
TOS にある foreach 用のワード実行時に、ワード i にて、処理対象の要素がリストの先頭から何番目の要素であるかを取得できるようになりました。
alias をシンボルにも対応させました
ワード alias ではセカンドも TOS も文字列が格納されている必要がありましたが、今回の修正にていずれの値においてもシンボルを許容するようにしました。
dump
連想配列に対応するようにしました。TOS に連想配列が格納されている場合、その連想配列を取り出し、格納されている全てのキーと値のペアを表示します。
>int , >double
文字列にも対応するようにしました。
>long , >float
文字列およびアドレス値にも対応するようにしました。
>big-int , >big-float
ワード名として英大文字を使うことをやめ、全て英小文字にする変更のため、>INT から >big-int に、同様に >FLOAT から >big-float に名称変更を行いました。また、名称変更と併せて "0x" より始まる 16 進数文字列にも対応しました。
>string
他の変換用ワードにならい、>str から >string に名称変更しました。
>hex
ワード >str が >string と名称変更したことに伴い、他に str という文字列を含むワードが無くなったたことをふまえて to-hex-str から >hex へと名称変更しました。
>symbol
真偽型およびシンボル型からの変換芋対応しました。
>word
文字列だけではなく、シンボルおよびワードにも対応しました。ワードの場合は取り出したワードを再度スタックに積みます。
def , update , defined? , forget
ワード名として文字列のみに対応していましたが、シンボルにも対応するよう変更しました。
set-breakpoint , _b , dump
シンボルにも対応しました。
load
言語処理系 para の引数としてスクリプトファイルを指定した場合、ファイル内スクリプトより load に失敗したら、当該スクリプトファイルが存在するディレクトリ内で、同名のスクリプトファイルの読み込みを試みるように機能拡張しました。
なお、load するファイルが絶対パスで記述されている場合は、この機能は実行されません。
また、エラー・メッセージ表示の改善しました。ダブルクォーテーションが閉じていない時などにもエラー発生行を表示するようにしました。
type , @type を type-name , @type-name に変更しました
type だと、型情報の取得や設定に使う @type> や >type の機能と混同しがちなので、type-name および @type-name へと名称変更しました。
empty-str? , not-empty-str? , valid-index? を @empty-str? , @not-empty-str? , @valid-index? に名称変更
これらのワードは TOS を消費しないにも関わらず、文頭に @ が付いていないため、それぞれのワード名の先頭に @ を付すこととしました。
pop-front を @pop-front に名称変更
pop-front は TOS を消費せず、TOS を参照するワードですので、命名規則を鑑み、@pop-front に名前を変更しました。
add を @push-back に名称変更しました
add というワード名は汎用性が高いため、標準ワードの名前としてはふさわしく無いと判断しました。また、要素が追加されるリストもスタックから取り除かれないため、参照型ワードとして @push-back という名前に変更しました。
@append
これまで append として提供してきたワードを @append と名称変更しました。
get
セカンドに格納されている対象の集合型(配列・リスト・連想配列)を消費するように仕様変更しました。従来のセカンドを消費しない版は @get として名前を変更して残してあります。
de-list を expand に
名称変更を行うとともに配列にも対応するようにしました。
. (ドット)
リストを出力するとき、これまではシンボルも文字列も同じ出力形式でしたが、文字列にはダブルクォーテーションを付して出力するように変更しました。シンボルはこれまで通り、引用符は付かず、そのまま出力されます。
@get
従来の配列やリスト等を消費しない get を @get と名称変更しました。
== および != の挙動の統一化
ワード == は、これまで数値型に対しては型が異なっていても、数値が同じであれば true を返していました(1.0 と 1 については true を返すなど)。しかし、リストなどのコンテナ型の内部の値については、数値が同じであっても、それらは等しいとはされていませんでした。今回、== および != は、コンテナ型の各要素についても、数値はその値としての比較を行うようにしました。よって、( 1 2 ) と ( 1.0 2.0 ) についてはワード == は true を積むようになりました。
reduce
ワード foreach と同値であるため、廃止となりました。
1+ , 1- , 2/ の廃止
標準ワードの見直しにより、これらのワードは最適化にて使用されるべきものと判断したため、廃止することになりました。
■ デバッグを行ったワード
alias
alias により別名を与えられたワードにて局所変数が使用できないというバグが見つかりましたので、それを修正しました。
printf
local 等の局所変数宣言用ワードの仕様変更により、上手く動かなくなっていましたので、修正しました。
>array
文字列終端記号を正しく取り扱えないバグがあり、セグメンテーションフォールトが発生する場合がありましたので、それを修正しました。
dup
シンボルを複製する場合、複製された値が文字列になってしまうバグがありました。それを修正しました。
for-
カウンタ値が正しく設定されなかったバグがありましたので修正しました。
>int のバグ修正をしました
big-float 型に対応していないことが判明しましたので、その修正を行いました。
car , @car , cdr , @cdr , pop-front
空のリストに対して、これらのワードを使用すると para が異常終了していました。仕様でも空のリストに対する挙動は定義されていませんでしたが、今回、空のリストに対して、これらのワードを使用するとエラーが発生することを明記し、正しくエラーメッセージを出すように修正しました。
>long
big-float に対応していなかった点を修正しました。
docol
必要以上に環境スタックをポップしていたので、それを修正しました。
expand (旧名 de-list)
dup したリストに対して本ワードを実行すると、複製元のリストも空になってしまうというバグがありましたので修正しました。
■ その他
用語 EoC の名称変更
従来 EoC は End of Channel の略としてきましたが、チャネルの終了というよりは計算終了など、スレッド間の情報伝達を終了する意味合いが強いと感じてきましたので、End of Communication の略とするよう改めました。
デバッガでの呼出履歴表示
デバッガで呼出履歴を表示するようにしました。デバッガ中で troff を実行すると、この表示はなくなります(tron の実行により、再び有効化されます)。デバッガでの tron / troff の実行は、デバッガ終了後には影響を与えません(デバッガ実行前のトレース表示モードは保持されます)。
サンプルプログラムのテスト機能の追加
以下のサンプルプログラムでは test という引数を与えるとテストが実行されるようになりました:
factor-tr.pp, FizzBuzz.pp, Mersenne.pp, PE25.pp, zdk.pp
テストが無事終了すると GOOD という文字列を表示します。
サンプルプログラムに LisP8E を追加
簡単な Lisp 処理系である lispy ( http://norvig.com/lispy.html 青木靖 さん訳の日本語版はこちら http://www.aoky.net/articles/peter_norvig/lispy.htm ) を Paraphrase に移植しました。Python による Lisp 処理系である lispy に倣い、これを LisP8E と名付け、サンプルプログラムとして同梱するようにしました。
fastInvSqrt.pp
ビットパターンを利用した 1/√x を計算するサンプルプログラム fastInvSqrt.pp を作成しました。遅くとも ver. 0.95 には同梱する予定です。
サンプルプログラムのファイル名変更
Project Euler No.21 を並列処理で解く PE21mt-short.pp を PE21mt.pp とファイル名を変更しました。
リストの要素表示時に数値の接尾辞を付けるようにしました
( 1 2 ) と ( 1LL 2 ) は厳密には異なる要素からなる異なるリストです。しかし、これまではワード . や show で表示させても、どちらも ( 1 2 ) と表示され、異なっているのか、それとも異なっていないのかが分かりませんでした。そのため、このような変更を行い、より正確な値の表示を行うように変更しました。
なお、このような表示は対話的な操作や、試作時に多く利用されると考え、ワード write では、どちらも ( 1 2 ) と表示されます(write での表示に変化はありません)。
para (Paraphrase インタプリタ)
対話モードでの起動時にバージョン情報を表示するようにしました。また、-h (または --help)で表示されるヘルプ情報にオプション -E (--eval-and-exit)が表示されていなかったため、表示するように修正いたしました。
ドキュメント para.html の内容修正
ver.0.94 のリリースに際し、記載内容の追加と各オプションの説明の順序を変更しました。
ワードリファレンス中の表記変更
ワードリファレンスを Re:VIEW 化する作業に関連して、以下のように表記を変更しました:
EoC : 花文字 E → Q
EoF : 筆記体 f → Z
ファイル : 花文字 F → O
リスト : 筆記体 l → T
シンボル : σ → Y
連想配列 : Z → R
制御ブロック情報 : κ → H
無効な値 : η → ζ
なお、現在定義中のワード ν は ω と重複定義していましたので、廃止しました。
ワードリファレンスの構成不備の修正
文章構造と各章の番号が合っていなかったため、修正しました。
dictType.cpp の追加
dictType.cpp を新設し、型変換に関するワードを dictMath.cpp から dictType.cpp へと移動を開始しました。これに関連してビルドシステムにも dictType.cpp を追加しています。
最適化用データベースの更新
サンプルプログラムを参考に、最適化用データベースの更新を行っています。
このようにまとめると、2021 年もそれなりに仕事してるんだなぁ、と思いました。 冒頭でも述べましたように、来年も頑張っていければ…と思っています。
今年もあと 2 週間あまりとなりました。それでは皆さん、良いお年を!