0

(begin expr1 expr2 ...)はすべての式を評価し、評価された最後の式を返します。Schemeでは、 `(begin)`の返り値は何ですか?

私はChez Schemeではbeginのような式を使わずに(begin)を使用することができます。私は私の研究の一環としてChez Schemeを使用しています。私がコンソールに書き込むときには、voidのように構文エラーを出さず、何も表示しません。

私の質問は、何が返されますか?

(void)を実行して取得できる空白オブジェクトだと思いました。 しかし、私はそれをテストしたとき、私はそれが実現していないことに気付きました。

私はChez Schemeをコンパイラコースの一部として勉強しています。私は特別な単語beginを処理できるコンパイラの一部を実装する必要があります。だから私はこれがなぜ可能で、この関数が何を返すのかを知る必要があります。

EDIT:

私はこのトピックに関するthis linkを追加しています。 私はその答えを完全に理解することができませんでした。加えて、彼は返品の種類について言及していません。

+1

コンパイラの一部を実装する場合、言語フォームの意味の定義は、既存の動作からではなく、仕様からのものでなければなりません。右? –

答えて

2

私は質問がbeginの異なる使い方を混同していると思います。 R6RS section 11.4.7を約beginのように見ると、2種類の方法で使用されます:1)0以上の "フォーム"で、beginが存在しない場合と同じように、フォームは構文的に周囲のボディに "スプライス"されます私はこれが主にマクロを書くときに便利だと思う)。 2)1つ以上の式で、式を順番に評価し、最後の式の結果を返します。

「戻り値」について言及すると、式として(begin ...)が表現されますが、式(上記のbeginの2番目の形式)として1つ以上の式を使用する必要があります。空の(begin)は、最初の形式のbeginでなければなりません。単純に「何もない」(0形式)を周囲のボディにスプライスするだけですが、ボディ全体の評価とは別に「評価」されません。

+0

お返事ありがとうございます。私があなたを正しく理解していれば、式を使わずに(始める)ことは、プロシージャではなくマクロ的なツールであると言っているので、値を返しません。 – PeNpeL

+1

@PeNpeL:うーん、 'begin'自体は手続きではありません。それは特別な形の言語です。しかし、基本的に、そうです、 '(begin)'は 'begin'の式の使用ではなく、単独の式ではありません。あなたのコンパイラが複雑なマクロをサポートする必要がない場合、多分 'begin'のフォームスプライシング形式を無視することができます。 – newacct

+0

ありがとうございました! – PeNpeL

関連する問題