我是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)}
我正在尝试将此帖子中的代码数量限制在一个限制内,但如果您需要更多或有其他问题,请告知我们。
答案 0 :(得分:55)
您需要将Environment
定义为:
type Environment struct {
parent *Environment // note that this is now a pointer
symbol string
value RCFAEValue
}
否则编译器无法弄清楚Environment结构的大小。指针的大小是已知的,但包含自身的东西有多大? (并且内部结构也包含自身,内部结构也是如此,等等。)
创建环境将如下所示:
Environment{&fun_Val.ds, fun_Val.param, exp.arg_exp.interp(env)}
答案 1 :(得分:1)
我希望这可以解决问题:
Environment{&fun_Val.ds,fun_Val.param,exp.arg_exp.interp(env)}
(&
是Go中的'地址'运算符。)