アプリ版:「スタンプのみでお礼する」機能のリリースについて

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のままでは、正しい答えは返ってくるものの、どうも納得いきません。模範解答はどうすれば良いのでしょうか。
何とぞご教授の程、宜しくお願いします。

A 回答 (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 …
    • good
    • 0
この回答へのお礼

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

お礼日時:2010/05/12 23:25

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!