123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125 |
- package value
- import "fmt"
- type Members map[string]Value
- type Value interface {
- Name() string
- // Proto/type of the value.
- Type() Type
- String() string
- Members() Members
- }
- // A type is also a value
- type Type Value
- var TypeType Type = NewObject("Type", nil, nil)
- var ObjectType Type = NewObject("Object", TypeType, nil)
- var ErrorType Type = NewObject("Error", ObjectType, nil)
- var StringType Type = NewObject("String", ObjectType, nil)
- var IntType Type = NewObject("Int", ObjectType, nil)
- var ListType Type = NewObject("List", ObjectType, nil)
- var MethodType Type = NewObject("Method", ObjectType, nil)
- type Object struct {
- name string
- typ Type
- members Members
- }
- func (o Object) String() string {
- return fmt.Sprintf("%s: %d", o.typ, o.name)
- }
- func (o Object) Name() string {
- return o.name
- }
- func (o Object) Members() Members {
- return o.members
- }
- func (o Object) Type() Type {
- return o.typ
- }
- func NewObject(name string, typ Type, members Members) Object {
- return Object{name: name, typ: typ, members: members}
- }
- type Error struct {
- Object
- Value error
- }
- func (s Error) String() string {
- return fmt.Sprintf("%w", s.Value)
- }
- func NewError(name string, members Members, value error) Error {
- return Error{Object: NewObject(name, ErrorType, members),
- Value: value}
- }
- type String struct {
- Object
- Value string
- }
- func (s String) String() string {
- return s.Value
- }
- func NewString(name string, members Members, value string) String {
- return String{Object: NewObject(name, StringType, members),
- Value: value}
- }
- type Int struct {
- Object
- Value int64
- }
- func NewInt(name string, members Members, value int64) Int {
- return Int{Object: NewObject(name, IntType, members),
- Value: value}
- }
- func (i Int) String() string {
- return fmt.Sprintf("%d", i.Value)
- }
- type List struct {
- Object
- Value []Value
- }
- func NewList(name string, members Members, value ...Value) List {
- return List{Object: NewObject(name, ListType, members),
- Value: value}
- }
- func (l List) String() string {
- return fmt.Sprintf("[%v]", l.Value)
- }
- type Method struct {
- Object
- Value func(env Value, self Value, args ...Value) List
- }
- func NewMethod(name string, members Members,
- value func(env Value, self Value, args ...Value) List) Method {
- return Method{Object: NewObject(name, MethodType, members),
- Value: value}
- }
- func (m Method) String() string {
- return fmt.Sprintf("Method: %s", m.Name)
- }
- var _ Value = String{}
- var _ Value = Int{}
- var _ Value = List{}
|