type t (* void *)

関数型言語や英語学習の事とか。

進捗大陸05で使ったsatisfyのファイルを公開しました

公開しました。
キレイにしようという話もありましたが、実際使うとどんな感じになるのか見てもらえると良いかなと思い、そのまま公開してます。

github.com

sinchoku-tairiku.satyh

stdjabookをB5向けに改良し印刷物向けに余白や機能を調整しました。 主に@amutake_sさん・@yutoppさんの貢献です。

まずは生成されたものを見てくれ。 印刷向きに余白調整されてる+本の真ん中が読みづらくならないように左右で位置を変えるといったことが実現されてます!!

github.com

どういうふうに書いたのか

Gitlabでprivate repoを作成し、各々でディレクトリを分けて書きました。

.
yutopp
no_maddo
youxke
pocketberserker
amutake
halcat0x15a

それぞれのディレクトリには main.satyhが存在しそれを大本のmain.satyが使うような構成になっていました。 開発イメージが湧くようにコメントで残しています。

github.com

それぞれのディレクトリを切ったのであとは自由という感じです。 大体の人は、 main.satyh の他に local.satyh を作成し、そこで補助的なコマンドの定義を書いていました。 みんな使いそうな部分は shinchoku-tairiku.satyh に整備しました。

Gitlabを使ったのはprivate repoでもGitlab RunnerによるCIが使えるからです。 個人的にはGitlabそんな嫌いというわけではないので全然大丈夫でした。使えるのはGithubだけじゃないよ。

お気持ち

見た目いじれた

Latexでは全く行える気がしないですが、SATySFiでは色々いじることが出来ました。 コレは本当にすごいと思いました。

次回はもっと凝ったことをしたいです。

関数再定義をたくさんしている

SATySFIはLexical Scopeな言語でかつ外側から依存を注入する機構がないので(ないですよね?)、 いろいろなものをコピペしてちょっとだけ変えるということをたくさん行っています。 余白の調整のためにitemizeもコピペして直してます。

プログラムのロジックを変更するために今まである関数を再定義するのはある程度しょうがない面があると思いますが、 余白の大きさなどはハードコードせずに変更可能な変数にする必要があると思いました。 こういうことを考えている人もいます。

github.com

または全ての関数はctxに入っていて、ある関数を置き換える関数をctxに代入してその関数を呼び出す、 というような機構が必要なのかもしれないな、と思いました。 存続のOOPで用いられているようなObjectiveな機能で関数をオーバーロードする、という方法でも良い気がしますが Subtypingは型推論との相性があまり良くなさそうなので難しいところです。

別のアイディアとしては全ての標準ライブラリはファンクタになっていて、パラメータが入ったモジュールを渡して各モジュールを作るという のも考えられます。しかしこれは結構使い勝手が変わりそうで難しそうですね。。。

標準ライブラリに提供されてても良さそうなものを実装している

\figureや\programはgfnさんの未踏レポートから持ってきたものですが、コレを使うと本文と図が被ることがあります。 +figureや+programを使うのが安全です(が、巨大余白が発生することがあります。最後は手動調整が必要です。)

github.com

\urlは@amutake_sさんの自作です。

問題点とも考えられますが逆にこういった基礎的な機能を自分たちで書いていけるくらい実装はしやすいです。

Syntax Errorがわかりづらい

LexerやParserのエラーは何が起きているのかわからないです。 特にカッコの対応が壊れているとき、;を書くのを忘れているときです。

私の理解では\cmdがあるとき、{}のカッコが存在するときは;を省略可能なのですが、それ以外は必要だという理解でした。

Syntax Errorではなく型エラーになったときは分かりやすいです。 括弧についてはすでに記事を書きました。

no-maddojp.hatenablog.com

Syntax Errorになったらまずセミコロンが抜けてないかチェック・そうでなければ括弧の対応みたいなところがあります。

96ページの文章生成に24秒かかった

CI環境では3分くらいかかってました。 私のThinkPadでは24秒でした。最後見た目をいじるとき、1pt変えて印象を見ていい感じの見た目にしてくときに 1回でコレくらいかかるのは結構タイヘンでした。

今出ているPRで高速化できるかも、という話があります。

今私の手元にあるLatexでB5 100ページくらいの原稿も11秒くらい生成に時間かかっているし、こういうものなのかもしれません。

まとめ

SATySFi組版はまだまだタイヘンなこともありますが楽しかったです。 実は入稿したときもちゃんと印刷が仕上がるか不安でしたが、印刷会社からの注意も特になく印刷できました。現時点でもSATySFi での本の執筆は可能です。すごい。 みなさんもどんどんSATySFiで原稿を書いてほしいです。