統語感覚
その言語の文法や習慣に則って文を組み立てるときに求められる、半ば無意識的な思考のクセ
SVOなのか、SOVなのか、住所や物事の詳細度をどちらの順番で並べるのか。その言語を使いこなせるということは、単に理屈として文法を知っているだけではなく、頭に浮かんだ情報がそのままの順序、構造で文章に統合できるよう、思考のあり方が文法に溶け込んでいる状態であるということをいいます (要出典)。
自然言語に限らず、プログラミング言語にもまた、その文法や設計思想に由来する固有の統語感覚があるとbaku89.iconは考えています。
純粋関数型言語は、逐次実行される「手続き」を書いているという意識が薄くなります。Ted Ciang『あなたの人生の物語』のように、思考から時制が消えるといっても良いかもしれません。例えば circle([0, 0], 10)というコードにおいて、circleがProcessingのようにキャンバスへの描画を実行するサブルーチンであれば、それは「円を書け」という命令文に感じらられますが、中心と半径を引数に取りパスオブジェクトを返す純粋関数の場合、式全体が「中心(0, 0)、半径10の円」という名詞句のように思えてきます。特に遅延評価の場合、その文が書かれた順に実行されるとは限らないため、ソースコードはプログラムというより数式や定義リストに近いdeclarativeなものに感じられてきます。
オブジェクト指向型プログラミング(OOP)において、メゾッドの呼び出しは「手続きの主語」の存在を感じさせます。例えば window.open("https://glisp.app") は“The window opens https://glisp.app .”という英文として、読み下すことができるでしょう。しかし、常に (func arg1 arg2) のような形でしか関数を呼び出すことができないLispやHaskellの場合、動作は決してオブジェクトに属することはありません。こうした言語を使いこなすプログラマーにとって、関数というある種の動詞こそがまず第一に頭に浮かぶ品詞です。その後に続く引数は動詞を修飾する情報に過ぎず、そこに主語や目的語、補語といった区別はそれほどありません。これは日本語の構造とも似ています。日本語はしばしSVO型の言語だと言われますが、「私は りんごを 食べる」を「りんごを 私は 食べる」と並び替えても十分意味が通じます。つまり日本語は、文末の V に向けて主語も目的語も分け隔てなく並置するという構造となってるといえます。そしてこれは、Vの位置が逆転していることを除いて、とてもLisp的です。 https://scrapbox.io/files/63240b861d5e13001dd34982.png
このように考えると、OOPに典型的な subject.verb(objective) という構文は、SVO型という点で英語的ともいえます。
読むべき文献
メモ
再帰や畳込、mapではなくループでコードを書くのは、(OOP、手続き型問わず)プログラムが逐次実行される手順であるというイメージが頭から抜けてないから。その点Haskellは「それが何たるかの定義を書き下す」感覚に近いので、自然とループを書こうとは思わなくなる
ノーコードについて
ノーコード、自然言語に例えると、節を再帰的に埋め込んだり、指示代名詞や造語を自由に定義・参照できる柔軟さを投げ売って、「_の位置に_色で描く」という固定された文の穴埋め部分だけをユーザーに触らせるのに近い。
「餃子の皮それぞれを『皮で餡を包む』」という動作なんてmapそのものだし、もっと言えばfmap(f = リスト函手、a = 皮, b = 🥟)。文字列による小難しいコードをGUIによって隠蔽する方向は正しいが、 プログラミング的メンタルモデルまで排除する必要は無いと思ってしまう。
『皮で餡を包む』という動作を『-こと』という名詞節として参照できるように、自然言語は関数オブジェクトを当たり前に扱える。しかしGUIの場合、ユーザー入力できる対称は数値や文字列、画像のような静的なデータという先入観がUI設計者にもユーザーにも根強い印象がある。よって、餃子を作る機能は「餃子を_個つくる」専用のものとなりがちで、料理毎に「ハンバーグを_個つくる」「シュウマイを_個つくる」という機能が別個に定義されている状態となる。穴埋め部分「_ 」には自然数そのものしか入力することができず、『買った皮の枚数分だけ』のような、状況に応じて動的に決定される文を打ち込むことはできない。
PLを自然言語に例える
関数オブジェクトは「○○すること」という節の表現を可能にし、文字列置換をベースとしたマクロは文そのものへの言及を可能にする。ASTを操作するタイプの(Lisp, Juliaのような)True Macrosは、文のみならず、その文を構成する構文的要素への言及と操作を可能にする。