Refactor VM and operators
Some checks failed
Build / build (push) Failing after 5m54s
Publish Image / publish (push) Failing after 44s
Test / build (push) Failing after 5m21s

This commit is contained in:
Chuck Smith
2024-03-29 17:59:34 -04:00
parent 7435a993d9
commit 3b6df3e813
11 changed files with 979 additions and 639 deletions

View File

@@ -75,6 +75,46 @@ func (h *Hash) String() string {
return h.Inspect()
}
func (h *Hash) Add(other Object) (Object, error) {
if other.Type() != h.Type() {
return nil, NewBinaryOpError(h, other, "+")
}
pairs := make(map[HashKey]HashPair)
for k, v := range h.Pairs {
pairs[k] = v
}
for k, v := range other.(*Hash).Pairs {
pairs[k] = v
}
return &Hash{Pairs: pairs}, nil
}
func (h *Hash) Get(index Object) (Object, error) {
key, ok := index.(Hashable)
if !ok {
return nil, fmt.Errorf("invalid hash key %s", index.Type())
}
pair, found := h.Pairs[key.HashKey()]
if !found {
return &Null{}, nil
}
return pair.Value, nil
}
func (h *Hash) Set(index, other Object) error {
key, ok := index.(Hashable)
if !ok {
return fmt.Errorf("invalid hash key %s", index.Type())
}
h.Pairs[key.HashKey()] = HashPair{Key: index, Value: other}
return nil
}
func (h *Hash) Compare(other Object) int {
if obj, ok := other.(*Hash); ok {
if len(h.Pairs) != len(obj.Pairs) {