一尘不染

go结构中的无效递归类型

go

我是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)
}

但是我收到错误“无效的递归类型环境”。根据我的研究,我将父级更改为
Environment。但是现在,当我需要创建一个环境类型为var的新环境时,它会收到错误消息“无法将fun_Val.ds(环境类型)用作
环境值类型”。我正在如下创建环境:

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

我试图将这篇文章中的代码量限制在一定范围内,但是如果您需要更多或有其他问题,请告诉我。


阅读 211

收藏
2020-07-02

共1个答案

一尘不染

您需要定义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)}
2020-07-02