2025プログラミング言語論 クロージャ
Resumo
TLDRこの講義では、プログラミング言語におけるクロージャの概念について説明されています。クロージャは、関数がその外部の変数を参照できるようにする機能であり、オブジェクト指向プログラミング(OOP)と密接に関連しています。講義では、OOPの歴史や代表的な言語(C++、Java、Pythonなど)についても触れられ、特にクロージャがどのようにオブジェクト指向と関連しているか、またその実装方法について詳しく解説されています。
Conclusões
- 💡 クロージャは関数が外部変数を参照できる機能
- 📚 オブジェクト指向プログラミング(OOP)の歴史を学ぶ
- 🛠️ 代表的なOOP言語(C++、Java、Python)を理解する
- 🔍 クロージャとOOPの関係を探る
- 🔄 クロージャの利点は再利用性の向上
Linha do tempo
- 00:00:00 - 00:05:00
この講義では、プログラミング言語の概念であるクロージャについて説明します。クロージャは、オブジェクト指向プログラミング(OOP)と関連があり、特にスモールトークなどの言語で重要な役割を果たしています。
- 00:05:00 - 00:10:00
オブジェクト指向プログラミング(OOP)は、プログラムの再利用性を高めるための手法であり、C++やJavaなどの言語がその代表例です。OOPの歴史や、スモールトーク、C++、Java、Rubyなどの言語の関係についても触れられています。
- 00:10:00 - 00:15:00
オブジェクト指向の考え方は、グラフィカルユーザーインターフェース(GUI)の設計と相性が良く、メッセージとパラメーターのやり取りを通じて、オブジェクトがどのように相互作用するかを説明しています。
- 00:15:00 - 00:20:00
クロージャは、オブジェクト指向とは独立した概念であり、スキームやリスプなどの言語でサポートされています。クロージャは、関数が他の関数を返すことを可能にし、プログラムの再利用性を高める手段として機能します。
- 00:20:00 - 00:29:54
クロージャの内部状態を持たせることも可能であり、オブジェクト指向プログラミングのオブジェクトとして扱うことができます。クロージャの理論的な側面を理解することで、プログラミングの幅が広がることを期待しています。
Mapa mental
Vídeo de perguntas e respostas
クロージャとは何ですか?
クロージャは、関数がその外部の変数を参照できるようにする機能です。
オブジェクト指向プログラミングとは?
オブジェクト指向プログラミングは、データとその操作を一つの単位(オブジェクト)として扱うプログラミングのスタイルです。
クロージャはどの言語でサポートされていますか?
クロージャは、スキーム、リスプ、ハスケルなどの言語でサポートされています。
クロージャとオブジェクト指向の違いは何ですか?
クロージャは関数のスコープに関連する概念であり、オブジェクト指向はデータとその操作をオブジェクトとしてまとめる考え方です。
クロージャの利点は何ですか?
クロージャを使用することで、関数の外部状態を保持し、再利用性を高めることができます。
Ver mais resumos de vídeos
2025プログラミング言語論 逐次実行・条件分岐・繰り返し
一口气看完系列《鬼灭:开局跟甘露寺提亲》穿越了自己的相亲对象竟然是甘露寺蜜璃相亲!等等,那这里岂不是鬼灭之刃的世界!?#鬼滅の刃#有声漫画#爽文#无敌#穿越
【スターゲートがAIの利用爆増を支える】オープンAI・アルトマンCEO/トランプ氏は直感で良い判断を下す/1時間で100万ユーザー増「ジブリ風」画像生成で浮上した課題/発端はサプライチェーンの限界
【仕事は食われるがコンサルは足りない】アクセンチュアAIセンター長・保科学世/「リスキルが必要な社員39%」もAIが算出/プレゼン資料を“秒”で作る極秘AIをデモ公開【CROSS DIG 1on1】
2025デザイン情報学I ブルーの歴史
ウクライナから日本に来て3年 「架け橋になりたい」祖国と家族を思いながら夢を追う女性の奮闘記【テレメンタリー】
- 00:00:02え、皆さんおはようございます。え、長崎
- 00:00:05大学情報出高学部かです。えっと、画面
- 00:00:09共有しますね。はい。え、プログラミング
- 00:00:13言語論の、ま、オンラインオンデマンド
- 00:00:17講義になります。えっと、今回の講義では
- 00:00:21、あ、クロージャについてね、え、お話を
- 00:00:24していきます。クロージャーというのは、
- 00:00:28ま、プログラミングにおける、ま、1つの
- 00:00:30概念、え、であるわけなんですが、
- 00:00:34ちょっと馴染みのない言葉かもしれません
- 00:00:37。あの、1度ね、え、対面講義では話をし
- 00:00:41ているところなのですが、ま、改めて、え
- 00:00:44、このデマンドで、え、お話をしておこう
- 00:00:49と思います。一部ね、内容重なりますが、
- 00:00:52あ、ま、復讐と思って聞いてもらえたら
- 00:00:54幸いです。
- 00:00:57えっと、皆さんはね、あの、おそらく他の
- 00:01:01授業あるいは演習でオブジェクト思考
- 00:01:04プログラミングという概念を習っていると
- 00:01:08思います。オブジェクトオリエンテッド
- 00:01:10プログラミング
- 00:01:12の略で、あのOOPと書いて読むことも
- 00:01:17多いです。なので、ま、オブジェクト思行
- 00:01:20プログラミング言語のことをウープ言語と
- 00:01:22いう風に省略して読むこともあります。
- 00:01:26ウープ言語っていうのはあの
- 00:01:30もう今ねえーよく使われている言語あの
- 00:01:35なんかトップ10とかトップ20とか出て
- 00:01:38くる言語の中ではC言語以外おそらく全部
- 00:01:42もうウプ言語に置き変わってるんじゃない
- 00:01:45かなと思います。で、え、ま、代表的な
- 00:01:51ものをリストアップしたんですが、ま、
- 00:01:53あの、
- 00:01:55最初のウープ言語っていうのは、ま、歴史
- 00:01:58上スモールトークかなと思います。ま、
- 00:02:03ひょっとしたらスモールトークより早くう
- 00:02:06、ま、オブジェクト思考という考え方を
- 00:02:09持ってたものはあるかもしれないんですが
- 00:02:11、ま、おそらくそのウープという言い方し
- 00:02:13たのもスモールトークだったんではないか
- 00:02:16なと思います。このスモールトーク、それ
- 00:02:19から、ま、少し遅れてだと思うんです。
- 00:02:21シミラーという言語があって、で、ま、
- 00:02:24現在はね、あまり名前聞くことはないかも
- 00:02:26しれないですが、あ、そのシミュラーが
- 00:02:30強く影響与えた言語がC++
- 00:02:33、え、です。で、C++
- 00:02:36が、あ、さらにこう周りに影響与えていく
- 00:02:39わけなんですが、それはC#だったり
- 00:02:41Javだったり、それからC言号を
- 00:02:44オブジェクト思考に拡張しようとしたもの
- 00:02:47には他にOBジェクティブCと、これ
- 00:02:49Appleがあの採用したことで有名に
- 00:02:53なった言語ですね。ま、C系の言語として
- 00:02:56は、あ、あのC言語のスーパーセットとし
- 00:03:00て書かれたもの、あ、作られたもの。C
- 00:03:03言語のソース行動も一応は使える
- 00:03:07な、ほぼ使える形で実装されたものとして
- 00:03:10はC++とオブジェクティブCというのが
- 00:03:13、ま、2台流派になりますね。ま、元々は
- 00:03:16Appleではなくて、Nextステッと
- 00:03:18いう会社あ、が、えっと、さらに言うと
- 00:03:22そのステップストーンという会社があった
- 00:03:24んですが、あの、そこが開発したあ、もの
- 00:03:27です。え、追金まで、ま、現在はね、
- 00:03:29Swiftという言語に置き変わりつつ
- 00:03:31あるんですが、あ、追金まで、え、
- 00:03:34MacOSとかiOSとかiPadOSと
- 00:03:38かの収開発言語でした。え、JAVは、ま
- 00:03:42、+
- 00:03:44を非常に似た言語でC++の設計を反省し
- 00:03:49た反省という言い方はちょっと失礼かも
- 00:03:51しれませんが、あのシートの候補護完成を
- 00:03:54切り捨てることで、え、は言語的に、え、
- 00:03:57再設計したものになりますね。ま、その
- 00:04:01意味ではラストなんかはあの新しい世代の
- 00:04:06言語でこれもやはり広補完成を切り捨てる
- 00:04:10ことで、えー、ま、より理解しやすい言語
- 00:04:13になっていったというものですね。
- 00:04:17オブジェクトパスカルっていうのはね、
- 00:04:19あの、人気言語の中では出てくるんです
- 00:04:22けれども、オブジェクトパスカルという
- 00:04:25名前で認識はされてないかもしれないです
- 00:04:29ね。あの、Windowsの開発環境の
- 00:04:31デルファイ
- 00:04:33で使われていた言語で、あの、僕自身もね
- 00:04:37、以前使っていたことがあるんですが、あ
- 00:04:40、パスカルというね、非常に古い、ま、C
- 00:04:42言語並みに古いというか、C言語より古い
- 00:04:45言語をオブジェクト思考に拡張したもの。
- 00:04:48ま、ビジュアルベーシックなんかも今だと
- 00:04:50VB.NETですかね、あの、
- 00:04:55人気のある言語として名前が出てきます。
- 00:04:59おそらく皆さんが知ってる言語だと
- 00:05:02PYONなんかも、ま、典型的なウープ
- 00:05:04言語ですし、え、日本のね、松本幸博さん
- 00:05:10が設計されたルビーとかうん、ちょっと
- 00:05:14最近はあの人気下がってますかね、パール
- 00:05:18とかもオブジェクト思考源パール6から
- 00:05:22ですかね。え、オブジェクト思考取り入れ
- 00:05:24ています。え、JavaScript、
- 00:05:26エマスクリpトもオブジェクト思考の考え
- 00:05:29方を取り入れています。オブジェクト思行
- 00:05:32って元々はそのプログラムのね、再利用性
- 00:05:37という、ま、え、人が書いたプログラムを
- 00:05:41あるいは過去の自分が書いたプログラムを
- 00:05:43、ま、いかに上手に再利用できるかという
- 00:05:46ところに焦点が置かれていたんですが、
- 00:05:49C++とかオブジェクティブC、あ、
- 00:05:52オブジェティブCはちょっといいかな。
- 00:05:54C++とか、え、オブジェクトパスカルも
- 00:05:57あれかな?ちょっと違うかな。ちょっと今
- 00:06:01の言い方良くなかったですね。C+なんか
- 00:06:03はもう確実にあの
- 00:06:07プログラムの再利用性えということをお
- 00:06:12を念頭にオブジェクト思考という考え方
- 00:06:16導入していったんですがこれがあの
- 00:06:19スモールトークなんかもそうなんです
- 00:06:21けれどもあのグラフィカルユーザー
- 00:06:24インターフェイスの実装に非常に相性が
- 00:06:26いいとそれが人間の思考様式と非常に似て
- 00:06:29いるというのでスモールトークもそうです
- 00:06:31しオブジェCもC#もそれからJavも
- 00:06:36ですね。え、JavaScriptもそう
- 00:06:38ですね。え、オブジェクトパスカルもそう
- 00:06:41です。ビジュアルベーシックもそうです。
- 00:06:42あの、そういったあのグラフィカル
- 00:06:44ユーザーインターフェイスの設計のための
- 00:06:46言語としての側面も強くありました。これ
- 00:06:51、あの、次のスライドで、え、ま、数学
- 00:06:54における
- 00:06:57、あの、数式のちょっと特殊な解釈の話を
- 00:07:00しようと思うんですが、ま、それをあの、
- 00:07:02グラフィカルユーザーインターフェースに
- 00:07:03置き換えるとどうなるって話も、え、
- 00:07:05しようと思います。で、今日のメインの話
- 00:07:09はクロージャーで、あの、クロジャーって
- 00:07:12いうのは、えっと、オブジェクト思考
- 00:07:16とは、ま、独立に生まれた考え方、あ、な
- 00:07:20んですが、えっと、ま、これを、あの、
- 00:07:23ようにというのはこの表立だってサポート
- 00:07:25する言語としては、ま、スキームとか
- 00:07:27リスプ、ま、顧問リスプとかスキームは
- 00:07:29含めて、全部含めてリスプなんですけれど
- 00:07:32も、え、スキーム顧問リスプ、そして、え
- 00:07:34、その名もクロージャーというね、これも
- 00:07:37リスプ系の言語です。マスカラハスケル、
- 00:07:41ま、我々が勉強しているハスケルなんかも
- 00:07:43クロージャーをようにサポートしています
- 00:07:45。で、クロージャと同じこと主にウープ
- 00:07:48言語、あ、主なウープ言語でもできます。
- 00:07:51主なと書きましたが、ま、ほぼ全ての
- 00:07:53ウープ言語で、え、クロージャー、あの、
- 00:07:56クロージャーを書く公文はなくなかったと
- 00:07:59してもクロージャーと同じことはできます
- 00:08:02。あ、できるんだけど、ま、ちょっと書き
- 00:08:06づらいかなっていうことも、ま、授業後半
- 00:08:09で紹介できたらなと思っています。で、え
- 00:08:12、このオブジェクト思考の、ま、特に
- 00:08:15スモールトークに見られたちょっとこう
- 00:08:17極端なというか、あ、あ、なるほどてこう
- 00:08:21いう視点があるのかっていうね、あの見方
- 00:08:24を1つご紹介しておきます。え、この1+
- 00:08:282、ま、答えが3っていうのは、ま、どう
- 00:08:30でもよくて、で、え、この1+2っていう
- 00:08:34のが何が起こってるかっていうのを解釈
- 00:08:36する話です。
- 00:08:41はい。えっと、ハスケルを勉強してきたり
- 00:08:44とか、ま、あるいはも数学の授業で散々
- 00:08:46聞いてるかもしれませんが、これプラスは
- 00:08:482公演算子
- 00:08:50ですが、2公円算子と2匹数関数っての
- 00:08:53本質的に同じものですから、え、1+2と
- 00:08:58いうのは、え、
- 00:09:011と2を足すという2つの引数を持つ関数
- 00:09:06プラス、ま、十字でもいいや。え、関数
- 00:09:09十字が、あ、1と2という2つの引数を
- 00:09:12取っているという風にも解釈できるわけ
- 00:09:14ですね。
- 00:09:17で、え、ところがこれスモールトークの
- 00:09:22設計者の発想だとこれこういう読み方をし
- 00:09:26ます。1というオブジェクトがいます。1
- 00:09:30という人物がいます。そこにプラスという
- 00:09:33メッセージが届きます。お手紙が届くん
- 00:09:36ですね。にプラスというメッセージが届い
- 00:09:38て、そのメッセージには2という、え、
- 00:09:43パラメーターがついている。1がメ、あ、
- 00:09:461が、あ、レシーバーと言ってメッセージ
- 00:09:49を受け取る人でプラスがメッセージで、
- 00:09:52そのメッセージには2というパラメーター
- 00:09:54がついてきてるうという風に解釈をします
- 00:09:58。え、1のところに、え、プラスという
- 00:10:03メッセージが届けられて、そこに2という
- 00:10:05パラメーターがついてくる。で、これ何が
- 00:10:09そのグラフィカルユーザー
- 00:10:11インターフェースの設計と相性が良かった
- 00:10:13かというと、1が画面上のボタンだと思っ
- 00:10:16てください。え、1番ね、ボタンでプラス
- 00:10:19がなんかこう、え、イベントが発生したよ
- 00:10:24。例えばボタンがクリックされたあるいは
- 00:10:28タップされたというメッセージで何回
- 00:10:31タップされたっていうのがパラメーター。
- 00:10:33例えばダブルタップダブルクリックだっ
- 00:10:35たらあ、2という数字がついてくるし、え
- 00:10:38、1回だけのタップ、1回だけのクリック
- 00:10:41だったら1という数字がついてくるていう
- 00:10:44風に読むことができますね。え、
- 00:10:48レシーバーがこれたまたま自然数だった
- 00:10:51けれども、レシーバーが、あ、画面上の
- 00:10:54ボタンで、で、メッセージが、え、プラス
- 00:10:57ではなくてこうタップされたというね、
- 00:11:00メッセージだったりで、え、パラメーター
- 00:11:03としてパラメーターはあってもなくても
- 00:11:05良くて、もしあったとしたらその押された
- 00:11:07回数だったりとかっていう風に解釈すると
- 00:11:10オブジェクト思考的なものの見方、
- 00:11:13オブジェクト思考のものの見方というのは
- 00:11:15、ええ、グラフィカルユーザー
- 00:11:19インターフェースの設計と非常に相性が
- 00:11:21いいということになりますね。あの、もう
- 00:11:241度
- 00:11:26、え、説明をすると、ま、従来の1+2と
- 00:11:30いうのは、あの、当たり前に考えればこれ
- 00:11:34ファンクションコール関数呼び出しであ、
- 00:11:37お1マ2と2匹数の関数呼び出しと全く
- 00:11:42同じことです。で、あの、Python
- 00:11:46始め、もうほとんどの言語が1+2という
- 00:11:48書き方を、え、ま、認めています。
- 00:11:52ハステルもそうですね、1+2という書き
- 00:11:54方を認めています。で、え、スキームとか
- 00:11:58リスプとかのリスプ系言語リスプって書い
- 00:12:01てるけど、ま、あのスキームもね、リスプ
- 00:12:03の一緒なので、ま、これは顧問リスプと
- 00:12:05書くべきだったんでしょうが、ま、リスプ
- 00:12:08系言語では、あ、このこういう書き方が
- 00:12:13許されていないので、こういう風にプラ
- 00:12:1512という風に書きます。これも関数
- 00:12:18呼び出しと同じですね。あの、2つの引数
- 00:12:20をプラスという関数に渡しているという
- 00:12:23ことになります。で、ハスケルは1+2
- 00:12:26って書き方許されてますが、これはただの
- 00:12:28シンタクスシュガーで、え、シンタクス
- 00:12:31シュガーというのは、あの、言い回しを
- 00:12:33変えただけで実際には括こ閉時という関数
- 00:12:37があって、え、1と2を引数として読んで
- 00:12:40いるということです。で、もちろん
- 00:12:44PythonでもCでもこの2引数の関数
- 00:12:48の呼び出しに置き換えることは用意にでき
- 00:12:51ます。はい。
- 00:12:55で、一方のスモールトークの考え方、え、
- 00:13:001というオブジェクトに1という人物、1
- 00:13:03というレシーバーにADというメッセージ
- 00:13:06で、ADというメッセージに、ま、この
- 00:13:07場合だとプラスですね。プラスという
- 00:13:09メッセージに、えっと、2という
- 00:13:11パラメーターがついてくるというような
- 00:13:13考え方ですね。これを、えー、ま、コアナ
- 00:13:19オブジェクト思考の解釈の仕方という風に
- 00:13:23呼びます。で、スモールトークそかルビー
- 00:13:25もこういう風な解釈を、え、できます。で
- 00:13:28、えっと、これPythonとかルビとか
- 00:13:31C++とかSwiftとか、ま、近代的な
- 00:13:35オブジェクト思行語言語では、あの、
- 00:13:38例えば、え、1というのに、えっと、1と
- 00:13:41いうインスタンス、インスタンス、あの、
- 00:13:45え、クラスの実態ですね、え、
- 00:13:48インスタンスを作っておいて、それに@と
- 00:13:50いうメソッドを使って2という
- 00:13:52パラメーターを渡すと、ま、これ同じ意味
- 00:13:54で書き方が違うということが、ま、実装
- 00:13:57することはできます。あまり効率のいい
- 00:14:00方法ではないですが、えっとできます。
- 00:14:02C++だと、あの、同じ効率で書くことも
- 00:14:08できなくはないです。え、
- 00:14:10オブジェクティブCは、あの、こんな書き
- 00:14:12方をします。これスモールトークとね、
- 00:14:14近い書き方なんですけれども、え、
- 00:14:16レシーバー、メッセージ、パラメーターと
- 00:14:20いう書き方をします。はい。ま、これ書き
- 00:14:23方が違うだけですね。書き方が違うだけで
- 00:14:26、え、この1というレシーバーに@という
- 00:14:29メッセージと2というパラメーターを送る
- 00:14:31という書き方ができる。で、この1という
- 00:14:34レシーバーが例えばボタンとか例えばあ、
- 00:14:37そうでしょうね、なんかテキスト
- 00:14:39フィールドとかで、え、ここに、えっと、
- 00:14:41メッセージですね、ボタンがタップされた
- 00:14:43とかテキストフィールドに何か書き込まれ
- 00:14:46たとかで、え、タップされた回数あるいは
- 00:14:49書き込まれた内容というパラメーターが
- 00:14:51ついてくるという風にしてGUIの設計、
- 00:14:54え、と、ま、相性が良いことからウープと
- 00:14:56いうのは、あ、非常に、え、広く早
- 00:15:02普及をしていきました。で、え、ウープと
- 00:15:07いうのはもうこれは多分他の演習でやっ
- 00:15:09てると思うので、え、ま、さらっといき
- 00:15:12ますが、え、クラスという考え方、これ
- 00:15:15クラスベースっていうのは、あの、別の
- 00:15:18ウープもあるので、え、ま、これクラス
- 00:15:20ベースの場合について、え、お話をします
- 00:15:22が、え、クラスには、ま、変数とそれから
- 00:15:27メソッド、ま、変数と関数がありますよと
- 00:15:29。で、それからその実態化したもの、
- 00:15:32インスタンスというものがあ、ありますよ
- 00:15:35と。で、そのクラスを、え、継承する、
- 00:15:39それから、あ、ポリモフィズムという、ま
- 00:15:42、継承したクラスも元のクラスと同じ扱い
- 00:15:45をするというような、あ、考え方。これは
- 00:15:49あのプログラムの再利用性を高めるために
- 00:15:52考えられたものですね。ま、そこら辺は
- 00:15:55あの専門の演習の方あるいは講義の方にお
- 00:15:59任せをしたいと思います。ま、一例を
- 00:16:01上げると、えっと、これはあの
- 00:16:07C+言語にあのない方を追加する一例です
- 00:16:13。あのC++、ま、Cでもそうです。あ、
- 00:16:17CC比較した面白くないね。でもそうです
- 00:16:20が、あの、2次元の位置を表す方という
- 00:16:23ものはありません。えっと、実数はある。
- 00:16:26実数と不動少数点数とか整数はあるんだ
- 00:16:28けれども、じゃあ画面上のxyの位置、x
- 00:16:32座標、y座標って、ま、よくセットにして
- 00:16:34考えますよね。で、そのおセットの位置
- 00:16:39セットっておかしいか、あの、順序か。
- 00:16:41えっと、xとyをまとめた方というのが
- 00:16:45ないので、じゃあ作ろうと。で、ええ
- 00:16:49、ま、C言語だと構造体を使うところです
- 00:16:52が、ま、C++とかPYONとかJavと
- 00:16:55かだと新しいクラスを作るというのが、あ
- 00:16:57、ま、上等手段ですね。で、え、ま、一例
- 00:17:02として、え、ベクター2Dというクラスを
- 00:17:05作ったとしたら、あ、こんな風に、あの、
- 00:17:09書くことができて、例えば足し算を定義
- 00:17:12するなんてこともできますよというような
- 00:17:16、あ、ことですね。これは、あの、よく
- 00:17:19ライブラリーで提供されています。あの、
- 00:17:22PYONだとね、ま、普通ナ牌使ってこの
- 00:17:25無限、無限次元は言いすぎかもしれない
- 00:17:27けど、あの、超多次元の超多元の配列って
- 00:17:33いうのは使えますが、あ、ま、こういった
- 00:17:352次元の配列も扱える、え、ということ
- 00:17:39ですね。C言語もね、C99からかな、
- 00:17:43あの、複素数使えるようになったので、ま
- 00:17:46、2次元のベクトルだ考えるぐらいだっ
- 00:17:48たら複素数で全然いいかなと思いますが、
- 00:17:51まあ、n次元のね、え、ベクトルというの
- 00:17:53を扱う時にはこうやって、え、自分で
- 00:17:56クラスを作るとよくやります。ま、ここが
- 00:17:59、ま、クラスの考え方の、まあ、数学の
- 00:18:04問題を解くのにも、ま、あの、割と便利な
- 00:18:08、あ、道具としては、あの、ということ
- 00:18:12ですね。ま、ベクトルであるとか複素数で
- 00:18:15あるとか、え、何でしょうね。
- 00:18:20行列なんかも、ま、クラスにしとくと、ま
- 00:18:23、ソースコードが読みやすくなるという
- 00:18:25効果は、え、あるでしょう。で、え、
- 00:18:29クロージャの話にしたいなと思うんです
- 00:18:33けども、えっと、クロジャーもあの
- 00:18:37カプセルかと似た話ではあります。ただし
- 00:18:41発想が全く違うので、え、ここから少し
- 00:18:46注意を払って聞いてもらえると嬉しいなと
- 00:18:49思います。今ですね、あの引数に1を足す
- 00:18:55関数を作っているとします。え、+1xと
- 00:18:59いう、え、関数は何かと言うと、x日を
- 00:19:02足すでプというx=x+2ということで
- 00:19:05引数に2を足す関数を作って、え、いると
- 00:19:09します。で、ま、これは使いましたよと
- 00:19:11いうことですね。あの、2に1を足して
- 00:19:13こっちが3になって、え、2に3を足して
- 00:19:165になるから5+3で8になるのが、ま、
- 00:19:19結果なんでしょうけど、ま、結果はどうで
- 00:19:21もいいです。ま、使ったということが重要
- 00:19:23で、で、これ2つの関数を使っ、あ、作っ
- 00:19:26たと。で、ただこの2つの関数で非常に
- 00:19:29よく似ています。え、よく似ているものは
- 00:19:33、ま、オブジェクト思考の教科書だと、ま
- 00:19:35、共通のクラスを作っ、あの、共通の規定
- 00:19:39クラスを作ってそこから発生させましょう
- 00:19:41と違いだけをサ分プログラミングして、え
- 00:19:45、2つのクラスを派生させましょうという
- 00:19:47使い方、書き方を習うところだと思うん
- 00:19:51ですが、あ、この、え、ま、ハスケル
- 00:19:57なんかに代表されるような、あ、比較的
- 00:20:01この数学者の伝統に近いプログラミング
- 00:20:04言語ではこういう中化をします。あの
- 00:20:09ラムダを使うと簡単なのでメイク+nと
- 00:20:13いう関数をラム式
- 00:20:15を返す関数として定義します。つまり関数
- 00:20:18を返す関数ですね。で、えっと、これ
- 00:20:21いきなり間違ってました。ごめんなさい。
- 00:20:22ここnが抜けてます。え、メイク+n=う
- 00:20:27、xは鍵のパラメーターですね。式の鍵の
- 00:20:31パラメーターで、え、x矢印x+nごめん
- 00:20:34なさい。ここにnが抜けていました。え、
- 00:20:37x+nを返す。つまり、えっと、メイク+
- 00:20:41n、n、え、何かが与えられた時には
- 00:20:44ラムダ式、え、x矢印、x矢印x+nが
- 00:20:49返ってくるという関数を定義したわけです
- 00:20:52ね。とすると+1xっていうのは、はい、
- 00:20:55メイク+nの1で+2のxはメイク+nの
- 00:20:592ということがあの
- 00:21:03すぐに作ることができるというものですね
- 00:21:06。
- 00:21:08はい。えっと、ちょっと僕手元の資料を
- 00:21:11更新したので皆さんに配布する資料には
- 00:21:14あの修正版が入るようにします。で、そう
- 00:21:18するとこの+1xと+2Xの中身がこの
- 00:21:22パラメーター違うだけ。ここ一緒なので、
- 00:21:26あの共通のメカニズムだということが一瞬
- 00:21:29で分かる。つまりプログラムを再用して
- 00:21:31いるということが分かる。うということ
- 00:21:34ですね。これ同じことをえっとC++でも
- 00:21:38あのできます。えっと、Javaも
- 00:21:41おそらくすぐ追いつくと思いますが、え、
- 00:21:45同じことをやろうとするとメイクプラって
- 00:21:48いうのは、ま、こういう関数を定義して
- 00:21:50おいて、あの、C+のあの、ラムダ式
- 00:21:53使えるようになりましたから、え、こんな
- 00:21:56風にして、え、書くことができます。はい
- 00:22:01。えっと、メイク+nのという引数を使っ
- 00:22:07て、え、x+nを返すという関数を返す。
- 00:22:10関数を返す。で、そうすると+1という
- 00:22:14関数を作る、+2という関数を作る。え、
- 00:22:18ここも1ていう数字にしとけばよかったな
- 00:22:21と思います。ちょっとこれも資料訂正して
- 00:22:23おきます。ちょっとね、あの、統一感考え
- 00:22:27た方が良かったですね。はい。ま、いずれ
- 00:22:29にせよこんな風にして、えー、関数を書く
- 00:22:33ことが、あ、関数を作る関数を書くって
- 00:22:36いうのは、あの、C+でもできるように
- 00:22:41現在はなっています。現在なってるんです
- 00:22:43が、これ実はシンタクスシュガーで、あの
- 00:22:46、
- 00:22:48内部では何が行われてるかっていうと、ま
- 00:22:50、ちょっとややこしくて申し訳ないんだ
- 00:22:52けれども、ま、大体こんな感じの関数が、
- 00:22:56あ、関数だ、クラスが生成されて、え、い
- 00:22:59ます。ま、これ、あの、この通りではない
- 00:23:02ですが、概念的にはこういうクラスが、あ
- 00:23:06、クラステンプレートが生成されています
- 00:23:08。で、いや、信託種があるからいいじゃん
- 00:23:11。簡単じゃんて思うかもしれないけれども
- 00:23:13、えっと、ま、これ、これよりはこっちの
- 00:23:17方が、ま、さっきのあのクラスを使う方法
- 00:23:21よりは単純に見えるかもしれないですが、
- 00:23:23内部的にはこうなのでコンパイルエラーが
- 00:23:26あった時に意味がわかんなくなるんですね
- 00:23:29。C++はも非常に難しいコンパイル
- 00:23:33エラーが測れるので、えな、なんでこれが
- 00:23:36あのコンパイル取らないのっていうことは
- 00:23:41、ま、応にして、え、起こる
- 00:23:45現象です。で、あともう1つね、僕気に
- 00:23:48なるのが、ま、1つそのうん、見通しが
- 00:23:52ちょっと悪いかなと思うことも、え、ある
- 00:23:56んですね。で、ま、これ上がハスケルの
- 00:23:59コードで、あの、下が同じことをスキーム
- 00:24:04とね、あの、古い言語で書います。これ
- 00:24:08ごめん。うん。ここ足し算してるのにこれ
- 00:24:10は1個1個し、あの、表示てるんで意味は
- 00:24:12一緒ですが、あの、ちょっと内容が違う
- 00:24:16あのことになってしまいました。これも
- 00:24:19修正しときます。あの、配布資料では、あ
- 00:24:22、修正しておきます。かこの数は合ってる
- 00:24:25ね。かこの数は当てるんではあのこういう
- 00:24:28ねあのリスプはねかこの数がね合わなく
- 00:24:35なることがあるんで非常に気を使いますが
- 00:24:39えっとこれで大丈夫だね
- 00:24:44[音楽]
- 00:24:47はいちょっと今配布資料の方も修正しまし
- 00:24:49た。で、えっと、ここも+n、メイク+n
- 00:24:55で、ラムダは、ま、ラムダって書かなきゃ
- 00:24:57いけないんだけれども、ま、大体やってる
- 00:24:59ことは同大体じゃない、完全に一緒で、え
- 00:25:02、+1っていうのはメの1、+の2って
- 00:25:06いうのはメの2とで、え、呼び出すだけ。
- 00:25:11え、なので、え、ま、これ、あの、
- 00:25:13スキームでも読み方さえ気をつければ全く
- 00:25:17同じ行数で、行数も多分一緒ですね、これ
- 00:25:19。2に渡ってるだけで、あの、一緒ですね
- 00:25:24。ま、あの、で、これ非常に古い
- 00:25:26コンピューター言語なので、ま、こんな風
- 00:25:28に昔からその概念としてはあったという
- 00:25:31ことと、それからあのハスケルの場合は
- 00:25:36参照性というものをあの
- 00:25:40、え、強制されますから、ま、強制は言い
- 00:25:44すぎかもしれないけれども、ま、事実上
- 00:25:46強制されていますから、あ、このNという
- 00:25:49ものの値というのが、あの、例え変数で
- 00:25:53与えられたとししても書き換えることは
- 00:25:55できないので、ま、常に、え、メイク+n
- 00:25:57の1は+1を、あの、1を足す関数で、
- 00:26:01メイク+nの2は2を返す関数を返すん
- 00:26:03ですが、あ、このスキームの場合は、あ、
- 00:26:07ここをもしパラメーターにしていたとし
- 00:26:08たら、ここですね、ここパラメーターにし
- 00:26:10ていたとしたら、パラメーター書き換える
- 00:26:12ことが、あ、できます。え、できるんです
- 00:26:15が、できるんですが、ここですね、えっと
- 00:26:18、nを2としておいて、え、ここにnと
- 00:26:22与えると、で、え、そうすると後でnを
- 00:26:26強制的に書き換えることで、え、この+n
- 00:26:30の+2の中身変わっちゃうんじゃないの?
- 00:26:34Nの値後から事後的に変えたから変わっ
- 00:26:36ちゃうんじゃないのと思わせておいて実は
- 00:26:40これ変わりません。結果は先ほどの
- 00:26:42プログラムと変わりません。え、これ何が
- 00:26:45起こってるかと言うと、レキシカル
- 00:26:48クロージャーと言ってこう書いた時の値を
- 00:26:52キャプチャーしてるんですね。この書いた
- 00:26:53時、えー、この+2が定義された時のNの
- 00:26:58値を記憶しているということですね。え、
- 00:27:04記憶している記憶というのは環境を
- 00:27:07キャプチャーしているという風に呼びます
- 00:27:09。え、環境が記憶されているので、え、
- 00:27:13ここはあの
- 00:27:16同じ答えが返ってくるということです。
- 00:27:22はい。ま、これがね、あの、レキシカル
- 00:27:26クロージャーというクロージャーの1つの
- 00:27:28考え方、ま、他あの絵の回だと変わっ
- 00:27:32ちゃうとこれダイナミッククローって言い
- 00:27:33ますが、まあ、
- 00:27:36おそらく今だ現在使われてる言語ではもう
- 00:27:40それ採用してる言語はないんじゃないかな
- 00:27:42と思います。で、ただし、あの、
- 00:27:47じゃあオブジェクト思考のように内部状態
- 00:27:50を持たせることがクロージャーでできない
- 00:27:53のかと言うと、お、それはあのできます。
- 00:27:56で、これもうちゃんと最後ね、余談になる
- 00:27:59ので、あの、ここは、え、もう忘れて
- 00:28:04もらって構わないところなんですが、この
- 00:28:07コードですね。これも、えっと、スキーム
- 00:28:09で書いたコードで、あの、ハスケルでも
- 00:28:11同じことが実はできます。あの、この
- 00:28:14セットびっくりっていうのが、
- 00:28:17あの、変数を書き換えるというね、濃動的
- 00:28:20に書き換えるという行為で、ま、これは
- 00:28:23本来ハスケールでは禁止されている行為で
- 00:28:27あるので、え、スキームであえて書いてい
- 00:28:29ますが、これ、あの、実行すると、え、
- 00:28:330123と、あ、012という風に筋が
- 00:28:35増えていきます。つまり、え、
- 00:28:37クロージャーに内部状態を持たせるという
- 00:28:40ことができることを示している、え、例に
- 00:28:44なります。内部状態も、え、持てるという
- 00:28:46ことはオブジェクトとして扱うことが
- 00:28:50できるオブジェクト思行プログラミングに
- 00:28:52おけるオブジェクトとして使うことも
- 00:28:56できるということで、ま、実際ね、この
- 00:28:59気候を使って、え、オブジェクト思考
- 00:29:02プログラミングを、ま、ナぞる
- 00:29:05シミュレートするという書き方も、あの、
- 00:29:09存在します。ま、あ、ただグラフィカル
- 00:29:11ユーザーインターフェイスにこういった
- 00:29:13スキームリスプを使ってる例というのは
- 00:29:16少ないです。0ロではないですが少ない
- 00:29:20です。はい。というわけであの今日ざっと
- 00:29:23クロージャーの話をしてみました。
- 00:29:25クロージャーについてはあの対面の講義の
- 00:29:29方で手を動かすことをやってみましたが、
- 00:29:31ま、あの理論的にはこういう風になって
- 00:29:34いるんだということをね、あの見てもらえ
- 00:29:37たらなと思います。というわけで、えっと
- 00:29:39、今日の話は以上にしておきます。お疲れ
- 00:29:42様でした。
- クロージャ
- オブジェクト指向
- プログラミング言語
- C++
- Java
- Python
- スキーム
- リスプ
- ハスケル
- 再利用性