Open5

読者コミュニティ|100 行の Python プログラムで Forth を作る

Koji SaitoKoji Saito

本の感想や質問をお気軽にコメントしてください。

https://zenn.dev/kojisaito/books/20faf6ae52ab1c

elecamperelecamper

先日定年を迎えた元メーカ技術者です。今日アカウントを作ってBooksを見たらいきなりこの本が目に入り嬉しくなって投稿しました。なのでこれから読んでコードいじってみます。

思えば同じく技術者だった父から就職祝いにHP15Cを貰って初めてRPN記法に触れ、「人間が一寸機械に歩み寄ればこんなに操作と思考が簡単になるんだ」と感動を覚え、それ以来HP電卓一筋です。HP電卓が無くなると生きていけないのでストック含めて4台持っていますが、(流石に液晶は薄くなりましたが)1台目が未だ使えています。

その流れでFORTHに興味を持ったのですが、今度はムーアさんのソースを見て「徹底してムダをそぎ落としてコンパクトにまとめた実装と自己拡張性」に、Simple is best を地で行っている不世出の言語だと思い至りました。Koji SaitoさんがPython 100行で実現されたとのこと、改めてそのコンパクトさに驚嘆しております。

このままFORTHが消えてなくなるのはあまりにも寂しく、そのコンパクトさと移植の容易さを生かして$1マイコンのモニター(ローダー)として活用できないものか、と夢想しております。

Koji SaitoKoji Saito

本書に興味を持っていただきありがとうございます。
elecamper さんの記念すべき最初の Zenn の本になれたことを光栄に思います。

HP 15C を所有されているとのことで羨ましい限りです。私の方は金融関係の HP12C を所有しているのみです。そんな中、15C の復刻のニュースを聞き、さてどうしたものか…と思案中です。

Forth はコンパクトな設計であるにも関わらず、非常に豊かな表現力を有する言語でもあり、その魅力のほんの一部分でも本書でお伝えできたのなら幸いです。

本書は、Zenn で本が書ける ー ということで試しにざっと書いたものですので、お気になる点や間違っている部分などもあるかもしれません。もしそのようなところを見つけられましたら、ご指摘いただければ助かります。

may the Forth be with you.

elecamperelecamper

Koji Saitoさん、ごぶさたしてしまいました。

その後じっくりと読まさせていただいて、動作を確認しながら自分なりに改造して楽しんでおります。

FORTHオリジナルソースだとどこから手を付けて良いのかわからず、またCPUに依存しすぎていて中々理解できずにいました。

本稿は汎化されたPythonで書かれかつ100行でまとめられていたので、挫折することなくステップアップでき、やっとForthの本質が理解できたような気がします。

改めまして私に勉強する機会を与えたいただいたKoji Saitoさんに感謝いたします。


読み進めていていくつか気になる点がありましたので、自身のMarkdown習熟を兼ねてフィードバックします。何らかのお役に立てばうれしいです。

  • Chapter 03 -> 外部インタプリタのテストコード
    それ以前のプログラムリストで+ ワードが定義されていないので実行できない。

  • Chapter 03 -> 外部インタプリタ関連の全ソースコード

外部インタプリタのテスト用として、辞書に追加したものはワード定義のための : (コロン)と ; (セミコロン)です。
&emsp :(コロン)の処理の実態は関数 colon ですが、

  • Chapter 06 -> 条件分岐 if - then および if - else - then

すでに何度か説明しているように、Forth では制御構造ですらワードで実現しています。そのため、新しいパラダイムが現れるとそれを Forth でも実現しようとする動き <ins></ins>[1] 発生します。

  • Chapter 06 -> ワード ." のコード
    dot_double_quate()で、折角nを計算しているのに使っていない。
def dot_double_quote():
    start=Global.Pos+1; found=False; n=len(Global.Line)
    if start>=n: double_quote_error(); return False
    # for i in range(start,len(Global.Line)):
    for i in range(start,n):
        if Global.Line[i]=='"': found=True; break
  • caution Chapter 06 -> 条件分岐処理の確認
    if~else~thenのテストで、定義したinvを使っていないのでテストになっていない。

  • Chapter 07 おわりに

分かりやすい Forth のシステムについての解説書になっていれ <ins></ins>[1:1] 幸いです。これはある意味、Forth を知った高校生の頃の自分に対する、未来からの手引のようなものを私は書いているのかもしれません。

脚注
  1. 下線使えないんですね・・・。Markdown思うように操れません。 ↩︎ ↩︎

Koji SaitoKoji Saito

elecamper さん、コメントありがとうございます。
近頃は Zenn のチェックができておらず、返信が遅れてしまいました(すみません)。

現在、PDF 版を作ろうと思って作業してますので、そちらの方で反映できたら…と思っております(この PDF 版は技術書典に出す予定で、こちらも無料にしようと考えています)。

本書は書き下しに近い形で書いたものなので、読み返してみると気になるところが幾つかあります。Zenn の方にも反映するかもしれませんので、その時はまたご覧になって頂き、コメントをいただければ幸いです。

今後とも何卒どうぞ宜しくお願いいたします。