Paraphrase の開発状況 2023

　年末恒例となりました今年の進捗です。今年はドキュメントシステムである Paradocs の開発に着手したことが大きかったように感じています。これまではコツコツと手作業で HTML を編集しつつワードリファレンスを作成していたのですが、文章の構成も見直しつつ、より分かりやすい文書を効率的に提供できるのではないかと思っています。Paradocs については、後ほど少し説明します。

# 進捗その１： ver.0.96 をリリースしました
　昨年度末には無事 ver.0.96 をリリースでき、現在は ver.0.97 の開発に着手している状況です。今年度も年度末には ver.0.97 をリリースできるのではないか…と思っています。

　ver.0.96 では Windows 板のビルドにて少し支障がでていました。ver.0.97 でも同様な状況となるのか、その辺りは年明け頃に分かってくるのかな、という感じです。

　ver.0.97 に着手したときには FFI の実装についても意欲を示しておりましたが、ドキュメントシステムである Paradocs の開発の方に注力してしまい、こちらはあまり実装が進んでいない状況です。

# 2023 年に追加したワード

　Paradocs の開発を通じて、いくつかのワードが追加されました。新たにプログラミング言語を作る場合、実際にアプリケーションを書いてみることが重要だと、改めて確認できた気がしています。

## caller
　ユーザー定義ワードの中で使用します。caller を呼び出しているワードを呼び出しているワード（のポインタ）をスタックに積みます。ワード caller からみると、caller を呼び出し元の元のワードのポインタをスタックに積みます。

## word-short-name , <span>@</span>word-short-name
　TOS に積まれたワードの短縮名を文字列としてスタックに積みます。 <span>@</span>word-short-name は word-short-name の参照形です。

## fcopy
　TOS およびセカンドから文字列を取り出し、セカンドで示される文字列により指定されるファイルを、TOS で示される文字列をファイル名に持つファイルにコピーします。コピー先のファイルが既に存在する場合は上書きされます。

## fexist?
　TOS より文字列を取り出し、その文字列で指定されるファイルの存在を確認します。ファイルが存在する場合は true を、さもなければ false をスタックに積みます。本ワードは、当初 fexist という名前でしたが、述語的であるためワード名の最後に疑問符を付けるように変更しました。

## global
　大域変数を初期化と共に宣言するワードです。global というワードは、以前存在していたワードであり、同様の機能を担うワードは var という名前を与えられていました。局所変数宣言に用いられるワード local との同型を重視し、var を global-decl とし、宣言と同時に初期化を行うワードとして新たに global というワードを新しく追加しています。

## fgets
　TOS にあるファイル情報を消費するワードです（旧 fgetsは TOS を消費しないため、<span>@</span>fgets へと名称変更しました）。

## fwrite
　TOS にあるファイルに対し、セカンドの値を書き込みます。

## mkdir
　TOS にある文字列をパスとし、そのパスで指定されたディレクトリを作成するワードです。


# 2023 年に行ったワードの名称変更など
## var を global-decl に変更しました
　ワード var は、元々 global というワード名でした（記録では少なくとも 2020 年 3 月には既に var という名前になっていたことが分かっていますが、いつ変更したのか、既に不明になっています）。局所変数と同様に、宣言のみ、宣言と同時に初期化を行う - という 2 種類のワードを用意するにあたり、局所変数宣言との整合性を考え var を global-decl に変更しました。

## args
　args が示すリストの要素を増減させると、スクリプトファイルの実行後に評価される引数が増減するように変更しました。

## fgets を <span>@</span>fgets に変更しました
　動作の実体としては参照型であるため、<span>@</span>fgets に名称変更しました。


# 2023 年に行ったデバッグや言語仕様変更情報など
## エラー情報の表示に関する改善
　エラー情報の表示について少し改良を行いました。言語処理系 para でも、スクリプトファイルを引数として渡すと、そのスクリプトを実行します。これまでは、エラーが発生してもどこでエラーが発生したのか分かりませんでしたが、エラー発生時に、エラーとなったスクリプトファイルの当該箇所（何行目であるか）を表示するように改善しました。

## 言語処理系 para の引数評価の仕様変更
　ワード args が指すリストと、スクリプトファイル実行後に評価するべき引数とを同一にしました。これにより、args が指すリストの内容を変化させることにより、スクリプトファイル実行後の言語処理系のコマンドライン引数評価の挙動を変化させられるようになりました。


# その他：ドキュメントシステム Pradocs に関するもの
　シングルソース・マルチユースなドキュメントシステムは世の中に多々ありますが、何故か索引を自動的に作ってくれるものが存在しません。もちろん TeX は索引を作ってくれますが、HTML 出力等をしてくれませんので、PDF 版と HTML 版のワードリファレンスを作りたい場合などには困ってしまいます。

　そこで、索引の出力にも対応したドキュメントシステム Paradocs の開発に着手しました。名前の由来ですが、ご推測のとおり Paraphrase で作る document system ということで、Paradocs となっております。

　現時点での Paradocs の機能としては以下のようなものが備わっています：

* 目次の自動生成
　HTML 版においても目次を自動生成します。特に HTML 版においては親のセクションの横に展開・畳み込み用の表示を設け、それをクリックするとトグルにてサブセクションまで展開表示・畳み込みするようになっています。

* 索引に載せる用語の指定
　用語とインデックスの識別子が同一の場合は、ひとつの引数で指定できるようになっています。

* アンダーライン指定
* ソースコード表示に関するもの
* 定義に関するもの
* 主に定義に使用する表の指定
* 改行指定タグ

# まとめに代えて
　この文書は毎月 1 回発行している「Paraphrase の開発現場より」というメルマガ原稿を参考に書いています。編集後記にはその時の思いや日々の雑感などを書いているのでうｓが、今回改めて 1 年を振り返ってみると暑い夏だったんだなぁとしみじみと思いました。

　Paradocs の開発を通じ、Paraphrase もより実用的な言語になってきていると感じています。来年もワードリファレンスの整備を進めつつ、ワードの分類（コアワード、派生ワード）に着手できれば良いなぁ…と漠然と考えています。

　アドベントカレンダーの記事として、年末に Qiita へ投稿するのも恒例になりつつあるなぁ、と感じつつ、アットマーク記号のエスケープの仕方はどうやるんだっけ？と、こちらも恒例行事になっているなぁと苦笑しております（Paraphrase は参照形としてワードの前にアットマークを置くという命名規則を採用しておりますので…）。ちなみに、span タグで囲えばアットマークの自動リンク生成は回避できます。

　と、それはさておき、今年も残すところあと僅かとなりました。それでは皆さん、よいお年を！

Twitter： https://twitter.com/paraphrase_lang
GitHub ： https://github.com/iigura/Paraphrase