Browse Source

Add Statement type.

Beoran 2 years ago
parent
commit
73dff48350
1 changed files with 31 additions and 7 deletions
  1. 31 7
      selsl/object.go

+ 31 - 7
selsl/object.go

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