|
@@ -76,8 +76,7 @@ func NewEnvironment(parent, me, to Object, args ...Object) *Environment {
|
|
return res
|
|
return res
|
|
}
|
|
}
|
|
|
|
|
|
-func Send(to Object, message string, me, here Object, args ...Object) Object {
|
|
|
|
- env := NewEnvironment(here, me, to, args...)
|
|
|
|
|
|
+func SendInEnv(to Object, message string, env Object) Object {
|
|
lookup := to
|
|
lookup := to
|
|
value := lookup.Slots().Get(message)
|
|
value := lookup.Slots().Get(message)
|
|
for value == Nil {
|
|
for value == Nil {
|
|
@@ -90,6 +89,11 @@ func Send(to Object, message string, me, here Object, args ...Object) Object {
|
|
return value.Run(env)
|
|
return value.Run(env)
|
|
}
|
|
}
|
|
|
|
|
|
|
|
+func Send(to Object, message string, me, here Object, args ...Object) Object {
|
|
|
|
+ env := NewEnvironment(here, me, to, args...)
|
|
|
|
+ return SendInEnv(to, message, env)
|
|
|
|
+}
|
|
|
|
+
|
|
type Instance struct {
|
|
type Instance struct {
|
|
name string
|
|
name string
|
|
slots Slots
|
|
slots Slots
|
|
@@ -103,14 +107,14 @@ func (i Instance) Slots() Slots {
|
|
return i.slots
|
|
return i.slots
|
|
}
|
|
}
|
|
|
|
|
|
-func (i Instance) Effect() Effect {
|
|
|
|
- return EffectNone
|
|
|
|
-}
|
|
|
|
-
|
|
|
|
func (i Instance) Run(env Object) Object {
|
|
func (i Instance) Run(env Object) Object {
|
|
return i
|
|
return i
|
|
}
|
|
}
|
|
|
|
|
|
|
|
+func (i Instance) Effect() Effect {
|
|
|
|
+ return EffectNone
|
|
|
|
+}
|
|
|
|
+
|
|
func (i *Instance) Set(name string, inst Object) *Instance {
|
|
func (i *Instance) Set(name string, inst Object) *Instance {
|
|
i.slots.Set(name, inst)
|
|
i.slots.Set(name, inst)
|
|
return i
|
|
return i
|
|
@@ -305,10 +309,14 @@ func (s Error) String() string {
|
|
return fmt.Sprintf("%s", s.Error)
|
|
return fmt.Sprintf("%s", s.Error)
|
|
}
|
|
}
|
|
|
|
|
|
-func NewError(name string, Slots Slots, err error) Error {
|
|
|
|
|
|
+func NewErrorBasic(name string, err error) Error {
|
|
return Error{Instance: NewInstance(name), Error: err}
|
|
return Error{Instance: NewInstance(name), Error: err}
|
|
}
|
|
}
|
|
|
|
|
|
|
|
+func NewError(err string) Error {
|
|
|
|
+ return NewErrorBasic("error", fmt.Errorf("error: %s", err))
|
|
|
|
+}
|
|
|
|
+
|
|
type Int struct {
|
|
type Int struct {
|
|
*Instance
|
|
*Instance
|
|
Int int64
|
|
Int int64
|
|
@@ -322,6 +330,22 @@ func (i Int) String() string {
|
|
return fmt.Sprintf("%d", i.Int)
|
|
return fmt.Sprintf("%d", i.Int)
|
|
}
|
|
}
|
|
|
|
|
|
|
|
+type Statement struct {
|
|
|
|
+ *Instance
|
|
|
|
+ Command Object
|
|
|
|
+ Param List
|
|
|
|
+}
|
|
|
|
+
|
|
|
|
+func (s Statement) String() string {
|
|
|
|
+ return fmt.Sprintf("%s %s.", s.Command.Name(), s.Param.Name())
|
|
|
|
+}
|
|
|
|
+
|
|
|
|
+func (s Statement) Run(env Object) Object {
|
|
|
|
+ cenv := env.Clone()
|
|
|
|
+ cenv.Slots().Set(ArgsSlot, s.Param)
|
|
|
|
+ return SendInEnv(env, s.Command.Name(), cenv)
|
|
|
|
+}
|
|
|
|
+
|
|
var _ Object = Error{}
|
|
var _ Object = Error{}
|
|
var _ Object = String("")
|
|
var _ Object = String("")
|
|
var _ Object = Int{}
|
|
var _ Object = Int{}
|