2021年11月16日火曜日

Quackery にどうして惹かれたか、どうなるか(更新中)

 プログラム言語のサイト、ロゼッタコードをひさしぶりに眺めていると、

に行き当り、コードをながめるとForthの雰囲気があってなかなか楽しめそう、というか、ちょっと変だけど???な気分になるのが面白い。GitHubからもらってきて、Debian等Linuxで動かしはじめてみている途中。

製作者はWindowsマシンがないのでというのも気に入りました。

アーティストとして Julia Cameron の 言葉を引用しているのもわるくない。

あと、Shell を抜けだすコマンドが leave で、Sayonara のメッセージで終るところくらいかな。最初の3分間で感じることは。


それはともかく、動かしてみる。環境は Linuxで、Ubuntu と Debian でやってみたがどちらも同じ動作だった。いままでのところは。Mac は今現用のマシンがないのでわからない。

$ python quackery.py


Quackery は python3 で動くプログラムになっている。

一日目


 /O> $ "Peking Man"
... 

Stack: [ 80 101 107 105 110 103 32 77 97 110 ] 

日本語は文字列としてつかえないことがわかった。

北京原人がおよそ50年前くらい前に地球上にいた人類の祖先の一種だというお話しをメモするつもりで、Quackeryを使ってみる。えっ、それって変なことないといわれても、まあ、テストですから。

$ 記号のあとに空白をいれて、二重引用符で北京原人と英語で打ってみた

スタックには、ブラケットで囲まれた整数の列がはいった。どうやらアスキーコードの列で文字列はスタックに格納されるようだということがわかった。

ちなみに練習の参考にしているのは、おもに Quackery Quick Reference で、あとは想像するだけ。なのでエラーは一杯だしながらやってるが、ここにはそのエラーはだしてない。だすとやたらに長くなるのと何やってんだ??ということになるため。


/O> $ 'Peking Man'

... 

Stack: [ 80 101 107 105 110 103 32 77 97 110 ] 

二重引用符のかわりに一重引用符でも同じものがスタックにはいった。


/O> $ *Peking Man*

... 

Stack: [ 80 101 107 105 110 103 32 77 97 110 ] 

さらに文字列前後を星印にしても同様だった。

なるほど

このスタックにあるブラケットに囲まれたアスキーコードの列を、文字列で出力するには、

/O> echo$
命令を実行する。

さて、このメモをファイルに書き出すにはどうしたらいいかとクイックリファレンスを探すと、putfileというのがある。

/O> $ "pman.txt" putfile

... 

Stack: 1 

スタックが1となった意味はおいといて、というかたぶんうまく書けたしるしの 1 だろうから、フォルダを見ると pman.txt があり、

$ nl pman.txt 

     1 Peking Man

ちゃんと書き込めていることを確認できた。

ファイルを作ることができたから、それに追加して書き加えることもできるはず。なので、北京原人の遺跡などのメモを書いてみよう。ここは世界遺産に登録されていたはず。

https://en.wikipedia.org/wiki/File:Zhoukoudian_Entrance.JPG


周口店とはどのあたりなのかよくわからないので、地図も探してみよう。とは言っても北京あたりはよく知らないので少し準備がいるということで、一休。


二日目

さて、Quarckey でキーボードから入力した文字列をファイルに書き出すことができた。これが一日目の作業で、最初の日を終えた。

作ったファイルは「北京原人についてのメモ」でファイルに書き出したのは、表題 Peking Man だけだが。

---
ここで、ちょっとだけ時間をとり、
人類進化の歴史を Smithsonian 博物館の資料をもとにメモしておく。

Becoming bipedal        6 million years ago        Sahelanthropus

Mostly bipedal             4 millions years ago

Dawn of technology     2.6 millions years ago    The earlist tools were simple stone flakes and cores.

Control of FIre              800,000 years ago          cooking led to the early human diet, socialize, share                                                                                  food and information

Rapid increase in brain size   800,000 - 200,000  during a time of dramatic climate change. 

The Turning point        12,000 years ago            control the growth and breeding of plants and animals.
---


ファイルの操作

putfile    文字列をファイルにプット

     $  "pman.txt"  putfile

takefile   ファイルから文字列を取り出し、ファイルは削除される

        $  "pman.txt"  takefile

sharefile  ファイルから文字列をコピー

    $ "pman.txt" sharefile


releasefile  ファイル名からファイルの削除を試みる

replacefile

loadfile


使い方

(1) $  "A"  putfile 

(2) $  "A"  sharefile

(3) $  "A"  takefile

ここで "A"は、ファイル名。

スタックされている文字列をファイルとやりとりする。



 Stack        --- put --->      Create a named File as  string "A"

 Stack      <--- share---    Copy a string "b" from a file named "A"

 Stack <---take--- Take a string "b" from a file "A" and "A" is deleted

 

練習1.

北京原人についての二行以上のファイルを作る。pman.txt に二行目からあとの行を追加するやり方を考える。

---
Peking Man
Homo erectus pekinensis
Zhoukoudian Cave
The first fossil, a tooth was discovered in 1921.
Direct human ancestor
Humans evolved in Asia.
  ...
