ขนาดวิดีโอ: 1280 X 720853 X 480640 X 360
แสดงแผงควบคุมโปรแกรมเล่น
เล่นอัตโนมัติ
เล่นใหม่
【参考文献】◯Land of Lispwww.valuebooks.jp/bp/VS0036813874◯はじめてのLisp関数型プログラミングwww.valuebooks.jp/bp/VS0003745575◯◯ポール・グレアム『Lispの起源』有志による日本語訳masatoi.hateblo.jp/entry/20151210/1449948614【サポーターコミュニティへの加入はこちらから!】yurugengo.com/support【おたよりフォーム】forms.gle/BLEZpLcdEPmoZTH4A※皆様からの楽しいおたよりをお待ちしています!
数学寄り:より正確に簡潔に書くことを目的として、厳密性を追求する工学寄り:人間が扱いやすくなることを目的として、可読性を追求するということか
そんな気がしますね〜工学は人間の実用のための学問で例外的ルールが多いのもそっくりだと思いました数学より理学のほうが表現的に良いのではなんて思ったり
熱狂的な信者はね意識してるかは別として沼にはめてくるんです。だから親切だし丁寧だしフレンドリーなんです。
指数対数を習うときの難しさの原因は語順だと思ってます- や÷なら前に来てたはずの数が、logや√の後に来るんですよねこんなに演算間で語順が統一されてないのに、なんで理系の人がこれを許せるんだろうとずっと思ってました
コメント欄がLispの合理性を力説する人が多くてびっくり!素晴らしい言語なんですね!僕はC++勉強するのでここで!それじゃ!
rustやろうぜ
明らかにヤバいやつから逃げるムーブ
笑
正直、Lispのとっつきづらさは概念の難しさもありますが、Lisperの人たちの「Lispは神の言語」的な冗談なのか本気なのかよくわからないことを言ってる感じのコミュニティの雰囲気が怖くて近づきたくないってのも感じてしまいます
C++ の場合、演算子も [クラスのインスタンス]->[メンバ関数]->[引数] という記法に基づいていて「3+5」は(概念的にですが)以下の様に解釈されるようです。①3 を初期値としたインスタンスの作成②そのインスタンスのメンバ関数「+」に引数 5 を渡す③メンバ関数「+」は、自身に 5 を足した値を戻り値として返す演算子をオーバーロードしてみると、この概念が分かるようになりますが、ややこしいことには変わりないです。Z80 アセンブラの「SUB s」(アキュムレータの値から s を引いてアキュムレータに入れる)の命令文に似ていると思えば、分かりやすい?
31:42 「コンピュータは旧約聖書の神に似ている 規則は多く慈悲はない」 ーJoseph Campbellー
他の言語だと 1 + 2 * 3 って書いた時に処理順が実は処理系依存になったりする、もちろん常識的にわかるけどLispの場合だと (+ 1 (* 2 3)) という記載となり処理順に曖昧さがないそして四則演算の記号も処理系が勝手に処理することがなくなるため関数名等のシンボルにハイフン(-)が使えたりするハイフン(-) は一番の敵で、引き算だったりマイナス値として扱わないといけなかったりするのでかなり面倒
すげぇ!そういうことか!プログラミング言語やったことないが、凄さは分かった!
+ 3 5は、plus(3 , 5)の省略記法だと考えたら超わかりやすい、というかそもそもPython書いてるときもKotlin書いてるときも頭の中ではずっとそう思ってた
Cとかで演算子オーバーロードをやると、演算子も引数をとるただの関数なんだっていう意識が芽生えたなー
それ聞いてて自分も思ったwC#だと自作クラスの四則演算をoperatorのオーバーロードで定義しなおせるし、+ 3 5の方が超自然
Kotlinだと中置記法を作れる`infix fun`があるのは目鱗だった`3.plus(5)`= `3 plus 5`人間としてはinfixの形式のほうが読みやすいからなー
ExcelのSUM関数なんかはまさにその書き方ですねSUM関数の場合、値そのものよりセル番号やセル範囲を引数にすることの方が多いですが
「3+5」、日本語だと「3と5を足す」で、云わば「3 5 +」だから、日本語には逆ポーランド記法は相性がいいと思う。(2*(3+5) 、2に 3と5を足したものを掛ける → 2 3 5 + * )(”逆”の逆で、言ってみれば、正の)ポーランド記法は日本語で考えると(むしろ)”逆”に感じるのかもしれない。
「3に5を足す」や「add 3 to 5」が自然言語的であって、3+5のようなinfix notation が自然言語的というのは感覚的に違和感がありますね。
@@quux- 確かに"自然言語的”と言ってしまうのは違和感。なんだろうなぁ…ただ、「3 足す 5」と言い、「3+5」と表記するのにも慣れている自分もいる…、 ”日常的”、”慣れ親しんだ学校算数的” でもある…^^;
4:56 「潜入して見ないと...」プログラミング言語は大丈夫ですが、宗教ではやらないでください。島田裕巳先生の二の舞になります。
水野さんが「神が作ったものなら美しいはず」のところで、量子論について「神はサイコロを振らない」と言ったアインシュタインがオーバーラップしました
そろばんの読上算は、最初に「加えて」とか「引いては」とかで演算の種類提示して、その後は「〇円也、〇円也…」で数字を羅列して行くらしいので、Lisp的かつ自然言語的な計算方法ですね。
+3 5って書き方は確かに一見わかりづらいけどExcelのSUM関数みたいなもんと思えば入ってきやすいですね
別分野から同じ話に近づいていく様がめちゃめちゃおもしろいですね。真理値の話をして、booleanが通じないところとかおもしろかったです。
トキヒロさんも呼んでほしい😂
水野さんが頑なに、プログラミング言語の事をコンピュータ言語と言おうとするの好きです
Lispは(というかS式とマクロは)、実用的なプログラミング言語では隠蔽されている本質をダイレクトに見せてくれるので、初心者には一度Lispに触れてほしい(実用しろとは言わない)
Lispのキモは四則演算の表記法がどうこうではなく、コードとデータが同じ構造であるため自然な形で自己言及ができるところにあると思います。
ポールグレアム「Hei! Mr.Horimoto!」堀元「ちょっとわからないですねぇ」ポールグレアム「ネビッチ4」
冪乗もpower(2,10)と書いたりしますし、その延長でadd(3,5)があると見れば、表記揺れで+ 3 5があっても自然な気してきますね〜
形式意味論:全ては集合か真理値であるLisp:全てはアトムかコンスセルである
沼への道は親切でできている
プログラミング言語は機械と人間を橋渡しするための手段なので、人間への優しさを忘れてしまったら本末転倒なんだよなー、とか思いつつ、次回を楽しみにしてます。
n個の整数を足すぞ、ってときに、 ns=[1,2,3,4]; ns.reduce((x,y)=>x+y, 0) みたいに書いてから、「いやいや + が複数引数取れよ」って思っちゃいますよね(?)
日本語は分かち書きをしないので、引数列をスペース区切りで記述するのに違和感を覚えやすいなって思います中置記法はオブジェクト指向的な書き方だなとも思ったりします:1 + 2 - 3 = (1).add(2).sub(3)
Scala では 1.+(2).+(3) と書けますよ。
31:23 理科のテストで「三 容女 某」に見えて☓になった子いた。手書きスペース難しい問題漢字編。
文字を 横→木黄 みたいに横倍角相当に書く友人がいた。同類だ。
溶媒をそんな書き方するの?と思ったけど、確かに部首と旁の間と文字間のバランス感覚が弱い人もいるんでしょうね。でも、不正解にした先生は厳しいなぁ
ML系言語を触るとまた違う感想がでてきそう
26:53 数学だと f(x) 、sin x とか最大公約数もgcd(84,32) = 4 みたいにプログラミングの関数っぽい書き方になっていますよ~
プログラミング言語の形式的意味論入門っていう本があったきがします
Lispの方言の一つである、Schemeの言語仕様書には形式的意味論による定義が載っていたような。
処理は入力と出力に還元できるということに自力で気づくのに、学部で4年、社会人になってから2年プログラムを書いてようやく気づきました
是非Forthを40時間学んで下さい。逆ポーランド記法が如何に自然なのかが分かる。動詞が最後に来るのは日本人にとって優しいのでは?LISPだと、括弧から閉じ括弧までを切り出して、最初を関数その余を引数とする様に構文解析しなければいけない。Forthだと、リテラル(数字・文字列)はスタックに積む、名前(ワード)だと関数として実行する。この規則だけでいい。パラメータをスタックからどれだけ使うかはワード(関数)に依存するので、構文解析の感知するところでない。
確かに逆ポーランド記法は日本語に直すと理解しやすいと学んだなぁ3 4 +で3と4を足すと言う日本語文法になるみたいな
FORTHを触るとカッコの有り難みを感じますね。自動でインデントをつければ良いのかも知れないけど
@@essauouo5251FORTH を学ぶとカッコが要らない有り難さを感じますw(馴染みのない方のために:カッコはコメントで、主にスタック操作の仕様を書くために使われます)
昔はアセンブリ言語でプログラムを作ってたことを考えれば、プログラミング言語が自然言語寄りになっているのは当然ですね。人間が理解しやすいものを目指して作られたのが今のプログラミング言語ですから。生成AIにコードを書かせるというのはその究極の到達点かもしれません。Lispはその流れの外というか、アセンブリ言語の記法を受け継いだような感じ・・・?
アンサイクロペディアのLISPのページめっちゃ好き
Pythonはオランダ人が作った...
dijkstraはオランダ人なので、コンピュータサイエンスはオランダ人が作ったと言っても過言
コンピュータサイエンスは蘭学だったのか
過言ではあるのか…
17:15 「処理を返す」から、高階関数の話が始まると思っちゃいました。まだでしたね。でもLispの話ならば避けて通れないと思いますので、次回以降が楽しみです。
言語学とコンピュータ科学の間というとやはり自然言語処理の回を見てみたいです😃
8:06 日本も埋め立てをし過ぎたせいで「世界は神が作ったが、日本は日本人が作った」って言われてました
日本は埋立どころか、河川はほとんど「サイボーグ」状態で、「森林」も「野生動物」もかなりの比率で「家畜化」されてますよね。一番大きいのは、人間の「自己家畜化率」の進展度合いが「最先端」なところ。※個人の感想を念みます。
去年HSP3という言語のプログラムコンテストで、文字列で四則演算をするモジュールを作ったのですが、関数型言語もLispも全く知らない状態で作ったのがadd(p1,p2)のような記述でした。四則演算も比較も関数で全て定義しましたが、何も知らない身ながら結局内部的な作りやすさも使い勝手も関数が最強なのだと思いました。
真理値と集合の2つしかない、というのは数学基礎論(公理的集合論)の立場と同じですね。数学で扱うあらゆるモノは(写像や関係みたいなモノも)集合として構成可能であるという立場です。
今日初めてゆる学徒カフェにお邪魔します!
楽しんできてね😊
お、いいなあ行ってらっしゃい
せっかくなので相席でお喋りしました!超楽しかったです!!
楽しまれたようで何よりです👍
3 + 5は自分のメンタルモデルでは、+関数の引数が中置されてるのではなく、3のメソッドaddに引数5を渡すことの特殊な書き方なんだなと気づきました
本筋には全く関係ないくらい非常に細かいこと言うと、C言語のforで()の後に来るのは文であって、{}がよく来るのは複数の文を単一の文と同じ扱いにする複文を表す記号だからってだけ。forで繰り返す内容が単一の文で表せるなら{}は要らない。
楽しみに待ってました
ぼくも!
たのまち
演算子オーバーロードできる言語は"5+3"の5をオブジェクトとして 5.plus(3) とメソッドチェーンぽく解釈されている印象です
むしろ小学校の足し算をLISPに合わせて + 3 5 と表記すべき。
(過言である)
演算子というルール自体特殊、というのはHaskellなどからも読み取れますねー関数にカッコつけると演算子にできる、逆に演算子にカッコつけると関数にできたり
アセンブラは、操作(ニーモニック;関数とか機能に相当)の次にレジスタ(パラメータ)や番地(ジャンプ先ラベル)の順番で統一ですよね。例えば ADD X Y戻り値(ALUの結果)の格納レジスタが固定で特殊だけど。
Booleanの訳は真偽値でもいいと思うけど、教科書的には真理値かと思います。真理値表とはいうけど、真偽値表とはあまり言わない。
Haskellなら関数名をバッククォートで囲めば中置記法として使えるから過激派も安心
11:21「3 + 5 + 8」 が「+(3 5 8)」になるのですか?「+(3 +(5 8))」等ではなく?それは数学的にはどのように定義(解釈)されるのだろう・・・?後者なら例えば「+:R2 -> R; +(x y):=x+y」みたいな感じだと思うのですが、前者(引数の数(次元)が任意)だと、数学的には、めんどくさい(きれいじゃない)定義になりそう。。。まあ、見た目の問題だけといえばそうなのですが。
lispわかんないですが+という記号がsum関数として解釈されてるかもそれなら+ 3 5の場合の処理も変わらないので拡張として便利かと
@user-nn7nh1jl2c そうですね。便利さ、という観点ではその通りだと思います。ただ、数学的な美しさ、と言われるとどうか、という話ですね。ざっとは以下のような定義になるかと思うのですが(+だと見にくいのでfにしています)、突然出てくるnとか気持ち悪くないですかね…?for ∀n ∈ N f:R^n -> R: f(r1,r2,...,rn) := r1 + r2 + ... + rn まあ、他にも書き方はいろいろあるとは思うのですが。
nim言語というプログラミング言語では UFCS( f(a, b) と a.f(b) を同じ意味を持つ別表記とする ) があったり `+`(1, 2) と 1 + 2 を同一視することができたりなど 論理的な美しさ と 利便性 をうまく両立させているなと感じます。
前置記法も中置記法もそれぞれのメリットがあるので両方使えるのが一番人間寄りですよね。Nim は流行りそうなのに流行ってなくて残念です。😅
27:00数学にも演算子→引数をとるもの多くありますね三角関数対数関数expライプニッツ記法の微分一般的な関数f(x)とかの記法もそれらも内側から処理していく(右から処理していく)のもLISPに似ています
処理→引数の順番であるべきと聞いても尚+3,5は変だろーと思っていたんですが、ExcelでSUM関数が同じ書き方であるにも関わらず、当たり前に使えていることに思い当たりました。はからずもLispの一端に触れていたんですね。
1:50実態を反映しない例えはこの番組のお家芸なので歓迎です❗️
関数と引数は、動詞と目的語でいいんじゃないかな
ポーランド記法は自然言語(動詞+目的語)。逆ポーランド記法はスタックマシン。1+2=は算盤。算盤は最初に置いた数に次の数を作用させる。電卓の場合は逆ポーランドが論理的に最適。ポーランドは関数fxで統一。どれにも合理性は有る。
16:34 形式意味論を勉強してる人にLispの話をするものすごく稀有な状態笑
Lispの「+ 3 5」は,関数や引数のくだりも含めてExcelの「=sum(3,5)」に通ずるものを感じた.
集合と真偽値だけとかそんなわけ、とか思ったけど、よくよく考えると大抵のプログラミング言語の「型」もそうなっているように思えた。「整数」っていう集合の中に 0 とか 1 とか 2 とか 256 っていうのがあって、「文字」っていう集合の中に 'a' とか 'Z' とか 'あ' がある、みたいな。ユーザー定義する型やクラスも複数の要素からなる集合なわけだし。形式意味論面白そう。
急に2人の分野がシナジーし始めてコレを聴きたかったんよって粋に入りましたね。でも「ブーリアン」「へぇ~」はちゃんと拾ってよとも思ったw
数学だと3+5+8のことは+(3,+(5,8))と書きたくなるところですね20:13 論理学や数学基礎論、デジタル回路とかの文脈だと真理値が普通だと思います。意味論でもそうなんですね。でも、プログラミング言語のboolean型の文脈だと真偽値が使われるみたいですね。両者は同じものを指していてどちらも正しそうです
Lisp初学者はまずevalを作るのあるあるですね言語設計がシンプルだからできること
26:53 大学の厳密な数学では定義の部分ではLispと同じ書き方がされますよ例えば、足し算の定義の部分で、 (x,y) を引数として、z を返す関数を考えて、それの略記として z = x + y と書く みたいな感じですこの動画でいう自然言語的な書き方はあくまでも略記という扱いです
32:57 「Lispは自然言語的」って言ってますけど、「Lispは数学的」もしくは「Lispは非自然言語的」では?
22:00 過去の嶋村先生と福田先生のゲスト回でも嶋村先生がいってましたよね。
あからさまな信者なのに信仰をはぐらかそうとするのコントのフォーマットとして優秀すぎる
そうなんだよ!int や String とかは、演算子を「わざわざ用意」してくれてるんだよ!!!俺もLispやったほうがいいのか…?
lispはvso語順と言うと水野さんにはわかりやすいかと
Lispは未経験なのですが、昔読んだアルゴリズムとデータ構造の本で扱っていたSchemeならそこそこ触っていました。シンプルでいいですよね。今時の言語でコードを書いているとき、たまにもどかしくなるときあります(笑)
真偽値より真理値の方が情報系だけどなれてるな 論理回路とか
Lispはやったことないけど、S式信者だし、逆ポーランド記法信者ですLispもやってみたくなりました
S式ってLISP発祥だと思ってたんですけど、LISP以外でS式って出てくるんですか?
「手書きできない」: Lispが作られた頃の計算機はインタラクティブにコードを打ち込めないので、紙に手書きでコード書いてからパンチカードに穴開けて計算機に読み込ませてたんですが、その時に手書きで書いてたのは PLUS[3;5] みたいな表記でした。それをパンチカードに打つ時に(PLUS 3 5)に直してたのです。
Forth を少しかじってもらって感想を聞きたいですね. Forth は 3 5 + です
90分×15コマ=22.5時間、8時間5日=40時間ですから、通年の講義や1週間程度の研修があれば、こんな到達点が待っているといえる!?
英文法的にもadd 3 and 5 とか add 3 to 5の方が自然だし、実際会話の中でこちらの方が使われる。自然言語は+ 3 5の方を選択している。小学校数学は例外。
水野さんすごい…形式的意味論はプログラミング言語にも密接に関わってきますよね僕はよくわからないですが
文法が少ないということは、scheme寄りですかね
「Lispすげー!」って言ってる初学者を見ると、「俺にもあんな頃があったな〜」と生暖かい気持ちになります
数学の数式の記述ルールが「数学的」ではなくて「工学的」というのがおもしろいですね。数学の数式がポーランド記法なら、演算子の優先順位は不要で、括弧による優先順位の切り替えも不要になってルールがすっきりしますね。(括弧が増えて読みにくくはなりますが)オブジェクト指向言語で組み込み演算子のオーバーロードを知った時、数学の演算子と関数の呼び出しルールの違いが美しくないなぁと思っていました。
相変わらず、米欄が本体
30:12 堀元さんがアセンブリ言語では"+35"に翻訳されているとおっしゃっているのは"ADD レジスタ0, 5"のような命令のことだと思うのですが、その前に"MOV レジスタ0, 3”のようにレジスタに値を格納する処理が入るためやっぱり"3+5"が正しいのではないかと個人的には思いました
Lisp2を見つけて、初回からみようと思ってたんだけど、Lisp0が存在したらどうしようっていうよくない考えが脳裏によぎるようになってしまった
状態遷移がシンプルで構文解釈機が作りやすい。これって自然言語に当てはめるとどうなるのかな。たとえば冠詞は解釈を助けている?
ゆる言語学ラジオの形式意味論シリーズ待ってます!(あるいは言語哲学シリーズでも可)
概念も、オブジェクトだよ。今この世の中は、オブジェクトだらけ。
Land on Lispが参考文献の最初にあげられているので、このLISPはCOMMONLISPですかね。Schemeなら分かった気になるのに40時間も必要ないような気もしなくもなくもない。
次回も目玉を増やして楽しみにしています
13:23音韻論の音韻規則と制約の話を思い出したあれも最少まで突き詰めると宗教化しそう
Lispも有理数や複素数では中置記法を採用してるのだから、あまり中置記法をクサしすぎないほうが良いのでは
そういう意味では、CommonLispってかなり汚いですよね。実用的にして結果ってのは理解してるし、嫌いでもないけど。
足し算の‘+’は二項演算なので、引数は2であるべき思います。(+ 1 2 3)ではなくて(+ (+ 1 2) 3)とあるべきではありませんか?別の言語では(+) 1 2 3はエラーになり、(+) ((+) 1 2) 3 は計算するというものも有ります。Lispの構文が悪いという意味ではなくて(+ 1 2 3)に対する水野さんの質問に肯定した直後に小学校で習った’+’を例に出した説明と食い違っている気がして違和感を感じました。とはいえ今回も面白く拝見させて頂きました。
Lispでの「+」は演算子でありません。単なる関数名ですよ。(関数を持ったアトム)つまり、二項とかは関係ありません。
@@yakushima1 リプライありがとうございます。やっと突っ込みが入りましたね。Lisp の + は haskell の foldl1 (+) と等価と認識していますが、動画中に学校で習う足し算と比較した上で、関数としての挙動を肯定されていたので、混乱を避けるためにもう一言説明が有った方が良いなと思ってのコメントでした。先日、ゆる学徒ハウス別館に「プログラミングの穢れ」という動画が配信され、とても共感が持てる内容で楽しめましたのでお勧めです。同チャネルで Lisp 関連を取り上げたものの 3 回目に当たるものだと思います。
この文脈で読むと逆に先頭に書くはずの関数を2番目に持ってくるのがUFCSですね
3+ 5 + 8 はポーランド記法だと+ 3 + 5 8 (こっちが素直?)+ + 3 5 8+ 演算子がふたつスタックに入ってこないと2回加算が走らない。これも学校の課題で実装させられた。
逆・逆ポーランド法のことを正ポーランド法っていう派閥もあるんですね!
ルールを最小化したいなら四則演算記号を使ったポーランド記法なんか廃止して関数だけにしろってマックのJKが言ってた
ゆる言語ラジオのどこかの回で言っていた飲み会で監修者の先生にプログラミング言語について問われて困った話に繋がるような気がして次回期待してます
集合の全体は集合として扱えない(ことくらいお二人はご存じの可能性高そう)けど本大丈夫そうっすか
lisperとしか付き合いたくないって人は地球平面論者より貴重そう
「留保」という言葉、私も「誤解を招かないように補足しておくこと。また、誤解を招く表現を言わないようとどまること。」という意味で運用することがあるけど、なぜか「留保 意味」でググってもその意味が出てこない……
数列の一般項ってan + k (a,kは整数でnは自然数)って表記するけどkに対してaにnかけたものを足すって考えたらちょっとだけ 処理 対象 の形なんかなan + k って n の項を前に置くってのは慣習的なものらしいし
話されてる計算箇所については、addみたいな関数使えば同じじゃね
Resoniteっていうメタバースが敷居高そうと思われがちでユーザー少もないけど中にいる人は熱狂的なユーザーが多くて、初心者さんとかがくるとみんなが手取り足取り教えてくれる感じがLispに似てると思った
少数のファンコミュティ―はどこもそうなんでしょうね。人工言語アルカみたいになることだけは避けたい。
【参考文献】
◯Land of Lisp
www.valuebooks.jp/bp/VS0036813874
◯はじめてのLisp関数型プログラミング
www.valuebooks.jp/bp/VS0003745575
◯◯ポール・グレアム『Lispの起源』有志による日本語訳
masatoi.hateblo.jp/entry/20151210/1449948614
【サポーターコミュニティへの加入はこちらから!】
yurugengo.com/support
【おたよりフォーム】
forms.gle/BLEZpLcdEPmoZTH4A
※皆様からの楽しいおたよりをお待ちしています!
数学寄り:より正確に簡潔に書くことを目的として、厳密性を追求する
工学寄り:人間が扱いやすくなることを目的として、可読性を追求する
ということか
そんな気がしますね〜
工学は人間の実用のための学問で例外的ルールが多いのもそっくりだと思いました
数学より理学のほうが表現的に良いのではなんて思ったり
熱狂的な信者はね意識してるかは別として沼にはめてくるんです。だから親切だし丁寧だしフレンドリーなんです。
指数対数を習うときの難しさの原因は語順だと思ってます
- や÷なら前に来てたはずの数が、logや√の後に来るんですよね
こんなに演算間で語順が統一されてないのに、なんで理系の人がこれを許せるんだろうとずっと思ってました
コメント欄がLispの合理性を力説する人が多くてびっくり!
素晴らしい言語なんですね!
僕はC++勉強するのでここで!それじゃ!
rustやろうぜ
明らかにヤバいやつから逃げるムーブ
笑
正直、Lispのとっつきづらさは概念の難しさもありますが、Lisperの人たちの「Lispは神の言語」的な冗談なのか本気なのかよくわからないことを言ってる感じのコミュニティの雰囲気が怖くて近づきたくないってのも感じてしまいます
C++ の場合、演算子も [クラスのインスタンス]->[メンバ関数]->[引数] という記法に基づいていて
「3+5」は(概念的にですが)以下の様に解釈されるようです。
①3 を初期値としたインスタンスの作成
②そのインスタンスのメンバ関数「+」に引数 5 を渡す
③メンバ関数「+」は、自身に 5 を足した値を戻り値として返す
演算子をオーバーロードしてみると、この概念が分かるようになりますが、ややこしいことには変わりないです。
Z80 アセンブラの「SUB s」(アキュムレータの値から s を引いてアキュムレータに入れる)の命令文に似ていると思えば、分かりやすい?
31:42 「コンピュータは旧約聖書の神に似ている 規則は多く慈悲はない」 ーJoseph Campbellー
他の言語だと 1 + 2 * 3 って書いた時に処理順が実は処理系依存になったりする、もちろん常識的にわかるけど
Lispの場合だと (+ 1 (* 2 3)) という記載となり処理順に曖昧さがない
そして四則演算の記号も処理系が勝手に処理することがなくなるため関数名等のシンボルにハイフン(-)が使えたりする
ハイフン(-) は一番の敵で、引き算だったりマイナス値として扱わないといけなかったりするのでかなり面倒
すげぇ!そういうことか!
プログラミング言語やったことないが、凄さは分かった!
+ 3 5は、plus(3 , 5)の省略記法だと考えたら超わかりやすい、というかそもそもPython書いてるときもKotlin書いてるときも頭の中ではずっとそう思ってた
Cとかで演算子オーバーロードをやると、演算子も引数をとるただの関数なんだっていう意識が芽生えたなー
それ聞いてて自分も思ったwC#だと自作クラスの四則演算をoperatorのオーバーロードで定義しなおせるし、+ 3 5の方が超自然
Kotlinだと中置記法を作れる`infix fun`があるのは目鱗だった`3.plus(5)`= `3 plus 5`
人間としてはinfixの形式のほうが読みやすいからなー
ExcelのSUM関数なんかはまさにその書き方ですね
SUM関数の場合、値そのものよりセル番号やセル範囲を引数にすることの方が多いですが
「3+5」、日本語だと「3と5を足す」で、云わば「3 5 +」だから、日本語には逆ポーランド記法は相性がいいと思う。
(2*(3+5) 、2に 3と5を足したものを掛ける → 2 3 5 + * )
(”逆”の逆で、言ってみれば、正の)ポーランド記法は日本語で考えると(むしろ)”逆”に感じるのかもしれない。
「3に5を足す」や「add 3 to 5」が自然言語的であって、3+5のような
infix notation が自然言語的というのは感覚的に違和感がありますね。
@@quux- 確かに"自然言語的”と言ってしまうのは違和感。なんだろうなぁ…ただ、「3 足す 5」と言い、「3+5」と表記するのにも慣れている自分もいる…、 ”日常的”、”慣れ親しんだ学校算数的” でもある…^^;
4:56 「潜入して見ないと...」プログラミング言語は大丈夫ですが、宗教ではやらないでください。島田裕巳先生の二の舞になります。
水野さんが「神が作ったものなら美しいはず」のところで、量子論について「神はサイコロを振らない」と言ったアインシュタインがオーバーラップしました
そろばんの読上算は、最初に「加えて」とか「引いては」とかで演算の種類提示して、その後は「〇円也、〇円也…」で数字を羅列して行くらしいので、Lisp的かつ自然言語的な計算方法ですね。
+3 5
って書き方は確かに一見わかりづらいけど
ExcelのSUM関数みたいなもんと思えば入ってきやすいですね
別分野から同じ話に近づいていく様がめちゃめちゃおもしろいですね。
真理値の話をして、booleanが通じないところとかおもしろかったです。
トキヒロさんも呼んでほしい😂
水野さんが頑なに、プログラミング言語の事をコンピュータ言語と言おうとするの好きです
Lispは(というかS式とマクロは)、実用的なプログラミング言語では隠蔽されている本質をダイレクトに見せてくれるので、初心者には一度Lispに触れてほしい(実用しろとは言わない)
Lispのキモは四則演算の表記法がどうこうではなく、コードとデータが同じ構造であるため自然な形で自己言及ができるところにあると思います。
ポールグレアム「Hei! Mr.Horimoto!」
堀元「ちょっとわからないですねぇ」
ポールグレアム「ネビッチ4」
冪乗もpower(2,10)と書いたりしますし、その延長でadd(3,5)があると見れば、表記揺れで+ 3 5があっても自然な気してきますね〜
形式意味論:全ては集合か真理値である
Lisp:全てはアトムかコンスセルである
沼への道は親切でできている
プログラミング言語は機械と人間を橋渡しするための手段なので、人間への優しさを忘れてしまったら本末転倒なんだよなー、とか思いつつ、次回を楽しみにしてます。
n個の整数を足すぞ、ってときに、 ns=[1,2,3,4]; ns.reduce((x,y)=>x+y, 0) みたいに書いてから、「いやいや + が複数引数取れよ」って思っちゃいますよね(?)
日本語は分かち書きをしないので、引数列をスペース区切りで記述するのに違和感を覚えやすいなって思います
中置記法はオブジェクト指向的な書き方だなとも思ったりします:1 + 2 - 3 = (1).add(2).sub(3)
Scala では 1.+(2).+(3) と書けますよ。
31:23 理科のテストで「三 容女 某」に見えて☓になった子いた。手書きスペース難しい問題漢字編。
文字を 横→木黄 みたいに横倍角相当に書く友人がいた。同類だ。
溶媒をそんな書き方するの?と思ったけど、確かに部首と旁の間と文字間のバランス感覚が弱い人もいるんでしょうね。でも、不正解にした先生は厳しいなぁ
ML系言語を触るとまた違う感想がでてきそう
26:53 数学だと f(x) 、sin x とか最大公約数もgcd(84,32) = 4 みたいにプログラミングの関数っぽい書き方になっていますよ~
プログラミング言語の形式的意味論入門っていう本があったきがします
Lispの方言の一つである、Schemeの言語仕様書には形式的意味論による定義が載っていたような。
処理は入力と出力に還元できるということに自力で気づくのに、学部で4年、社会人になってから2年プログラムを書いてようやく気づきました
是非Forthを40時間学んで下さい。逆ポーランド記法が如何に自然なのかが分かる。
動詞が最後に来るのは日本人にとって優しいのでは?
LISPだと、括弧から閉じ括弧までを切り出して、最初を関数その余を引数とする様に構文解析しなければいけない。
Forthだと、リテラル(数字・文字列)はスタックに積む、名前(ワード)だと関数として実行する。この規則だけでいい。パラメータをスタックからどれだけ使うかはワード(関数)に依存するので、構文解析の感知するところでない。
確かに逆ポーランド記法は日本語に直すと理解しやすいと学んだなぁ
3 4 +
で3と4を足すと言う日本語文法になるみたいな
FORTHを触るとカッコの有り難みを感じますね。
自動でインデントをつければ良いのかも知れないけど
@@essauouo5251
FORTH を学ぶとカッコが要らない有り難さを感じますw
(馴染みのない方のために:カッコはコメントで、主にスタック操作の仕様を書くために使われます)
昔はアセンブリ言語でプログラムを作ってたことを考えれば、プログラミング言語が自然言語寄りになっているのは当然ですね。人間が理解しやすいものを目指して作られたのが今のプログラミング言語ですから。生成AIにコードを書かせるというのはその究極の到達点かもしれません。
Lispはその流れの外というか、アセンブリ言語の記法を受け継いだような感じ・・・?
アンサイクロペディアのLISPのページめっちゃ好き
Pythonはオランダ人が作った...
dijkstraはオランダ人なので、コンピュータサイエンスはオランダ人が作ったと言っても過言
コンピュータサイエンスは蘭学だったのか
過言ではあるのか…
17:15 「処理を返す」から、高階関数の話が始まると思っちゃいました。まだでしたね。
でもLispの話ならば避けて通れないと思いますので、次回以降が楽しみです。
言語学とコンピュータ科学の間というとやはり自然言語処理の回を見てみたいです😃
8:06 日本も埋め立てをし過ぎたせいで「世界は神が作ったが、日本は日本人が作った」って言われてました
日本は埋立どころか、河川はほとんど「サイボーグ」状態で、「森林」も「野生動物」もかなりの比率で「家畜化」されてますよね。一番大きいのは、人間の「自己家畜化率」の進展度合いが「最先端」なところ。※個人の感想を念みます。
去年HSP3という言語のプログラムコンテストで、文字列で四則演算をするモジュールを作ったのですが、関数型言語もLispも全く知らない状態で作ったのがadd(p1,p2)のような記述でした。
四則演算も比較も関数で全て定義しましたが、何も知らない身ながら結局内部的な作りやすさも使い勝手も関数が最強なのだと思いました。
真理値と集合の2つしかない、というのは数学基礎論(公理的集合論)の立場と同じですね。
数学で扱うあらゆるモノは(写像や関係みたいなモノも)集合として構成可能であるという立場です。
今日初めてゆる学徒カフェにお邪魔します!
楽しんできてね😊
お、いいなあ
行ってらっしゃい
せっかくなので相席でお喋りしました!超楽しかったです!!
楽しまれたようで何よりです👍
3 + 5は自分のメンタルモデルでは、+関数の引数が中置されてるのではなく、3のメソッドaddに引数5を渡すことの特殊な書き方なんだなと気づきました
本筋には全く関係ないくらい非常に細かいこと言うと、C言語のforで()の後に来るのは文であって、{}がよく来るのは複数の文を単一の文と同じ扱いにする複文を表す記号だからってだけ。forで繰り返す内容が単一の文で表せるなら{}は要らない。
楽しみに待ってました
ぼくも!
たのまち
演算子オーバーロードできる言語は"5+3"の5をオブジェクトとして 5.plus(3) とメソッドチェーンぽく解釈されている印象です
むしろ
小学校の足し算をLISPに合わせて + 3 5 と表記すべき。
(過言である)
演算子というルール自体特殊、というのはHaskellなどからも読み取れますねー
関数にカッコつけると演算子にできる、逆に演算子にカッコつけると関数にできたり
アセンブラは、操作(ニーモニック;関数とか機能に相当)の次にレジスタ(パラメータ)や番地(ジャンプ先ラベル)の順番で統一ですよね。例えば
ADD X Y
戻り値(ALUの結果)の格納レジスタが固定で特殊だけど。
Booleanの訳は真偽値でもいいと思うけど、教科書的には真理値かと思います。
真理値表とはいうけど、真偽値表とはあまり言わない。
Haskellなら関数名をバッククォートで囲めば中置記法として使えるから過激派も安心
11:21
「3 + 5 + 8」 が「+(3 5 8)」になるのですか?「+(3 +(5 8))」等ではなく?
それは数学的にはどのように定義(解釈)されるのだろう・・・?
後者なら例えば「+:R2 -> R; +(x y):=x+y」みたいな感じだと思うのですが、
前者(引数の数(次元)が任意)だと、数学的には、めんどくさい(きれいじゃない)定義になりそう。。。
まあ、見た目の問題だけといえばそうなのですが。
lispわかんないですが+という記号がsum関数として解釈されてるかも
それなら+ 3 5の場合の処理も変わらないので拡張として便利かと
@user-nn7nh1jl2c
そうですね。便利さ、という観点ではその通りだと思います。
ただ、数学的な美しさ、と言われるとどうか、という話ですね。
ざっとは以下のような定義になるかと思うのですが
(+だと見にくいのでfにしています)、
突然出てくるnとか気持ち悪くないですかね…?
for ∀n ∈ N f:R^n -> R: f(r1,r2,...,rn) := r1 + r2 + ... + rn
まあ、他にも書き方はいろいろあるとは思うのですが。
nim言語というプログラミング言語では
UFCS( f(a, b) と a.f(b) を同じ意味を持つ別表記とする ) があったり
`+`(1, 2) と 1 + 2 を同一視することができたり
など 論理的な美しさ と 利便性 をうまく両立させているなと感じます。
前置記法も中置記法もそれぞれのメリットがあるので両方使えるのが一番人間寄りですよね。Nim は流行りそうなのに流行ってなくて残念です。😅
27:00
数学にも演算子→引数をとるもの多くありますね
三角関数
対数関数
exp
ライプニッツ記法の微分
一般的な関数f(x)とかの記法も
それらも内側から処理していく(右から処理していく)のも
LISPに似ています
処理→引数の順番であるべきと聞いても尚+3,5は変だろーと思っていたんですが、ExcelでSUM関数が同じ書き方であるにも関わらず、当たり前に使えていることに思い当たりました。はからずもLispの一端に触れていたんですね。
1:50
実態を反映しない例えはこの番組のお家芸なので歓迎です❗️
関数と引数は、動詞と目的語でいいんじゃないかな
ポーランド記法は自然言語(動詞+目的語)。逆ポーランド記法はスタックマシン。1+2=は算盤。算盤は最初に置いた数に次の数を作用させる。電卓の場合は逆ポーランドが論理的に最適。ポーランドは関数fxで統一。どれにも合理性は有る。
16:34 形式意味論を勉強してる人にLispの話をするものすごく稀有な状態笑
Lispの「+ 3 5」は,関数や引数のくだりも含めてExcelの「=sum(3,5)」に通ずるものを感じた.
集合と真偽値だけとかそんなわけ、とか思ったけど、よくよく考えると大抵のプログラミング言語の「型」もそうなっているように思えた。
「整数」っていう集合の中に 0 とか 1 とか 2 とか 256 っていうのがあって、「文字」っていう集合の中に 'a' とか 'Z' とか 'あ' がある、みたいな。
ユーザー定義する型やクラスも複数の要素からなる集合なわけだし。
形式意味論面白そう。
急に2人の分野がシナジーし始めてコレを聴きたかったんよって粋に入りましたね。
でも「ブーリアン」「へぇ~」はちゃんと拾ってよとも思ったw
数学だと3+5+8のことは+(3,+(5,8))と書きたくなるところですね
20:13 論理学や数学基礎論、デジタル回路とかの文脈だと真理値が普通だと思います。意味論でもそうなんですね。でも、プログラミング言語のboolean型の文脈だと真偽値が使われるみたいですね。両者は同じものを指していてどちらも正しそうです
Lisp初学者はまずevalを作るのあるあるですね
言語設計がシンプルだからできること
26:53 大学の厳密な数学では定義の部分ではLispと同じ書き方がされますよ
例えば、足し算の定義の部分で、 (x,y) を引数として、z を返す関数を考えて、それの略記として z = x + y と書く みたいな感じです
この動画でいう自然言語的な書き方はあくまでも略記という扱いです
32:57 「Lispは自然言語的」って言ってますけど、「Lispは数学的」もしくは「Lispは非自然言語的」では?
22:00 過去の嶋村先生と福田先生のゲスト回でも嶋村先生がいってましたよね。
あからさまな信者なのに信仰をはぐらかそうとするのコントのフォーマットとして優秀すぎる
そうなんだよ!
int や String とかは、演算子を「わざわざ用意」してくれてるんだよ!!!
俺もLispやったほうがいいのか…?
lispはvso語順と言うと水野さんにはわかりやすいかと
Lispは未経験なのですが、昔読んだアルゴリズムとデータ構造の本で扱っていたSchemeならそこそこ触っていました。
シンプルでいいですよね。
今時の言語でコードを書いているとき、たまにもどかしくなるときあります(笑)
真偽値より真理値の方が情報系だけどなれてるな 論理回路とか
Lispはやったことないけど、S式信者だし、逆ポーランド記法信者です
Lispもやってみたくなりました
S式ってLISP発祥だと思ってたんですけど、LISP以外でS式って出てくるんですか?
「手書きできない」: Lispが作られた頃の計算機はインタラクティブにコードを打ち込めないので、紙に手書きでコード書いてからパンチカードに穴開けて計算機に読み込ませてたんですが、その時に手書きで書いてたのは PLUS[3;5] みたいな表記でした。それをパンチカードに打つ時に(PLUS 3 5)に直してたのです。
Forth を少しかじってもらって感想を聞きたいですね. Forth は 3 5 + です
90分×15コマ=22.5時間、8時間5日=40時間ですから、通年の講義や1週間程度の研修があれば、こんな到達点が待っているといえる!?
英文法的にも
add 3 and 5 とか add 3 to 5
の方が自然だし、実際会話の中でこちらの方が使われる。
自然言語は+ 3 5の方を選択している。
小学校数学は例外。
水野さんすごい…
形式的意味論はプログラミング言語にも密接に関わってきますよね
僕はよくわからないですが
文法が少ないということは、scheme寄りですかね
「Lispすげー!」って言ってる初学者を見ると、「俺にもあんな頃があったな〜」と生暖かい気持ちになります
数学の数式の記述ルールが「数学的」ではなくて「工学的」というのがおもしろいですね。
数学の数式がポーランド記法なら、演算子の優先順位は不要で、括弧による優先順位の切り替えも不要になってルールがすっきりしますね。(括弧が増えて読みにくくはなりますが)
オブジェクト指向言語で組み込み演算子のオーバーロードを知った時、数学の演算子と関数の呼び出しルールの違いが美しくないなぁと思っていました。
相変わらず、米欄が本体
30:12 堀元さんがアセンブリ言語では"+35"に翻訳されているとおっしゃっているのは"ADD レジスタ0, 5"のような命令のことだと思うのですが、その前に"MOV レジスタ0, 3”のようにレジスタに値を格納する処理が入るためやっぱり"3+5"が正しいのではないかと個人的には思いました
Lisp2を見つけて、初回からみようと思ってたんだけど、Lisp0が存在したらどうしようっていうよくない考えが脳裏によぎるようになってしまった
状態遷移がシンプルで構文解釈機が作りやすい。これって自然言語に当てはめるとどうなるのかな。たとえば冠詞は解釈を助けている?
ゆる言語学ラジオの形式意味論シリーズ待ってます!
(あるいは言語哲学シリーズでも可)
概念も、オブジェクトだよ。
今この世の中は、オブジェクトだらけ。
Land on Lispが参考文献の最初にあげられているので、このLISPはCOMMONLISPですかね。Schemeなら分かった気になるのに40時間も必要ないような気もしなくもなくもない。
次回も目玉を増やして楽しみにしています
13:23音韻論の音韻規則と制約の話を思い出した
あれも最少まで突き詰めると宗教化しそう
Lispも有理数や複素数では中置記法を採用してるのだから、あまり中置記法をクサしすぎないほうが良いのでは
そういう意味では、CommonLispってかなり汚いですよね。実用的にして結果ってのは理解してるし、嫌いでもないけど。
足し算の‘+’は二項演算なので、引数は2であるべき思います。(+ 1 2 3)ではなくて(+ (+ 1 2) 3)とあるべきではありませんか?別の言語では(+) 1 2 3はエラーになり、(+) ((+) 1 2) 3 は計算するというものも有ります。Lispの構文が悪いという意味ではなくて(+ 1 2 3)に対する水野さんの質問に肯定した直後に小学校で習った’+’を例に出した説明と食い違っている気がして違和感を感じました。とはいえ今回も面白く拝見させて頂きました。
Lispでの「+」は演算子でありません。単なる関数名ですよ。(関数を持ったアトム)
つまり、二項とかは関係ありません。
@@yakushima1
リプライありがとうございます。やっと突っ込みが入りましたね。Lisp の + は haskell の foldl1 (+) と等価と認識していますが、動画中に学校で習う足し算と比較した上で、関数としての挙動を肯定されていたので、混乱を避けるためにもう一言説明が有った方が良いなと思ってのコメントでした。
先日、ゆる学徒ハウス別館に「プログラミングの穢れ」という動画が配信され、とても共感が持てる内容で楽しめましたのでお勧めです。同チャネルで Lisp 関連を取り上げたものの 3 回目に当たるものだと思います。
この文脈で読むと逆に先頭に書くはずの関数を2番目に持ってくるのがUFCSですね
3+ 5 + 8 はポーランド記法だと
+ 3 + 5 8 (こっちが素直?)
+ + 3 5 8
+ 演算子がふたつスタックに入ってこないと2回加算が走らない。
これも学校の課題で実装させられた。
逆・逆ポーランド法のことを正ポーランド法っていう派閥もあるんですね!
ルールを最小化したいなら四則演算記号を使ったポーランド記法なんか廃止して関数だけにしろってマックのJKが言ってた
ゆる言語ラジオのどこかの回で言っていた
飲み会で監修者の先生にプログラミング言語について問われて困った話に繋がるような気がして
次回期待してます
集合の全体は集合として扱えない(ことくらいお二人はご存じの可能性高そう)けど本大丈夫そうっすか
lisperとしか付き合いたくないって人は地球平面論者より貴重そう
「留保」という言葉、私も「誤解を招かないように補足しておくこと。また、誤解を招く表現を言わないようとどまること。」という意味で運用することがあるけど、なぜか「留保 意味」でググってもその意味が出てこない……
数列の一般項ってan + k (a,kは整数でnは自然数)って表記するけど
kに対してaにnかけたものを足すって考えたらちょっとだけ 処理 対象 の形なんかな
an + k って n の項を前に置くってのは慣習的なものらしいし
話されてる計算箇所については、addみたいな関数使えば同じじゃね
Resoniteっていうメタバースが敷居高そうと思われがちでユーザー少もないけど
中にいる人は熱狂的なユーザーが多くて、初心者さんとかがくるとみんなが手取り足取り教えてくれる感じがLispに似てると思った
少数のファンコミュティ―はどこもそうなんでしょうね。
人工言語アルカみたいになることだけは避けたい。