移動中の構造体の無効な再帰型

私はGoプログラミング言語が新しく、私は作成と通訳の割り当てを持っていますが、私は次の問題に取り組んでいます:

私は環境を以下のように定義したい:

type Environment struct{
    parent Environment
    symbol string
    value RCFAEValue
}

func (env Environment) lookup(lookupSymbol string) RCFAEValue{
    if lookupSymbol == env.symbol{
        return env.value
    } //if parent != nill {
        return env.parent.lookup(lookupSymbol)
}

しかし、私はエラー "無効な再帰型環境"を取得します。私の研究に基づいて、私は親にタイプ*環境を変更しました。しかし、今、私は、タイプ環境変数の新しい環境を作成する必要があるとき、エラー "タイプ値としてfun_Val.ds(タイプ環境)を使用することはできません"フィールド値の環境を取得します。私は次のように環境を作り出しています:

Environment{fun_Val.ds,fun_Val.param,exp.arg_exp.interp(env)}

私はこの投稿のコードの量を制限するように努めていますが、もっと必要な場合やその他の質問がある場合はお知らせください。

28

2 答え

Environment を次のように定義する必要があります。

type Environment struct {
    parent *Environment//note that this is now a pointer
    symbol string
    value  RCFAEValue
}

それ以外の場合、コンパイラは環境構造体のサイズを把握する方法がありません。ポインタのサイズは分かっていますが、それ自体が入っているものはどれくらいの大きさですか? (そして内部構造体も同様に内部構造体も内部構造体も同様に含まれています。)

環境を作成すると、次のようになります。

Environment{&fun_Val.ds, fun_Val.param, exp.arg_exp.interp(env)}
42
追加された
@ JasonFruitあなたがポインタを使用している限り、それはnullableです。そうでなければ、内側の構造体のスペースを外側の構造体のスペースの一部として割り当てる必要があるため、OPの例のように間違いなく無限になります。
追加された 著者 chakrit,
@Atom、そうではありません:環境構造のサイズは潜在的に無限です。親がnullの環境があるときにチェーンが終了します。その理由から、いくつかのコンパイラがあります。 FPCは、類似の定義を扱うことができます。
追加された 著者 JasonFruit,
なぜ@ JasonFruitのコメントに@ Atomよりももっと多くのアップフォースがあるのですか?それは間違っています。 Golangの値の型はnullでもかまいませんし、C ++やCでもかまいません。値型のフィールドの内容は、使用されているコンテキストに直接格納されるため意味がありません。だから、Golangコンパイラはそれが無限であることを知っています。もちろん、その定義は構造体{A} の型であり、深さは無限であるため、コンパイルすることはできませんが0です。
追加された 著者 John Chadwick,
"それ以外の場合、コンパイラは環境構造体のサイズを把握する方法がありません。"それは偽です。コンパイラは、環境構造のサイズを正確に把握しています。無限です。コンパイラによるこの知識は、コンパイラがコードを拒否し、「無効な再帰型環境」と述べた理由です。
追加された 著者 user811773,

私はこれが問題を解決するはずです:

Environment{&fun_Val.ds,fun_Val.param,exp.arg_exp.interp(env)}

(The & is the 'address of' operator in Go.)

0
追加された