---

手順をふつうに考えると、
北京原人を一行目に書いて、2行目、3行目とファイルのうしろに書き足していくやり方になります。それを、文字列 Peking Man キー入力、pman.txtに書き出す。2行目 Home erectus pekinensis の文字列を pman.txt に書き出す、なんてやると、どうなるでしょうか。

$  "Peking Man"

$  "pman.txt"   putfile

$  "Homo erectus pekinensis"

$  "pman.txt"   putfile

"pman.txt" ファイルがない状態で、実際にこの順に、この4つのコマンドを Quarckey シェルで実行する。

/O> 

Stack empty.

/O> $ "Peking Man"
... 

Stack: [ 80 101 107 105 110 103 32 77 97 110 ] 

/O> $ "pman.txt" putfile
... 

Stack: 1 

/O> $ "Homo erectus pekinensis"
... 

Stack: 1 [ 72 111 109 111 32 101 114 101 99 116 117 115 32 112 101 107 105 110 101 110 115 105 115 ] 

/O> $ "pman.txt" putfile
... 

Stack: 1 0 

/O> 

1回目の putfile は成功するが、2回目の putfile は失敗する。したがって、スタックには、1 0 が残る。


1行ずつテキストをファイルに追加するのは、putfileだけで簡単にできないことがわかる。

そこで、6行のテキストファイルをエディタにより作成しておき、それをtakefileでスタックに読み込んでみる。



/O> $ "pekingMan.txt" takefile
... 

Stack: [ 80 101 107 105 110 103 32 77 97 110 13 72 111 109 111 32 101 114 101 99 116 117 115 32 112 101 107 105 110 101 110 115 105 115 13 90 104 111 117 107 111 117 100 105 97 110 32 67 97 118 101 13 84 104 101 32 102 105 114 115 116 32 102 111 115 115 105 108 44 32 97 32 116 111 111 116 104 32 119 97 115 32 100 105 115 99 111 118 101 114 101 100 32 105 110 32 49 57 50 49 46 13 68 105 114 101 99 116 32 104 117 109 97 110 32 97 110 99 101 115 116 111 114 13 72 117 109 97 110 115 32 101 118 111 108 118 101 100 32 105 110 32 65 115 105 97 46 13 ] 1 

/O> drop
... 

Stack: [ 80 101 107 105 110 103 32 77 97 110 13 72 111 109 111 32 101 114 101 99 116 117 115 32 112 101 107 105 110 101 110 115 105 115 13 90 104 111 117 107 111 117 100 105 97 110 32 67 97 118 101 13 84 104 101 32 102 105 114 115 116 32 102 111 115 115 105 108 44 32 97 32 116 111 111 116 104 32 119 97 115 32 100 105 115 99 111 118 101 114 101 100 32 105 110 32 49 57 50 49 46 13 68 105 114 101 99 116 32 104 117 109 97 110 32 97 110 99 101 115 116 111 114 13 72 117 109 97 110 115 32 101 118 111 108 118 101 100 32 105 110 32 65 115 105 97 46 13 ] 

/O> echo$
... 
Peking Man
Homo erectus pekinensis
Zhoukoudian Cave
The first fossil, a tooth was discovered in 1921.
Direct human ancestor
Humans evolved in Asia.

Stack empty.

/O> 

ただし、takefile によりファイルシステムからは pekingMan.txt が削除される。
ファイルシステムに残すためには、sharefile を使う。


/O> $ "pekingMan.txt" sharefile
... 

Stack: [ 80 101 107 105 110 103 32 77 97 110 13 72 111 109 111 32 101 114 101 99 116 117 115 32 112 101 107 105 110 101 110 115 105 115 13 90 104 111 117 107 111 117 100 105 97 110 32 67 97 118 101 13 84 104 101 32 102 105 114 115 116 32 102 111 115 115 105 108 44 32 97 32 116 111 111 116 104 32 119 97 115 32 100 105 115 99 111 118 101 114 101 100 32 105 110 32 49 57 50 49 46 13 68 105 114 101 99 116 32 104 117 109 97 110 32 97 110 99 101 115 116 111 114 13 72 117 109 97 110 115 32 101 118 111 108 118 101 100 32 105 110 32 65 115 105 97 46 13 ] 1 

/O> echo
... 
1
Stack: [ 80 101 107 105 110 103 32 77 97 110 13 72 111 109 111 32 101 114 101 99 116 117 115 32 112 101 107 105 110 101 110 115 105 115 13 90 104 111 117 107 111 117 100 105 97 110 32 67 97 118 101 13 84 104 101 32 102 105 114 115 116 32 102 111 115 115 105 108 44 32 97 32 116 111 111 116 104 32 119 97 115 32 100 105 115 99 111 118 101 114 101 100 32 105 110 32 49 57 50 49 46 13 68 105 114 101 99 116 32 104 117 109 97 110 32 97 110 99 101 115 116 111 114 13 72 117 109 97 110 115 32 101 118 111 108 118 101 100 32 105 110 32 65 115 105 97 46 13 ] 

