Takanoriのブログスマートフォン用の表示で見るTakanoriのブログこの広告は、90日以上更新していないブログに表示しています。本記事はストリームについて、Schemeを用いて説明しています。サンプルコードの動作確認を行ったSchemeの処理系、バージョンは以下のとおりです。x86_64-apple-darwin15.6.0ストリームデータ構造の観点からすると、ただのシーケンス代入やミュータブルなデータを用いることなく、状態を保持できます遅延評価を用いることで、無限を扱えます遅延リスト遅延リストとは構成時ではなく、選択時に実行されるリスト上記のみだと説明不足すぎるので、一般的なシーケンスのリストの問題点から説明します。シーケンスをリストで表現すると、状態がスタックとして積まれ続けるので、計算速度、メモリの使用量的に問題があります。以下のコードはn番目のフィボナッチ数を求めるものです。完全にリストが作成されるまで値は求まりません。processで書き直したものが以下のようになります。countを格納する場所さえ確保すればよくなりますが、シーケンスとして扱うことはできなくなります。processの両方の問題点を解決するためにストリームを用います。ストリームだと遅延評価を用いるため、リストとしてシーケンスを扱うコストを払う必要がなくなります。以下のようにcons-streamという構成子があるとします。<b>)<b>を評価するタイミングをリスト構成時ではなく、<b>を選択するタイミングに変更します。processでフィボナッチ数を計算する際の計算速度、メモリの使用量などの問題が解決されます。以下のコードでストリームを作成します。<b>)の<b>はstream-cdrでアクセスされてはじめて実行されます。result))))ストリームの動きでは、実際にストリームの動きを見ていきましょう。いくつか関数を簡単に説明をします。(newline))ストリームを構成したタイミングではリストの1番目のみ評価されます。リストの残りは呼ばれるまで、実行されません。7)67#<undef>無限のストリームストリームは無限を定義できます。フィボナッチ数列(フィボナッチ数の無限のストリーム)を定義すると、以下のようになります。b))の部分は呼ばれるまでは実行されないので問題ありません。10)55ストリームの加算ストリーム同士の加算も容易にできます。以下のコードはストリーム同士をを加算する方法でフィボナッチ数列を定義しています。»プロフィールid:Takanori11社会人4年目です。(2)はてなブログをはじめよう!Takanori11さんは、はてなブログを使っています。ブログを報告するスターをつけました引用をストックしましたストック一覧を見る閉じる引用するにはまずログインしてくださいログイン閉じる引用をストックできませんでした。再度お試しください閉じる限定公開記事のため引用できません。