LISPをつつく4-副作用とスペシャルホーム。何がスペシャルなの?
>(let x 100)
100
;;色々処理する
>(setq x 1 y ( + x 1) )
2
;;あれ?間違えた!
上記サンプルでは変数xは必ず2になってしまうピヨォ。こんな具合に、複雑な関数を書いている時、ちょっとした間違いで思わぬ処理がされてしまうピヨね。この例からも分かると思うけど、副作用はバグの元になりやすいピヨね。それに、こういった代入文は順番に依存してしまうから並列処理できずパフォーマンス劣化に繋がるピヨ。
それで、副作用という言葉なんだけど、情報処理では式を評価する以外の事全てが副作用ピヨね。つまり、関数型プログラミングでは、式の戻り値だけでプログラミングする事を目指しているピヨ♪これが実現できれば、並列処理もできるし、個別に切り出してテストする事もできるからいい事だよね♪ だけど、残念ながら全く副作用なしでプログラミングするのは難しいから、setqの様な副作用がある関数が用意されているピヨ。
おっと忘れるところだった。setqはスペシャルフォーム(特別な式)のうちの一つピヨ♪何が特別なのかというと、厳密に言うとsetqは関数じゃないからなんだ。もし、setqが関数ならば(setq x 3)とした場合、xの値が先に評価されてsetqに渡され(setq 30 3)とかになるはずピヨ。だけど、30を渡してしまうとどの変数に代入するのか分からなくなるから、変数名だと特別に解釈するピヨッ♪このように、普通の関数(式)と同様のルールに基づいて評価が行われないものをスペシャルフォームと呼ぶピヨね♪
setq以外にもLISPには色々なスペシャルフォームが用意されているピヨ♪つまり、普通の式は左から順番に関数へ渡されるだけど、それ以外の特別なルールが存在するって事だね。理想と現実のギャップを感じるピヨ♪それにしても、LISPって奥が深いよね♪つつき甲斐があるピヨね♪