• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:Schemeのコンストラクタの引数は?)

Schemeのコンストラクタの引数について

このQ&Aのポイント
  • Schemeのコンストラクタの引数は変数を取ることができない
  • コンストラクタの引数には値を直接指定する必要がある
  • 指定されたフィールドの値を取り出して返す関数を定義する必要がある

質問者が選んだベストアンサー

  • ベストアンサー
回答No.1

ええとですね。まず。 「Schemeには構造体はありません。」 少なくともR5RSでは存在しませんね。最新の仕様、R6RSでは定義されているらしいんですが、今のトコ、R6RS準拠のScheme処理系と言うのは、PLTくらいしか知りません(しかもビミョー)。 つまり、ここで言う「define-structure」ってのは実装依存です。どの実装か、と言うと「PLT Scheme」って言う処理系の実装です。このIDE(統合開発環境)の名前が「DrScheme」と言います。 何人か、教えてgoo!/O.K.Waveで見かけてるんですが、「How to Design Programs」って本使って実習行ってる大学があるみたいですね。HTDP自体がPLTベッタリなんで(と言うか、PLTの実装者達が書いてる教科書の模様です)、そこの問題質問するんでしたら、PLT Schemeと明示しておいた方がいいです。じゃないと、冒頭のように、 「Schemeの構造体?define-structure?ないよ。そんなの。」 って言われかねません。 と言うわけで、以下はPLT依存の話を絡んで。 ちょっと質問の意味が分からない部分があるんですけど、まず、一般に「構造体」と言うのは「ユーザーがデータ型を定義出来る手段」の事です。 と言う事は。 manaka3161さんは、次の式で何をしたいのでしょうか? (define a-ball (make-BALL x y delta-x delta-y)) ・・・(☆) これは「データを定義」しようとしてるんですか、それとも「手続きを定義」しようとしてるんでしょうか? 仮に、構造体から離れて、リストa-listを次のように定義しようとします。 (define a-list (list x y)) これもエラーが出ますね。当然です。構造体/リストに関わらず、defineでデータを定義したい筈なのに、実体がこれらには存在しないから、です。 つまり、「任意のデータを生成する手続き」にしたいのなら、次のように書かなければならないのは自明ですよね。 (define (a-ball x y delta-x delta-y) ; 構造体の場合   (make-BALL x y delta-x delta-y)) (define (a-list x y)         ; リストの場合   (list x y)) 実体を与えたいのなら、次の通りでしょう。 (define a-ball (make-BALL 10 20 30 40)) ; 構造体の場合 (define a-list (list 1 2))       ; リストの場合 同じですね。後者の「データを定義した」形であれば、manaka3161さんが定義したget-ball-posnを用いれば、 > (get-ball-posn a-ball) #<POSN> > となって、「POSNと言う構造体が作成された」と返して来ます。つまり、問題文にある >POSN構造体データとして返す関数 としては満たされている、って事ですね。

参考URL:
http://docs.plt-scheme.org/guide/define-struct.html
manaka3161
質問者

お礼

申し訳ありませんでした。PLTでの話でした。 仰るとおり、「任意のデータを生成する手続き」を行いたかったのだと思います。 これでもう1度やってみようと思います。 詳しい説明、有り難うございました。

関連するQ&A