@MtCedar リスパーをLisp上級者、あるいはLispを好んで使うプログラマだとすると、たぶんそういったこと(ループを再帰呼び出しとして書くこと)は好きではないと思います。(続く)
2014-04-16 23:55:59@MtCedar ループは常に再帰として書くことができる、というのは真なのですが、これは単に関数型プログラミングにおける基本的な道具がループでないというだけであって、生の再帰呼び出しをそのまま使うことが推奨されているわけではありません。(続)
2014-04-16 23:57:18@MtCedar .@kmizu まずreduce(foldLeft)やmapなどの高階関数を使って書けないか考え、それらで書けない時に初めて(末尾)再帰で書くのが普通の考え方かと。
2014-04-16 23:59:26@MtCedar .@kmizu ちなみに、リスパーと関数型言語プログラマーを同一視、あるいは近似するのは結構危険かと思います。リスパーはむしろS式とそれによって実現されるマクロにこだわるという面に特異なところがあります。
2014-04-17 00:02:37@kmizu フローチャートで書ける処理を、わざわざフローチャートで書きにくいような複雑な処理として記述するという発想がよくわかりません。
2014-04-17 00:12:11@MtCedar それはすぎさん流ネタですよね? >フローチャートで書ける処理を、わざわざフローチャートで書きにくいような複雑な処理として記述するという発想
2014-04-17 00:36:13@kmizu 理解できない、とは言い過ぎかもしれませんが、馴染めない考え方だと言うのが正直なところです。たぶん、思考の抽象化の方法が違うんだと思います。
2014-04-17 00:38:11@kmizu 僕がプログラムを書く時は、メモリイメージに対する書き換えの手続きとして処理を考えるので、オブジェクト指向はまだ分かるけれど、関数型プログラミングは根本的に相容れない感じです。
2014-04-17 00:44:31@MtCedar hmhm。とすると、ちょっと気になるのですが、たとえば、int x = ...; int y = ...; x + y; のx + yはどういうモデルで理解されますか?(結果の代入は考えない)
2014-04-17 00:46:52@MtCedar なるほど。では、たとえばより複雑なデータ型、たとえば多倍長整数型(CPUの加算器が直接扱えない大きさ) BigIntがあったとして、BigInt x = ..., y = ...; x + y に相当する演算はどうとらえるべきでしょうか?
2014-04-17 01:06:45@MtCedar x + yを単に「二つの値を加算した結果の値を生成する」ととらえるのであれば、intだろうとBigIntだろうと同じように(人間は)扱えますが、CPUの加算器を駆動する指示というレベルまで抽象度を落とすのであれば、かなり面倒なのでは?という疑問です。
2014-04-17 01:10:07@MtCedar あくまでメモリ領域ベースでとらえるなら、結果の値を格納する場所が問題になりますが、実行スタックに格納されるべきですか?
2014-04-17 01:12:17@MtCedar なるほど。だとすると、その捉え方は日常のプログラミングを不必要に複雑にしているように思えます(もちろん、リソースに敏感にならなければいけない局面では抽象度を落として考える事も必要ですが)
2014-04-17 01:15:14@kmizu 誤解があるといけないので、明言しておきますが、僕は関数型プログラミングのモデルが誰にでも理解しにくいとは思っていません。プログラマは自分のメンタルモデルに即した言語を選ぶべきで、押し付けは良くないという話です。
2014-04-17 01:22:33