見出し画像

Retro-gaming and so on

RE: プログラミング日記

星田さんの記事に対してのコメント。

> 2021/11/13

これはクソ記事(アフィリエイト目的とか)でしょうもない同じような文章ばっかりが見つかって欲しい情報に(日本語独自の問題なのか?)にアクセスしにくくなってる問題をなんとかしないといかんですよね・・

この辺は余談。
過去、Googleもなんとかしようとしてたんだけど、無駄に終わってるのね(笑)。
そう言うの、過去は検索スパムとか呼んでたんですが。
特に最初の検索スパムはブログだったんですよ。何かマトモな記事が引っかかる以上に不完全なブログ記事ばっか引っかかるようになって。
で、Googleはブログ記事用に別の検索エンジン、Google Blog Searchを作成して、ブログを分けちゃおうって頑張ったんだけど、結果上手く行かなかったんですよね。
何故なら、基本的にHTML情報じゃフツーのWebページとブログの違いが分からんから、です。
結局10年くらい頑張ったんだけど、諦めちゃったのね。

なお、元Google社員が立ち上げたエロ記事専門の検索エンジン、Boodigoなんつーのもあるけど、こういう風に「なんかに特化した」検索エンジンを作ったりするのもなかなか難しそうです・・・・・・。

ちなみに、今じゃ、Qiitaなんかもトップに来すぎて、これも検索スパム化してますねぇ。

この記事の聞き手になってる人が「Lispの大御所」である竹内郁雄という方らしい。NTTで仕切ってたという話なのでCametan42さんの話によく出てくるNTTのLisp部隊の司令官みたいな人だったのかな?

はい、そうです。
あと、NTTに於ける・・・っつーかむしろ電電公社か(笑)、でのLispマシンの開発やらISLISPの策定にも尽力した人ですね・・・Lisperとしては超有名な人ではないでしょうか。
Lisp関係の書籍では初めての人のためのLISPと言う著書があります。・・・・・・ただ、元々雑誌の連載記事の単行本化であり、ANSI Common Lispを包括的に教える本ではないので、推薦からは外してました。
好きな人はメチャクチャ好きみたいですけどね。
ホントのLisp初心者向けの本ではあるんですが、現代的ではないですし。

> 2021/11/14

夢の話は面白かった(笑)。っつーか大笑いしてました(笑)。

Loopすごい!(())ばっかり見てるので確かに違和感あるけど。例題の進化ゲームもお面白かったなぁ~・・こういうのが好きなのかも?Formatもこれでもかってくらいに整形のオプションがあって「テキストだったらPythonでやるからエエわ~」とか思ってたけど甘かったな。

loopformatも事実上、ANSI Common Lisp内に於ける「別言語」です。DSLですね。
両者とも強力な「専用言語」で、loopはマクロの傑作、formatは関数の傑作でしょう。
今回はformatを。
元々、オリジナルのLispには文字列が無くって、印字は全部シンボルを使ってました。多分、Land of Lispにも書いてるでしょうが、

'(This is an old lisp style output)

みたいに出力してました。事実、古いLisp本だと文字列の項目なんざ一切無かったです。
Lispみたいにシンボルが強力なデータ型として設計されてて、なおかつ自在にリストを扱える以上、「不便な文字列」は好まれてなかったんです。
そんな中、文字列が導入されて、あれやこれやあって、formatと言う関数が作られた。
ANSI Common Lispユーザーは「Common Lispは関数型じゃない」と言うけど、設計者はそうは考えてなかったんじゃないか、って程formatは独立してる。
と言うのも、出力は副作用で、

「どーせやるなら出力記述は完全にANSI Common Lispから切り離しちゃってエエんちゃうの?」

なカンジで、神経質に「文字列の出力にまつわるアレコレ」をformat「だけ」で行えるような設計にしています。
要するに、本体は関数型プログラミング、出力にまつわる部分は全部format「だけ」で完結するようなとんでもない性能にしてるんですね。いささかオーバースペックと言うか。
例えば、次のような事が出来る。

CL-USER> (defparameter lst '(This is an old lisp style output))
LST
CL-USER> (format t "~{~a~^ ~}" lst)
THIS IS AN OLD LISP STYLE OUTPUT
NIL
CL-USER>

これ分かりますかね?出力したいブツはリストになってる。そして出力が文字列になってる。
lst'(This is an old lisp style output)で、書式指定子はどんなブツでも受け入れる~a一個だけ。
と言う事は基本的にリストの要素の個数と書式指定子の個数の帳尻が合わない筈なのに、キチンとリストの要素全部が文字列に変換されている。
と言う事はformatは繰り返し構文を内包してる、って事です。~{~}ってのがformat内のイテレータになってる(~^は一種終了条件で、「他に要素が無かったら終われ」と言う意味を持つ)。
他にも条件分岐なんかもあって、まさしく出力用のミニ言語になっています。
要するに、全プログラミング言語を見ても、こんなに強力な出力関数はありません。完全にANSI Common Lispの「関数型言語じゃない出力という副作用の部分を独立で扱える」ように設計されています。
・・・・・・ただ、これはこれでまた機能が豊富過ぎて、どんなLisperでも全部機能を暗記するのは不可能、って程に凝りすぎた関数です。

なお、仕様には細かく機能が書いてないので、それ以前の版のCommon Lisp the Language 第二版を参照するのが一番、の機能なんですが、みんなformatの項ばっか調べまくるので本がそこで割れると言われています。
(英語版だけどここで調べるのが一番ですが、それでもメチャクチャ分量が多い。)

ちなみに、Racketでは機能限定版のformatがあり、また、ANSI Common Lispには及びませんが、SRFI-28SRFI-48が提供されています。

マクロは実際に使ってみないと「なんで普通の関数では駄目なの?」ってありがたみが分からないかな・・

うん、結局最後は評価されちゃう、ってのは同じですからね・・・。
先行評価の関数、遅延評価のマクロ、って言われても今の時点ではピンと来ないでしょうし、「プログラムを書くプログラム」って言われてもやっぱイマイチピンと来ないでしょう。
取り敢えず今のトコは「構文を作る為」、つまり、「ユーザー定義関数」「ユーザー定義型」に続き、第三の「ユーザー定義構文」が書ける機能だ、って事を押さえておくしかないかな・・・・・・。
Pythonや他の一般的なプログラミング言語では構文は弄れませんが、ANSI Common LispやSchemeなら可能だ、とそういう事です。

  • Xでシェアする
  • Facebookでシェアする
  • はてなブックマークに追加する
  • LINEでシェアする

最近の「RE: プログラミング日記」カテゴリーもっと見る

最近の記事
バックナンバー
人気記事