ラケットで複数の戻り値を使用して何かを行うにはどうすればいいですか? 質問する

ラケットで複数の戻り値を使用して何かを行うにはどうすればいいですか? 質問する

Racket で複数の戻り値を使用するには、 を使用するかdefine-values、 でリストにまとめる必要があるようです(call-with-values (thunk (values-expr)) list)。後者の場合、リストにまとめる必要があるのに、なぜリストではなく複数の値を返すことを選択するのでしょうか。さらに、これらはどちらも非常に冗長で、ほとんどのコードに組み込むのが面倒です。複数の戻り値に関する非常に基本的なことを誤解しているに違いないと思います。その点では、プロシージャをどのように記述すればよいのでしょうか。受け入れる複数の戻り値?

ベストアンサー1

Scheme の歴史やその他のニュアンスについてはまだよくわかっていないかもしれませんが、実用的な回答をさせていただきます。

まず、経験則として、2 つまたは 3 つ以上の値を返す必要がある場合は、複数の値を使用せず、リストも使用しないでください。 を使用してくださいstruct。通常、その方が読みやすく、保守も簡単になります。

Racket のmatchフォームを使用すると、リストの戻り値を分解することが非常に簡単になりますdefine-values。次のように簡単です。

(define (f)
  (list 1 2))

(match-define (list a b) (f))
(do-something-with a b)

;; or

(match (f)
  [(list a b) (do-something-with a b)])

gを受け取る別の関数 があり(list/c a b)、それを と合成したいf場合、 がfリストを返す方が簡単です。また、両方が 2 つの要素を使用するのも簡単ですstruct。一方、 はcall-with-valuesちょっと扱いにくい混乱状態だと思います。

複数の戻り値を許可するのは、戻り値が引数と対称的になるため、エレガントなアイデアです。複数の値を使用すると、リストや構造体よりも高速になります(Racketの現在の実装では、そうでなければうまくいくかもしれない)。

ただし、パフォーマンスよりも読みやすさを優先する場合は、最新の Racket では または を使用する方が実用的であるとliststructは考えています。そうは言っても、私は 1 回限りのプライベート ヘルパー関数には複数の値を使用します。

最後に、長くて興味深い議論Racket メーリングリストで。

おすすめ記事