VBA 関数オブジェクトを実装する

1
ほえほえ@スプシマン @hoehoe1234

これは変な話ですが、低レイアからやるのが一番かと。ノッペらなメモリがどう関数と変数に分かれて、どうして変数には値が入るのか?1つしかない、たくさん存在するとはなにか?がわかりますから。もうひとつは間接参照の仕組みが直接わかるの大きいと思います。 twitter.com/excelspeedup/s…

2022-01-21 11:54:13
はけた@できるExcel2021 @excelspeedup

あと、クロージャーとかカリー化も壁が厚かったですね。 スコープの話もですが、「関数を返り値にする」という概念も、かなりハードルが高かったです。 こっちは、しっくりくるまで数か月はかかった気がします。

2022-01-21 10:56:28
はけた@できるExcel2021 @excelspeedup

あと、クロージャーとかカリー化も壁が厚かったですね。 スコープの話もですが、「関数を返り値にする」という概念も、かなりハードルが高かったです。 こっちは、しっくりくるまで数か月はかかった気がします。

2022-01-21 10:56:28
はけた@できるExcel2021 @excelspeedup

初めて(Perlで)mapを見てから、(JavaScriptで)mapが違和感なく使えるようになるまでに5年超かかりました・・・。 ほんと、意味がわからなかったです。 twitter.com/Meijin_garden/…

2022-01-21 10:51:06
名人|マナリンクCTO @Meijin_garden

JavaScript、どれくらい速く「関数を値として扱えるので、引数に関数を渡したり、関数をExport/Importできる」という概念を体で覚えるかが学習曲線に大きく影響してそう。

2022-01-21 10:47:00
ほえほえ@スプシマン @hoehoe1234

オブジェクト指向経由もいいかもですね。オブジェクトとはインスタンス変数で、そこから関数(実際はクラスがオブジェクト化した単一のもの)へつながっているだけですから。ヒープとクラスファイルの内容を理解すればどうなっているかわかりますから。

2022-01-21 11:55:59
ほえほえ@スプシマン @hoehoe1234

クロージャは少しわかりにくかったです。静的なスコープと動的なスコープの差で、静的なスコープ(コード解析時)には見える変数が、関数オブジェクトを生成したあと、生成された関数オブジェクトにはもうそんなものは見えないということですから。これは簡単なしくみで「コピー」を持ってるんですね。

2022-01-21 11:57:37
ほえほえ@スプシマン @hoehoe1234

概念的にはこれも関数に状態をもたせる仕組みの一つだと思います。カリー化は引数を埋めますが、クロージャはローカル変数の代わりをすると考えればよいかな。両者ともに「関数に状態をもたせる」仕組みですね。最後は状態と間接参照しかないんですね。

2022-01-21 11:58:56
ほえほえ@スプシマン @hoehoe1234

カリー化は簡単でした。簡単というよりも楽しかったというかんじですかね。というのもVBAで滝Libとして自分で実装したので実効の仕組みから考えましたので。本当のカリー化がどうなっているか知りませんが、同じようなしくみだと思います。

2022-01-21 12:00:21
ほえほえ@スプシマン @hoehoe1234

言語の難しい概念は、実装からみるとわかりやすいことが多いですね。もちろん、理論も必要なですがどうして超えられない最後の壁みたいなものは「実装をみる」、「つくってみる」、「VM、OSの本など関係のありそうな概念と合わせる」ことで乗り越えられると思います。

2022-01-21 12:01:42
ほえほえ@スプシマン @hoehoe1234

VBAでカリー化機能をつくるのは割と簡単です。Run関数とCallByName関数があるので、たとえば関数名と引数を一緒に保管する仕組みを作って、実行時に解釈すればいいんですね。変数と関数名を一緒に保管するデータ構造、そう、配列で十分なんです。

2022-01-21 12:03:12