無限ストリームなのですが、
(define (stream-car stream) (car stream))
(define (stream-cdr stream) (force (cdr stream)))
(define (cons-stream a b) (cons a (delay b)))
(define (integers-starting-from n)
(cons-stream n (integers-starting-from (+ n 1))))
(define integers (integers-starting-from 1))
(define (stream-ref s n)
(if (= n 0)
(stream-car s)
(stream-ref (stream-cdr s) (- n 1))))
(define (divisible? x y) (= (remainder x y) 0))
(define (sieve stream)
(cons-stream
(stream-car stream)
(sieve (stream-filter
(lambda (x)
(not (divisible? x (stream-car stream))))
(stream-cdr stream)))))
(define primes (sieve (integers-starting-from 2)))
(stream-ref primes 10)
integersを定義する段階で落ちてしまうようです。どうも遅延評価がうまくいってないようです。どうしたらよいでしょうか?どなたか助けてください。
No.1ベストアンサー
- 回答日時:
「計算機プログラムの構造と解釈」でしょ?
前も誰か投稿してたと思うんですけど、これって「激ムズの」教科書なんで、ここで訊かない方が良いですよ(笑)。SICPで検索すれば「勉強会」やってる専門サイトがいくつか見つかると思うんで、そっちで尋ねた方が良いです。
少なくとも、Schemeやこの教科書使ってる人ってのは「偏差値高めの」大学でキチンとした「計算機工学」を学んだ/学んでる人たちが多いんで、質問投稿するにせよ、場所を絞った方が良い、と思います。
しかも、投稿のコード見ると、まずは、
stream-filter
と言う手続きが「未定義」なんですよね。従って、仮にScheme持っててもこれじゃあ走りません。
「計算機プログラムの構造と解釈」見る限り、次の手続きと変数を定義しとかなきゃならないのです。
(define (stream-filter pred stream)
(cond ((stream-null? stream) the-empty-stream)
((pred (stream-car stream))
(cons-stream (stream-car stream)
(stream-filter pred
(stream-cdr stream))))
(else (stream-filter pred (stream-cdr stream)))))
(define (stream-null? string) (null? string))
(define the-empty-stream '())
でしょ?これ抜けてる以上、上の質問は不完全です。これも「教科書」共有してないと指摘出来ません。
さて、投稿コードを見ると、次のコードがおかしいのです。
(define (cons-stream a b) (cons a (delay b)))
これが問題です。と言うかこれが原因ですね。
「計算機プログラムの構造と解釈」見てみれば分かりますが、これってご自分で書いたんでしょ?と言うか、当該の教科書には「ハッキリとした」定義書いてないんですよね(笑)。
p.189辺りの下に次のような事が書かれています。
stream-carとstream-cdrは手続きとして定義出来るが、cons-streamは「特殊形式でなければならない」。
上のnerudaさん自作のコードは「手続き」です。従って、この条件を満たしていません。
ついでに、この議題は実はもっと先のp.243以降に持ち越されます。従って、「無限ストリーム」と言うお題ではここのコードは「動かせない」のです。
現時点での回避法は、平たく言っちゃうと、「特殊形式」を簡単に定義する……要するに「マクロ」としてcons-streamを設計しちゃう、と言う方法があります。
しかしながら、これはある意味「掟やぶり」で、と言うのも、「計算機プログラムの構造と解釈」ってマトモなマクロ解説、って無いんですよ。
現状のScheme、少なくともR5RSやR6RSは言語仕様としてマクロ持っていますが、「計算機プログラムの構造と解釈」が上梓された当時は、多分R3RSかR4RSの頃で、少なくとも「Appendix」扱いでマクロは正式仕様じゃなかった、んです。ちょっと「マクロの実装方法」に対して、Schemeコミュニティがまだ神経質だった頃に出版された本なんです(だからこそ、「特殊形式」でのstream-consの明確な記述を避けたのでしょう)。
実は今も「Schemeのマクロ実装方法」ってちょっと揉めてるんですけどね(笑)。一応、R5RSの正式なマクロ(なんだけど、これで書く人が少ない・笑)である「パターンマッチング式」のマクロでのstream-consの記述は以下の通り、です。
(define-syntax cons-stream
(syntax-rules ()
((_ a b) (cons a (delay b)))))
これだと引数a、bが「評価される事を」止めます。平たく言うと、マクロcons-stream自身は評価されず、呼び出し元のコード内で、(cons a (delay b))と言う形で「展開される」ようになるんです。
これを組み込んで動作させれば望む結果が得られるでしょう。例えば
> (stream-ref primes 10)
31
のように。
回答ありがとうございます。おっしゃるとおりSICPです。
stream-filterはコピペしそこなっていました。もうしわけございません。現在研究室ができたばかりなので学生は僕一人で先生と毎週30P進んでいます、誰にもきけず孤軍奮闘で、なかなかきついです。
stream-carとstream-cdrは手続きとして定義出来るが、cons-streamは「特殊形式でなければならない」。
そうですね、自分でもおかしいと思いながらなんとか書いてみたとこです。
回答者様のおっしゃるようにしたらきちんと動きました。本当にありがとうございました。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- JavaScript プログラムがうまく動きませんレビューお願いします 1 2022/07/10 05:08
- JavaScript コードレビューをお願いします。 1 2022/07/16 05:38
- 留学・ワーキングホリデー カナダカレッジ留学 OSSD with courses from the College (C), 1 2023/01/15 03:57
- 英語 動詞 dare について。 英文法の本に以下の文がありました。 Don’t dare me. (俺を 2 2023/02/10 21:21
- C言語・C++・C# C++のcase文の書き方 4 2023/02/24 20:50
- PHP PostgreSQLからCSV形式でエクスポートする際にカラム内の改行をとる方法 1 2023/02/22 10:05
- その他(プログラミング・Web制作) laravel 本番環境でメールが送れません。 1 2023/02/17 17:57
- その他(プログラミング・Web制作) Arduino UNO のC言語 2 2023/04/18 19:42
- C言語・C++・C# c言語の問題の説明、各所ごとに 5 2023/07/26 11:03
- C言語・C++・C# マクロ関数 #define の効果は何ですか? わかりやすく教えて下さい 5 2023/04/05 18:14
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
Excel・Word リサーチ機能を無...
-
エクセルで特定の列が0表示の場...
-
Excel マクロ VBA プロシー...
-
特定のPCだけ動作しないVBAマク...
-
メッセージボックスのOKボタ...
-
EXCELのVBAでRange("A1:C4")を...
-
ExcelのVBA。public変数の値が...
-
一つのTeratermのマクロで複数...
-
マクロの連続実行
-
TERA TERMを隠す方法
-
Excel VBAからAccessマクロを実...
-
ピボットテーブルでの毎回可変...
-
VBAのIF分で時間指定の条件式の...
-
OnTimeを使ったのですが「エラ...
-
エクセルでキーリストからデー...
-
TeraTermマクロの文字列結合
-
エクセルに張り付けた写真のフ...
-
ExcelVBAでPDFを閉じるソース
-
VBA初心者 Ctrl+での操作、ボタ...
-
EXCELのマクロの重複起動...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
Excel・Word リサーチ機能を無...
-
特定のPCだけ動作しないVBAマク...
-
エクセルで特定の列が0表示の場...
-
Excel マクロ VBA プロシー...
-
メッセージボックスのOKボタ...
-
一つのTeratermのマクロで複数...
-
ExcelのVBA。public変数の値が...
-
エクセルに張り付けた写真のフ...
-
他人が作ったマクロの理解
-
ExcelVBAでPDFを閉じるソース
-
TERA TERMを隠す方法
-
エクセルで別のセルにあるふり...
-
マクロ実行時、ユーザーフォー...
-
Excel VBAからAccessマクロを実...
-
EXCELのVBAでRange("A1:C4")を...
-
TeraTermマクロの文字列結合
-
PDF出力マクロについて。マクロ...
-
#defineの定数を文字列として読...
-
エクセルのマクロをセルの値に...
-
wordを起動した際に特定のペー...
おすすめ情報