- ベストアンサー
schmeスキームのプログラミング初心者の質問
- schmeスキームのプログラミング初心者が、条件に合わない数を消すfilter1関数をつくりたい。
- 条件に合わない数を消すために、reduce関数を使いたいが、****の部分がわからない。
- プログラムの補助関数を含むが、どのようにしてプログラムを作るか途方に暮れている。
- みんなの回答 (2)
- 専門家の回答
質問者が選んだベストアンサー
>>この回答を見ていて思ったのですが、やはりlambdaを使わないと解けないのでしょうか? >>というのも自分はDr.schmeをintermediate studentに設定しているのでlambdaは使えないんです。 Dr.Scheme(あるいはRacket)だとそうですねぇ、色々なモードがありますから。 まあ、Scheme慣れしてる人だとlambda式突っ込む方を選ぶでしょう。ただ、lambda式恐るるに足らず、です。 そこの部分は要するに「局所関数」とか「ローカル関数」と言われてるモノを定義してるわけなんですが、HTDPですと、その前のSection 18でlocalと言う手続きを勉強している筈です。 HTDP(local): http://www.htdp.org/2003-09-26/Book/curriculum-Z-H-23.html#node_idx_1272 (本当の事を言うと、localもHTDPローカル(と言うよりもっと言うとPLTローカル)な機能なんで、一般的なSchemeの話ではないです。一般的なSchemeではletrec等を使います。ただ、普通はletrecなんて言われても意味が分からないので、もっと一般的な用語であるlocalに差し替えられてるのでしょう。) HTDPの流儀に従って、localを使うと、次のように書き直せますね。 (define (filter1 rel_op L t) (local ((define (f1 x lst) (if (rel_op x t) (cons x lst) lst))) (reduce f1 empty L)))
その他の回答 (1)
- cametan_42
- ベストアンサー率62% (162/261)
これもあんま良い質問の仕方じゃないと思います。 と言うのも「Schemeと言う言語」ではempty?と言う述語は定義されていません。当然emptyと言う定数もありませんし、そしてfirstとかrestと言う関数もないんです。 必ず「使用している教科書」を銘記しましょう。教科書ローカルの関数定義が混じってると「Schemeとしての一般的な話」が出来ないから、です。そして、リファレンスさえ分かれば何とか対応出来るケースもあるから、です。 で、独特の表記なんで、まあ、アタリは付けれるんですけどね。元ネタの教科書はこれでしょう。 How to Design Programs http://www.htdp.org/2003-09-26/Book/curriculum-Z-H-25.html#node_idx_1374 もう一つ言うと、恐らくこの教科書で「デザインレシピ」と言う考え方を学んでるでしょう。要するに質問で 「listから条件に合わない数を消す」 なんて説明を入れるのもイイんですが「Exampleを書いた方が良い」って事です。動作確認が出来ればもっと質問自体が明解になる。上の教科書のSection2辺りにデザインレシピの重要性が書かれていますね。もう一度読み返してみてください。 本題です。 この問題は、どっちかと言うとreduceと言う関数の使い方が主題ですね。ですから、「プログラミングをする」って意味では根本的には間違ってないんですが、「解題」と言う意味で方向性は根本的に間違ってます。まあ、宿題だとしたら、少なくとも先生の意図に対しては完全に外していますね。 (繰り返しますが「プログラムを作る」って意味では間違っていません) 先生が欲しい解は恐らく次のようなものでしょう。 (define (filter1 rel_op L t) (reduce (lambda (x lst) (if (rel_op x t) (cons x lst) lst)) empty L)) これで終わり、です。補助関数もクソもなくって、単に「reduceと言う関数をどう使えば良いか?」ですね。それが意図です。 で、ここで細々書いてもしょーがないんで端折りますが、このreduceと言う関数の名前はCommon Lispから来たモノですが、SchemeではSRFIと言われるライブラリがあって、それのfoldと言う関数に近い。元ネタはそれです。 SRFI1: fold http://www.chino-js.com/ja/tech/srfi/srfi-1/srfi-1.html#fold これは最近の関数型言語ブームで「関数型言語」の範疇に入ってる言語では極めてポピュラーなモノです。例えばMicrosoftのF#なんて言語にも入ってて、基本的な動きは同じです。 F#入門: http://winterradish.web.fc2.com/30/30higher_fold.html だから「将来を見越してfoldと言う関数の使い方に慣れておきましょう」と言うのが題意でしょうね、恐らく。
お礼
丁寧な回答ありがとうございます。文章が拙くてすみませんでした。 この回答を見ていて思ったのですが、やはりlambdaを使わないと解けないのでしょうか?
補足
すみません追加の質問です。 >>この回答を見ていて思ったのですが、やはりlambdaを使わないと解けないのでしょうか? というのも自分はDr.schmeをintermediate studentに設定しているのでlambdaは使えないんです。 回答していただいたのにすみません。最初に書いておくべきでした。
お礼
二回も回答していただきありがとうございました。 schme系だけでも様々なものがあるのですね。 自分はまだ初心者なので、これからがんばっていこうと思います。