見出し画像

Retro-gaming and so on

RE: プログラミング学習日記 2022/11/17〜

星田さんの記事に対するコメント。


 とりあえずSyntax-rulesについて書かれてる日本語のサイトがあんまり無いので片っ端から打ち込んでいくか!と。Scheme入門のページでいきなり躓く。(1+ って変わった記述だなぁ・・と思ったんですけどやっぱり動かず。

ああ、ホンマや。
いや、紫藤さんも当然ANSI Common Lispも良く知ってて、多分手癖で書いちゃったんだろうねぇ。
1+ってのはANSI Common Lispの関数で、その名の通り「1足す」関数です。Racketで言うとadd1
いずれにせよ、Schemeのコードに唐突にANSI Common Lispのコードが現れても困っちゃうのは事実(もちろん (define (1+ n) (+ n 1)) と言う定義を妨げるモノじゃない・※1)。
むしろ、CLerとしても著名な筈の川合史朗さんが、Gaucheに1+を含めない、って事の方に驚いてたりして(笑)。

 パターンマッチの方に...をつけても本体のボディ(変な表現?)に...がついてないと駄目と。じゃあもう完全に定形フォームってことなんすね、了解!

基本的に、Schemeのマクロってパターンを記述して、それを「並べ替える」だけだから、ね。
結局、パターンマッチング側に

b1 ...

と書かれてた場合、b1(以下同文)みたいな意味になるんで、変換先もその「パターン」を継承しないといけない。
(いくつか知らんけど)複数の同様のモノが続きますよ、って言われたらそれをそのまま持ってこないとパターン判定に引っかかるわけ。
んで、こういうルールな為、明らかにLispとしての「評価規則」とはまるで別物なんだよなぁ。
まぁ、「簡単に記述出来る」のは事実なんで、マクロ初心者に「マクロの意味」を教えるには適切なんだけど、一方、「簡単に記述出来る」のは「簡単な事しか出来ない」のと同義だ。
だから、ある程度syntax-rulesでマクロと言う概念に慣れ、マクロを極めたい、としたらそれがANSI Common Lispに移るタイミングなのかもな、とは思う。
ANSI Common Lispのマクロは、ホンマ最初は「何だこれ?」なんだけど、ロジック自体はLispの範疇内なんで、「Lispで考えられる」のがやっぱ利点なんだよな。

 なんとなく引数のクォートを外したら動いてしまった!パターンマッチングの場合にはもしかしてこうなのか?ちょっと追求せねばなるまい!というところで時間切れ。

うん、結局macro-list-reverseの引数に与えてるリストはLispプログラミング上でのリストじゃないのね。単なる(xs ...)って言う「パターン」なんだ。
これが成立してる、っつーのが、例えばletの「構文」の理由だ。

(let ((x ..) ...) body ...)

letの第一引数の変数束縛部、要は「カッコがやたら多い場所」はリストに見えるけどクオートされていない。つまりLispプログラミング上での「リストと言うデータ型」を実は意味していない。ここでのカッコとコッカは「内包するデータ(変数とかその中身とか)」の区分けのサインとして働いてるだけで、要は構文要素になっている(カッコの第一引数が変数名で、関数じゃなくても文句を言われない、ってのも「通常のリストじゃない」サインだ)。
とまぁ、Schemeのルールから言うと、syntax-rules上の「記述」そして「その意味」ってのは明らかにSchemeの評価ルールから逸脱していて、「全く別の言語」なんだ。
取り敢えず式から式に「変換してる」って事だけは押さえておこう。何故ならそれがマクロの概念、だからだ。

 いろんなテクがあるんだぁ〜。一文字だけの入力は便利そうなのでぜひ覚えておこう!

っつーか、正直言うと、出力バッファを掃除するシステムがあるなら、入力バッファを掃除するシステムも付けておけよ、とか思ってます(笑)。
ただ、begin0って機能はそれこそLisp系言語以外には見られない機能だし(※2)、それこそ「Lispの黒魔術」の一旦なんで(笑)、可愛がってやってください(笑)。あんま出番ねぇけど(笑)。でもいざとなったら凄く頼りになるヤツなんでよろしく(笑)。

※1: このテの関数名でビックリするのは当然で、通常、フツーのプログラミング言語だと、「冒頭が数値の関数名は定義出来ない」と言うルールがあるが、Lisp系言語に限ってはどこ吹く風、って事になる。
このように、命名ルールに関してもLisp系言語の自由度は他の言語の比じゃあない。
逆に言うと、このせいで、Lisp系言語の組み込み関数名(特にANSI Common Lisp)は「やっつけ感満載の」「如何にもテキトーにその場限りで名付けました」と言う命名の嵐になっている(笑)。
なお、これもLispには他の言語で言う「地の文」ってのがそもそも存在しない事に由来してる。シンボル自体がデータ型で、シンボルを自由に記述してそれに「関数と言うデータ型」を束縛してるだけだ、と言う関数定義形式が、こういう他の言語では見られない命名の自由度を保証している理由となる。

※2: 繰り返すが、ANSI Common Lispのprog1が元ネタだ。
  • Xでシェアする
  • Facebookでシェアする
  • はてなブックマークに追加する
  • LINEでシェアする

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

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