見出し画像

🎶ロゼッタ ソース博覧会 をらがファイル読み込み ずらり171言語

前回全行なめるというのを簡潔に書こうとしたらいつものようにGEXP級に結論にたどりつくことがなく気づいたらrozetta codeの知ってる言語のファイル行読み込みを読んでいた。どういうrozetta 編纂方針かわからないが、なんか特定の言語は「いじられてる」ようにも見えなくないこそばゆい感じがしてきたので告発しておきたい。

ロゼッタコード(Rosetta Code)は、一般的なアルゴリズムを実装したwikiベースのプログラミングサイトであり、多くの異なるプログラミング言語で様々なプログラミング問題の解決策を提供している[1]。 ロゼッタストーンには3つの言語で同じ文字が刻まれており、エジプトの象形文字の解読を初めて可能にしたことから名付けられた。

2020年10月31日現在、ロゼッタコードには
1,074個のプログラミング作業(または問題点
210 追加のドラフトプログラミング作業
780 コンピュータプログラミング言語
73,811 コンピュータプログラミング言語の例/エントリ

プログラミング言語、といわれるものが780以上もあることにふるえるが、リアルな言語は数千もあるそうなので、震えも少し止まる。

前回はこのうち「全行なめる」コンセプトに合致するものをスマートに抽出して、実際に「全行なめる」際の留意点、そしてバッファやファイル構造といった原理に降りていくという壮大な計画をたてたが全然到達しないで今こうしておかしな言語の博覧会みたいなことをしようとしているが、基本は知ってる言語だが一番笑ったのはFortranだった。

通常、人はファイルの中に何が入っているのか、そしてそれを読む背後にある何らかの目的を考えてファイルを読みます。この作業のために、ファイルにはプレーンテキストが含まれているだけで、そのテキストはファイルの最後まで一行ずつリストアップされているとします。残る問題は、最長のレコードはどのくらいの長さなのかということです。いくつかのシステムでは、レコードの内容を保持するのに十分な大きさの変数にレコードを読み込めるようになっていますが、おそらく 65535 のような整数の限界までです。Fortran 2000では、代入時にサイズが決定される文字変数を正式に提供していますが(TEXT = "This"//"That "のように、文字変数TEXTは代入に必要な8文字を保持するようにメモリを再割り当てされます)、F2000コンパイラでテストしてみないと、この配置がREAD文でも動作するかどうかはわかりません。

まさかサンプルソース読みたいのに人の理を矢立肇みたいに諭されるとは思わなかった。しかし、後半で言いたかったことのような気もする。引用している個所は一部分で、まるまるサンプルがでるまで長文を読まされる構成になっている。

こうなってくると、博覧会よりも、冒頭で語ってるやつの言語が気になってくる。goもfortranほどじゃないが前口上が入っている。

bufio パッケージには、改行で区切られたテキストのファイルなどのデータを読み取るための便利なインターフェイスである Scanner が含まれています。Scan メソッドを連続して呼び出すと、ファイルの「トークン」をステップスルーし、トークン間のバイトをスキップします。

おそらく、をらが言語、goにはスマートなパッケージ名と、「トークン」なる若干抽象的な概念があるんだぜと言わんばかりの前口上。

Jは現在のところ、この「一行だけ読む」というアプローチを推奨していません。行の任意の文字に加えて、問題の大きさと範囲の問題があります(改行の区切り文字の間に10億文字もの文字があるとどうなるのでしょうか?)。通常、ファイル全体を読むか、ファイルをメモリマップする方が簡単で、ファイルが非常に大きい場合には、ブロックサイズや例外処理のような問題をプログラマが明示的に制御する方が良いでしょう。

よもやファイルの読み込みにまで推奨する奴が出てくるとは想像だにしなかったうえに、Jって何のことだ、千原ジュニアか。

APLの次世代言語らしい。言語ってすばらしい。APL自体がマインドパレス上で危険区域に入っているので、Jがヤバい言語であるのは分かった。しかし言いたいことはわかる。

SNOBOL4 では、ファイルの入出力はファイルと変数を関連付けることで行われます。この変数にアクセスするたびに、そのファイルの次のレコードが得られます。

めちゃめちゃかっこいい、分かりやすいかは置いといて、三週ひねった感じで使いやすそうだ。SNOBOLのこともSNOBOL4のこともしらないが、おそらく関数言語みたいな野郎に違いがない。

ゆえに SNOBOL は連想配列の祖といえる。

60年代に文字処理を得意とした言語が生まれていたらしい。有名だったら申し訳が無い。読み返してみるとようするに「行読み込みできない」ということを言い返してる特定の言語があるということだったらしい。

個人的な収穫としてはLISP系の言語がどう理屈をいわれてものみこめなかったが、ファイル処理のコードをよんだらなんとなく書き方とかせんなさが分かってきた。かっこで囲んでおしゃれなウェハーにしちまえばいいんだと

(define file (open-input-file "input.txt"))
(do ((line (read-line file) (read-line file))) ((eof-object? line))
       (display line)
       (newline))

とか

(with-open-file (input "file.txt")
  (loop for line = (read-line input nil)
     while line do (format t "~a~%" line)))

とか

(with-open [r (clojure.java.io/reader "some-file.txt")]
  (doseq [l (line-seq r)]
    (println l)))

とかいろいろ。forthは実装もしてみたいし理解したい言語だったが、ファイル読み込み例をみてもいつものforthだった。ポテンシャルがあると左脳が言ってるが右脳が拒絶反応を起こしている。

awkも近所のお兄ちゃんみたいな感じでカッコイイ気がしているので、本でも買うか。

https://amzn.to/3pMNs00

後に来なったところでは、うちはワンライナーでできるよ的なアプローチをしてきていたのはC#,Factor,Groovy,Logo,Scalaあたりだろうか。sedというものあったが無理くりで、forthとは別の方向で背伸びをしていた。※あくまで個人的な感想とrosettaで見た結果なので、実際の言語の効能や効果とは異なる場合があります。






お願い致します