Schemeのコンストラクタの引数は?
以前、Schemeについて質問させて頂いた者です。
まず、4つのフィールドx,y,delta-x,delta-yから成るBALL構造体と、2つのフィールドx,yから成るPOSN構造体を定義しました。
(define-struct BALL (x y delta-x delta-y))
(define-struct POSN (x y))
そして、そこから課せられた内容が
「BALL構造体データ a-ball から座標位置を取り出し、POSN構造体データとして返す関数 get-ball-posn を定義せよ。(make-posnを利用せよ)」
というものです。
私はまず、以下のように書いてみました。
(define a-ball (make-BALL x y delta-x delta-y)) ・・・(☆)
(define (get-ball-posn a-ball)
(make-POSN (BALL-x a-ball) (BALL-y a-ball)))
そして (get-ball-posn (make-BALL 10 20 30 40)) のように実行してみると、
(☆)の部分の、x,y,delta-x,delta-yは定義されてない、という内容のエラーが返って来ました。
仕方ないので、その部分を'x 'y 'delta-x 'delta-yにそれぞれ直して再び実行してみると、
(make-POSN 10 20)
と正しい答えが返ってきました。
色々試した結果、“コンストラクタの引数は、変数を取ることが出来ない”という結論に至りました。
これは正しいのですか?
また、上記の'x 'y 'delta-x 'delta-yのままでは、正しい答えは返ってくるものの、どうも納得いきません。模範解答はどうすれば良いのでしょうか。
何とぞご教授の程、宜しくお願いします。
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.h …
申し訳ありませんでした。PLTでの話でした。
仰るとおり、「任意のデータを生成する手続き」を行いたかったのだと思います。
これでもう1度やってみようと思います。
詳しい説明、有り難うございました。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- 物理学 英語表現についてどうもわからないので教えて貰えないでしょうか? 具体的には以下の文の中でreflec 1 2023/04/29 20:59
- その他(プログラミング・Web制作) 物理の斜方投射で目盛りに数値を入れたい 2 2023/05/27 06:32
- JavaScript 台形公式 2 2022/12/21 18:38
- 英語 英語の形容詞句と副詞句 3 2022/05/14 23:35
- その他(プログラミング・Web制作) Pythonでのかんたんな物理シミュレーションについての書籍 5 2023/06/02 07:37
- その他(プログラミング・Web制作) 物理の斜方投射の目盛り線とx軸、y軸の追加について 3 2023/05/26 21:11
- アニメ dragon ball superのキャラクター 1 2022/10/20 15:14
- 邦楽 気にしないでもいいのだが 5 2023/08/28 00:43
- その他(プログラミング・Web制作) ボールの動きがスムーズに動いてかつ目盛り線描画を維持するためには 4 2023/05/31 10:01
- その他(プログラミング・Web制作) Pythonにおける物理のシミュレーションでの単位変換について 2 2023/06/02 17:11
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
VBAのプログラムで、DIAG = 1# ...
-
C++ 構造体の一括初期化 {0}
-
「#undef」と「#define」の使い...
-
Integer変数をカラにしたいので...
-
値が代入されてない時
-
構造体のメンバ初期化について
-
日付チェック関数について
-
構造体の初期化方法について
-
10進数の変換方法
-
VBAにてcolorindexを変数に格納...
-
値が変わるのはどうしてでしょ...
-
typedefをプログラム中で解除す...
-
関数の引数の順番の混乱を回避...
-
C++ メンバイニシャライザリス...
-
構造体にする理由・利点・使用例
-
charとucharの違い
-
VBAの変数のデータ型を変更する...
-
構造体から他の構造体への代入
-
FILE構造体がどのように定...
-
構造体のパックの仕様の違いに...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
VBAのプログラムで、DIAG = 1# ...
-
Integer変数をカラにしたいので...
-
C++ 構造体の一括初期化 {0}
-
long型のデータをバイト型の配...
-
「#undef」と「#define」の使い...
-
構造体のデータを丸ごとコピー...
-
VBAにてcolorindexを変数に格納...
-
C言語 構造体の中に共用体を定...
-
値が代入されてない時
-
異なる構造体のデータのコピー
-
typedefをプログラム中で解除す...
-
構造体のポインタにNULLが入らない
-
charとucharの違い
-
整数から16進数への変換 現在c...
-
VBAの変数のデータ型を変更する...
-
VB.NETのStructureというのはど...
-
構造体を型の異なる構造体に代入
-
日付チェック関数について
-
命名規則 VB 構造体
-
構造体の初期化方法について
おすすめ情報