|
@@ -17,6 +17,7 @@ func (s Slots) Get(name string) Object {
|
|
|
return res
|
|
|
}
|
|
|
|
|
|
+
|
|
|
func (s Slots) Clone() Slots {
|
|
|
clone := Slots{}
|
|
|
for k, v := range s {
|
|
@@ -24,6 +25,7 @@ func (s Slots) Clone() Slots {
|
|
|
}
|
|
|
return clone
|
|
|
}
|
|
|
+*/
|
|
|
|
|
|
|
|
|
const (
|
|
@@ -33,32 +35,82 @@ const (
|
|
|
ArgsSlot = "*args"
|
|
|
)
|
|
|
|
|
|
-
|
|
|
-type Effect int
|
|
|
+
|
|
|
+
|
|
|
+type IsReturner interface{ IsReturn() }
|
|
|
|
|
|
-
|
|
|
-const (
|
|
|
- EffectNone Effect = 0
|
|
|
- EffectBreak Effect = 1
|
|
|
- EffectReturn Effect = 2
|
|
|
- EffectThrow Effect = 4
|
|
|
-)
|
|
|
+
|
|
|
+
|
|
|
+type IsBreaker interface{ IsBreak() }
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+type IsThrower interface{ IsThrow() }
|
|
|
+
|
|
|
+
|
|
|
+type Type string
|
|
|
+
|
|
|
+
|
|
|
+type Message struct {
|
|
|
+ Name string
|
|
|
+ Args []Object
|
|
|
+ Env Object
|
|
|
+ Actor
|
|
|
+}
|
|
|
+
|
|
|
+func (m Message) String() string {
|
|
|
+ return "message: " + m.Name
|
|
|
+}
|
|
|
+
|
|
|
+func (Message) Type() Type {
|
|
|
+ return Type("message")
|
|
|
+}
|
|
|
+
|
|
|
+func (m Message) Value(env Object) Object {
|
|
|
+ return m
|
|
|
+}
|
|
|
+
|
|
|
+func (m Message) Send(Message) Object {
|
|
|
+ return m
|
|
|
+}
|
|
|
|
|
|
|
|
|
type Object interface {
|
|
|
- Name() string
|
|
|
- Slots() Slots
|
|
|
- Run(env Object) Object
|
|
|
- Effect() Effect
|
|
|
- Clone() Object
|
|
|
+
|
|
|
+ String() string
|
|
|
+
|
|
|
+ Type() Type
|
|
|
+
|
|
|
+ Value(env Object) Object
|
|
|
+
|
|
|
+ Send(msg Message) Object
|
|
|
}
|
|
|
|
|
|
-var Nil Object = NewInstance("nil")
|
|
|
+type NilObject struct{}
|
|
|
+
|
|
|
+func (NilObject) String() string {
|
|
|
+ return "nil"
|
|
|
+}
|
|
|
+
|
|
|
+func (NilObject) Value(env Object) Object {
|
|
|
+ return nil
|
|
|
+}
|
|
|
+
|
|
|
+func (NilObject) Type() Type {
|
|
|
+ return Type("nil")
|
|
|
+}
|
|
|
+
|
|
|
+func (NilObject) Send(Message) Object {
|
|
|
+ return Nil
|
|
|
+}
|
|
|
+
|
|
|
+var Nil Object = NilObject{}
|
|
|
|
|
|
func ParentOf(val Object) Object {
|
|
|
- return val.Slots().Get(ParentSlot)
|
|
|
+ return val.Send(Message{Name: ParentSlot})
|
|
|
}
|
|
|
|
|
|
+
|
|
|
type Environment struct {
|
|
|
Instance
|
|
|
}
|
|
@@ -86,33 +138,50 @@ func SendInEnv(to Object, message string, env Object) Object {
|
|
|
}
|
|
|
value = lookup.Slots().Get(message)
|
|
|
}
|
|
|
- return value.Run(env)
|
|
|
+ return value.Value(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
|
|
|
+
|
|
|
+ kind Type
|
|
|
+
|
|
|
slots Slots
|
|
|
}
|
|
|
|
|
|
-func (i Instance) Name() string {
|
|
|
- return i.name
|
|
|
+
|
|
|
+func (i Instance) String() string {
|
|
|
+ res := string(i.kind) + " { "
|
|
|
+ for k, v := range i.slots {
|
|
|
+ res += "\n" + k + ":" + v.String()
|
|
|
+ }
|
|
|
+ res += " } "
|
|
|
+ return res
|
|
|
}
|
|
|
|
|
|
-func (i Instance) Slots() Slots {
|
|
|
- return i.slots
|
|
|
+func (i Instance) Type() Type {
|
|
|
+ return Type(i.kind)
|
|
|
}
|
|
|
|
|
|
-func (i Instance) Run(env Object) Object {
|
|
|
+func (i Instance) Value(env Object) Object {
|
|
|
return i
|
|
|
}
|
|
|
|
|
|
-func (i Instance) Effect() Effect {
|
|
|
- return EffectNone
|
|
|
+func (i Instance) Send(message Message) Object {
|
|
|
+ value := i.slots.Get(message.Name)
|
|
|
+ if value == nil || value == Nil {
|
|
|
+
|
|
|
+ return Nil
|
|
|
+ }
|
|
|
+ return value.Value(message.Env)
|
|
|
}
|
|
|
|
|
|
func (i *Instance) Set(name string, inst Object) *Instance {
|
|
@@ -120,51 +189,37 @@ func (i *Instance) Set(name string, inst Object) *Instance {
|
|
|
return i
|
|
|
}
|
|
|
|
|
|
-func (i Instance) DeepCopy() Instance {
|
|
|
- return Instance{name: i.name + "", slots: i.slots.Clone()}
|
|
|
-}
|
|
|
-
|
|
|
-func (i Instance) Clone() Object {
|
|
|
- return i.DeepCopy()
|
|
|
-}
|
|
|
-
|
|
|
-func NewInstance(name string) *Instance {
|
|
|
- return &Instance{name: name, slots: Slots{}}
|
|
|
+func NewInstance(kind string) *Instance {
|
|
|
+ return &Instance{kind: Type(kind), slots: Slots{}}
|
|
|
}
|
|
|
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
type Primitive func(env Object) Object
|
|
|
|
|
|
-func (p Primitive) Name() string {
|
|
|
- return "primitive"
|
|
|
+func (p Primitive) Type() Type {
|
|
|
+ return Type("primitive")
|
|
|
}
|
|
|
|
|
|
-func (p Primitive) Slots() Slots {
|
|
|
- emptySlots := Slots{}
|
|
|
- return emptySlots
|
|
|
+func (p Primitive) Send(m Message) Object {
|
|
|
+ return p.Value(m)
|
|
|
}
|
|
|
|
|
|
-func (p Primitive) Effect() Effect {
|
|
|
- return EffectNone
|
|
|
-}
|
|
|
-
|
|
|
-func (p Primitive) Run(env Object) Object {
|
|
|
+func (p Primitive) Value(env Object) Object {
|
|
|
return p(env)
|
|
|
}
|
|
|
|
|
|
-func (p Primitive) Clone() Object {
|
|
|
- return p
|
|
|
-}
|
|
|
-
|
|
|
func Self(o Object) Object {
|
|
|
- return o.Slots().Get(SelfSlot)
|
|
|
+ return o.Send(Message{Name: SelfSlot})
|
|
|
}
|
|
|
|
|
|
func Me(o Object) Object {
|
|
|
- return o.Slots().Get(MeSlot)
|
|
|
+ return o.Send(Message{Name: MeSlot})
|
|
|
}
|
|
|
|
|
|
func Args(o Object) List {
|
|
|
- list := o.Slots().Get(ArgsSlot)
|
|
|
+ list := o.Send(Message{Name: ArgsSlot})
|
|
|
if list == Nil {
|
|
|
return List{}
|
|
|
}
|
|
@@ -185,136 +240,68 @@ func Nullary(nullary func() Object) Primitive {
|
|
|
|
|
|
type String string
|
|
|
|
|
|
-func (s String) Name() string {
|
|
|
+func (s String) String() string {
|
|
|
return string(s)
|
|
|
}
|
|
|
|
|
|
-var StringType Object = NewInstance("String").
|
|
|
- Set(ParentSlot, RootType)
|
|
|
-
|
|
|
-var StringSlots Slots = Slots{}.Set(ParentSlot, StringType)
|
|
|
-
|
|
|
-func (s String) Slots() Slots {
|
|
|
- return StringSlots
|
|
|
+func (s String) Type() Type {
|
|
|
+ return Type("string")
|
|
|
}
|
|
|
|
|
|
-func (s String) Effect() Effect {
|
|
|
- return EffectNone
|
|
|
+func (p String) Send(m Message) Object {
|
|
|
+
|
|
|
+ return Nil
|
|
|
}
|
|
|
|
|
|
-func (s String) Run(env Object) Object {
|
|
|
+func (s String) Value(env Object) Object {
|
|
|
return s
|
|
|
}
|
|
|
|
|
|
-func (s String) Clone() Object {
|
|
|
- return String(s + "")
|
|
|
-}
|
|
|
-
|
|
|
-func NameOf(o Object) Object {
|
|
|
- return String(o.Name())
|
|
|
-}
|
|
|
+type List []Object
|
|
|
|
|
|
-func NameString(o Object) func() Object {
|
|
|
- return func() Object {
|
|
|
- return NameOf(o)
|
|
|
- }
|
|
|
+func (l List) Type() Type {
|
|
|
+ return Type("list")
|
|
|
}
|
|
|
|
|
|
-var RootType Object = NewInstance("Type").Set("name", Unary(NameOf))
|
|
|
-
|
|
|
-type List []Object
|
|
|
-
|
|
|
-func (l List) Name() string {
|
|
|
+func (l List) String() string {
|
|
|
res := fmt.Sprintf("list: ")
|
|
|
sep := ""
|
|
|
for _, o := range l {
|
|
|
- res = fmt.Sprintf("%s %s %s", res, sep, o.Name())
|
|
|
+ res = fmt.Sprintf("%s %s %s", res, sep, o.String())
|
|
|
sep = "and"
|
|
|
}
|
|
|
res += ";"
|
|
|
return res
|
|
|
}
|
|
|
|
|
|
-var ListType Object = NewInstance("List").
|
|
|
- Set(ParentSlot, RootType)
|
|
|
-
|
|
|
-var ListSlots Slots = Slots{}.Set(ParentSlot, ListType)
|
|
|
-
|
|
|
-func (l List) Slots() Slots {
|
|
|
- return ListSlots
|
|
|
+func (l List) Send(m Message) Object {
|
|
|
+
|
|
|
+ return Nil
|
|
|
}
|
|
|
|
|
|
-func (l List) Effect() Effect {
|
|
|
- return EffectNone
|
|
|
-}
|
|
|
-
|
|
|
-func (l List) Run(env Object) Object {
|
|
|
+func (l List) Value(env Object) Object {
|
|
|
return l
|
|
|
}
|
|
|
|
|
|
-func (l List) DeepCopy() List {
|
|
|
- res := List{}
|
|
|
- for _, o := range l {
|
|
|
- res = append(res, o.Clone())
|
|
|
- }
|
|
|
- return res
|
|
|
-}
|
|
|
-
|
|
|
-func (l List) Clone() Object {
|
|
|
- return l.DeepCopy()
|
|
|
-}
|
|
|
-
|
|
|
-
|
|
|
-var RootType Object = NewInstance("Type").Slot("string")
|
|
|
-var InstanceType Type = NewType("Instance", &RootType, nil)
|
|
|
-var ErrorType Type = NewType("Error", &InstanceType, nil)
|
|
|
-var StringType Type = NewType("String", &InstanceType, nil)
|
|
|
-var IntType Type = NewType("Int", &InstanceType, nil)
|
|
|
-var ListType Type = NewType("List", &InstanceType, nil)
|
|
|
-var MethodType Type = NewType("Method", &InstanceType, nil)
|
|
|
-*/
|
|
|
-
|
|
|
type Error struct {
|
|
|
*Instance
|
|
|
Error error
|
|
|
}
|
|
|
|
|
|
-func (e Error) Name() string {
|
|
|
- return string(fmt.Sprintf("error `%s`", e.Error))
|
|
|
-}
|
|
|
-
|
|
|
-var ErrorType Object = NewInstance("Error").
|
|
|
- Set(ParentSlot, RootType)
|
|
|
-
|
|
|
-var ErrorSlots Slots = Slots{}.Set(ParentSlot, ErrorType)
|
|
|
-
|
|
|
-func (e Error) Slots() Slots {
|
|
|
- return ErrorSlots
|
|
|
-}
|
|
|
-
|
|
|
-func (e Error) Effect() Effect {
|
|
|
- return EffectThrow
|
|
|
+func (e Error) String() string {
|
|
|
+ return fmt.Sprintf("error `%s`", e.Error)
|
|
|
}
|
|
|
|
|
|
-func (e Error) Run(env Object) Object {
|
|
|
+func (e Error) Value(env Object) Object {
|
|
|
return e
|
|
|
}
|
|
|
|
|
|
-func (e Error) Clone() Object {
|
|
|
- i := e.Instance.Clone().(Instance)
|
|
|
- return Error{&i, e.Error}
|
|
|
-}
|
|
|
-
|
|
|
-func (s Error) String() string {
|
|
|
- return fmt.Sprintf("%s", s.Error)
|
|
|
-}
|
|
|
-
|
|
|
-func NewErrorBasic(name string, err error) Error {
|
|
|
- return Error{Instance: NewInstance(name), Error: err}
|
|
|
+func NewErrorBasic(err error) Error {
|
|
|
+ return Error{Instance: NewInstance("error"), Error: err}
|
|
|
}
|
|
|
|
|
|
func NewError(err string) Error {
|
|
|
- return NewErrorBasic("error", fmt.Errorf("error: %s", err))
|
|
|
+ return NewErrorBasic(fmt.Errorf("%s", err))
|
|
|
}
|
|
|
|
|
|
type Int struct {
|
|
@@ -322,14 +309,18 @@ type Int struct {
|
|
|
Int int64
|
|
|
}
|
|
|
|
|
|
-func NewInt(name string, Slots Slots, i int64) Int {
|
|
|
- return Int{Instance: NewInstance(name), Int: i}
|
|
|
+func NewInt(i int64) Int {
|
|
|
+ return Int{Instance: NewInstance("int"), Int: i}
|
|
|
}
|
|
|
|
|
|
func (i Int) String() string {
|
|
|
return fmt.Sprintf("%d", i.Int)
|
|
|
}
|
|
|
|
|
|
+func (i Int) Value(env Object) Object {
|
|
|
+ return i
|
|
|
+}
|
|
|
+
|
|
|
type Statement struct {
|
|
|
*Instance
|
|
|
Command Object
|
|
@@ -337,14 +328,15 @@ type Statement struct {
|
|
|
}
|
|
|
|
|
|
func (s Statement) String() string {
|
|
|
- return fmt.Sprintf("%s %s.", s.Command.Name(), s.Param.Name())
|
|
|
+ return fmt.Sprintf("%s %s.", s.Command.String(), s.Param.String())
|
|
|
}
|
|
|
|
|
|
-func (s Statement) Run(env Object) Object {
|
|
|
- cenv := env.Clone()
|
|
|
+
|
|
|
+func (s Statement) Value(env Object) Object {
|
|
|
+ cenv := env
|
|
|
cenv.Slots().Set(ArgsSlot, s.Param)
|
|
|
return SendInEnv(env, s.Command.Name(), cenv)
|
|
|
-}
|
|
|
+}*/
|
|
|
|
|
|
var _ Object = Error{}
|
|
|
var _ Object = String("")
|