Documentation ¶
Index ¶
Constants ¶
const ( INTEGER_OBJ = "INTEGER" BOOLEAN_OBJ = "BOOLEAN" NULL_OBJ = "NULL" RETURN_VALUE_OBJ = "RETURN_VALUE" ERROR_OBJ = "ERROR" FUNCTION_OBJ = "FUNCTION" STRING_OBJ = "STRING" BUILDIN_OBJ = "BUILTIN" ARRAY_OBJ = "ARRAY" HASH_OBJ = "HASH" NAMESPACE_OBJ = "NAMESPACE" )
Variables ¶
This section is empty.
Functions ¶
This section is empty.
Types ¶
type Array ¶
type Array struct {
Elements []Object
}
func (*Array) Type ¶
func (a *Array) Type() ObjectType
type Boolean ¶
type Boolean struct {
Value bool
}
func (*Boolean) Type ¶
func (b *Boolean) Type() ObjectType
type Builtin ¶
type Builtin struct {
Fn BuiltinFunction
}
func (*Builtin) Type ¶
func (b *Builtin) Type() ObjectType
type BuiltinFunction ¶
type BuiltinFunction func(env *Environment, args ...Object) Object
NOTE: envを引数に追加 (import, self, outer等は、評価の際今のスコープを知る必要があるため)
type Environment ¶
type Environment struct {
// contains filtered or unexported fields
}
func NewEnclosedEnvironment ¶
func NewEnclosedEnvironment(outer *Environment) *Environment
func NewEnvironment ¶
func NewEnvironment() *Environment
func (*Environment) Inspect ¶
func (e *Environment) Inspect() string
func (*Environment) Outer ¶
func (e *Environment) Outer() *Environment
組み込み関数outer()の評価に必要なためgetterとして追加
type Error ¶
type Error struct {
Message string
}
NOTE: ErrorはReturnValueのように使う (エラーもreturnも「その先の評価を中断し脱出」という点で同じ)
func (*Error) Type ¶
func (e *Error) Type() ObjectType
type Function ¶
type Function struct { Parameters []*ast.Identifier Body *ast.BlockStatement Env *Environment }
EnvをFunctionのフィールドにしたのは、クロージャを実現するため (Envに入るのは関数が作られたときの、この関数のすぐ外側の名前空間。 そのため、関数outer内で関数innerを生成すると、inner内ではouterの束縛は 「outerの外側で呼び出されたときも」参照可能!)
func (*Function) Type ¶
func (f *Function) Type() ObjectType
type Hash ¶
NOTE: map[HashKey]Objectとしてもハッシュにはなるが、keyを参照しづらくなる イテレートするときやkeyとのペアを取得するにはHashPairがあるほうが都合がいい
func (*Hash) Type ¶
func (h *Hash) Type() ObjectType
type HashKey ¶
type HashKey struct { Type ObjectType // Valueが偶然同じでも、型が違えばハッシュキーは等しくない Value uint64 }
NOTE: HashKey()によるハッシュの要素探索 {"name": "Taro"}["name"] 直接Objectどうしを比較しても、.Valueが同じでも別のポインタであるため参照不可能 &String{Value: "name"} != &String{Value: "name"} 一方、全てのkeyの.Valueを使って照合する場合O(n)かかる… => ハッシュキーによりObjectの同値性を確かめる
type Integer ¶
type Integer struct {
Value int64
}
func (*Integer) Type ¶
func (i *Integer) Type() ObjectType
type NameSpace ¶
type NameSpace struct {
Env *Environment
}
func (*NameSpace) Type ¶
func (ns *NameSpace) Type() ObjectType
type Object ¶
type Object interface { Type() ObjectType Inspect() string }
NOTE: 内部表現によってフィールドが違う(boolとint等)のでstructではなくinterface
type ReturnValue ¶
type ReturnValue struct {
Value Object
}
func (*ReturnValue) Inspect ¶
func (rv *ReturnValue) Inspect() string
func (*ReturnValue) Type ¶
func (rv *ReturnValue) Type() ObjectType