/O> echo$
... 
Peking Man
Homo erectus pekinensis
Zhoukoudian Cave
The first fossil, a tooth was discovered in 1921.
Direct human ancestor
Humans evolved in Asia.

Stack empty.

/O> 


ともかくテキストファイルは、改行コードを含み、[ と ]ではさんだアスキーコード列になる。

ここまでやって、input を試す。

Quarckey --- keyboard --- terminal app --- shell --- input


Python 3 の上で動く quarckey は input で Unicode を認識してもよいはずなのにできない。キーボードからの入力は、ASCII + sp + cr のみ認識する。 

ここで、input をうまく使うにはコツが要ることを知らねばいけない。ただ、input shell で実行させるとエラーになってしまう。

/O> input
... 

       Problem: Stack unexpectedly empty.

input の前に、プロンプトを出すようにすればうまくいくことがわかる。

/O> $ ": " input
... 
: The first fossil,

Stack: [ 84 104 101 32 102 105 114 115 116 32 102 111 115 115 105 108 44 ] 

/O> $ ": " input
... 
: a tooth was discovered in 1921.

Stack: [ 84 104 101 32 102 105 114 115 116 32 102 111 115 115 105 108 44 ] [ 97 32 116 111 111 116 104 32 119 97 115 32 100 105 115 99 111 118 101 114 101 100 32 105 110 32 49 57 50 49 46 ] 

input により入力された二つのフレーズが、それぞれ [  ] で囲まれスタックに積まれている状態ができあがったことになる。


3日目

ファイルとスタックとのやりとり、キーボードとターミナルアプリケーションの入出力コマンドでこれまでに使ったのをまとめる。


         Shell  /O>
     |
Keyboard
      |   $ ":" input
Terminal application
         ...

             :Inherit the stars

      |
   Stack                     ---                                       File

[ 73 110 104 101 114 105 116 32 116 104 101 32 115 116 97 114 115 ]

               /O>  $ "foo.txt" putfile 

                                                                                                                                   foo.txt

                  /O>  $ "foo.txt" takefile

[ 73 110 104 101 114 105 116 32 116 104 101 32 115 116 97 114 115 ]  1


1. " 文字列" をスタックに積む。

$  "Peking Man"


2.  プロンプトをだし、キー入力を待つ。キーをタイプし、エンターキーを押せば入力されたキーがスタックに積まれる。エンターキーだけ押すとスタックに エンプティ、[ ]が入ることになる。

$  ":"  input


3.  ファイル名を指定し、スタックの内容をファイルに書きだす。

$  "foo.txt"  putfile

この putfile の結果は、二つに分れる。うまくいくときといかないときのどちらか。

まず、このコマンドを実行する前に、既に foo.txt が存在するときは、スタックの内容を foo.txt に書き出すことができず、スタックはコマンド実行の失敗をしめる 0 が入る。ファイル foo.txt の内容は書き換えらず元のまま。実行前のスタックの内容はクリアされ、失敗した印 0 が積まれる 。

逆に foo.txt がファイルシステムに存在しなければ、スタックの内容を foo.txt と名付けたファイルに書き出す。このときスタックの書き出した文字列は消され、成功した印 1 が積まれる。

4.  スタックにファイルの内容をコピーする。

$  "foo.txt"  sharefile

この sharefile にも二つの場合がある。foo.txt が存在するときは、その内容をスタックにコピーし、成功した印の 1 をスタックに積む。また、foo.txt がなかったときは、foo.txt の文字列をスタックに格納し、失敗の印 0 をスタックに積む。

5.  ファイルの内容をスタックにコピーする。

$   "foo.txt"  takefile
 

takefile は、ファイル名 foo.txt の内容を取り除き、それをスタックに積む。さらに foo.txtファイルは削除され、成功の印 1 がスタックに積まれる。もし、foo.txt が存在しないときは、スタックには、ファイル名の文字列 foo.txt が詰れ、さらに失敗の印 0 が積まれることになる。

練習 1 の答え

テキスト格納用のファイルを作成し、それにどんどん行を追加してゆくのは、どうもQuackeryには不向きな仕事のように、これまでの putfile, takefile, sharefile 程度のファイル操作の知識だけではうまいコード、スクリプトは書けそうにないことがわかった。文字列処理がUnicodeに対応していないこともこれから先、テキスト処理をしていく上ではなにか発展性がないようにも思えた。
結論として、練習 1 はこのあたりまでにしおく。四日目からは、スタックについてもう少し練習しようと思うが、はじめに算術からやってみることにする。

4日目








 


0 件のコメント:

コメントを投稿

ジェームズ・エルロイの L.A. Quartet シリーズを読みはじめようと計画

 きっかけは『ホワイト・ジャズ』に興味を持ったのがきっかけですが、 注文しようとしたら、日本語訳はほとんど絶版のようになっていて、 キンドルでサンプルを読みはじめると、スラスラ読めるようなものでは無い ことがわかって逆に紙のペーパーバックスでシリーズを注文しようとすると L.A....