Skip to content

Commit

Permalink
Expression serialization using Gob.
Browse files Browse the repository at this point in the history
  • Loading branch information
corywalker committed Nov 9, 2018
1 parent be34356 commit 17ffa92
Show file tree
Hide file tree
Showing 4 changed files with 69 additions and 2 deletions.
14 changes: 14 additions & 0 deletions expreduce/atoms/gob.go
@@ -0,0 +1,14 @@
package atoms

import "encoding/gob"

// RegisterGobAtoms performs gob registration for the atoms package.
func RegisterGobAtoms() {
gob.RegisterName("E", Expression{})
gob.RegisterName("S", Symbol{})
gob.RegisterName("C", Complex{})
gob.RegisterName("I", Integer{})
gob.RegisterName("R", Rational{})
gob.RegisterName("F", Flt{})
gob.RegisterName("T", String{})
}
49 changes: 49 additions & 0 deletions expreduce/builtin_system.go
@@ -1,6 +1,7 @@
package expreduce

import (
"encoding/gob"
"flag"
"fmt"
"io/ioutil"
Expand Down Expand Up @@ -645,6 +646,54 @@ func getSystemDefinitions() (defs []Definition) {
return EvalInterpMany(fileData, rawPath, es)
},
})
defs = append(defs, Definition{
Name: "Save",
legacyEvalFn: func(this expreduceapi.ExpressionInterface, es expreduceapi.EvalStateInterface) expreduceapi.Ex {
if this.Len() != 2 {
return this
}

filenameStr, ok := this.GetPart(1).(*atoms.String)
if !ok {
return this
}
filename := filenameStr.GetValue()

definitions := []expreduceapi.Def{}
symList, ok := atoms.HeadAssertion(this.GetPart(2), "System`List")
if !ok {
return this
}
for _, symEx := range symList.GetParts()[1:] {
symStr, symIsStr := symEx.(*atoms.String)
if !symIsStr {
return this
}
def, ok := es.GetDefined(symStr.GetValue())
if !ok {
return this
}
definitions = append(definitions, def)
}
fmt.Println(len(definitions))
if len(definitions) == 0 {
return this
}

atoms.RegisterGobAtoms()

file, err := os.Create(filename)
if err == nil {
encoder := gob.NewEncoder(file)
if err := encoder.Encode(definitions); err != nil {
panic(err)
}
}
file.Close()

return atoms.NewSymbol("System`Null")
},
})
defs = append(defs, Definition{
Name: "Module",
legacyEvalFn: func(this expreduceapi.ExpressionInterface, es expreduceapi.EvalStateInterface) expreduceapi.Ex {
Expand Down
4 changes: 2 additions & 2 deletions expreduce/resources.go

Large diffs are not rendered by default.

4 changes: 4 additions & 0 deletions expreduce/resources/system.m
Expand Up @@ -127,6 +127,10 @@
Get::usage = "`Get[file]` loads `file` and returns the last expression.";
Attributes[Get] = {Protected};

Save::usage = "`Save[filename, {sym1, sym2, ...}]` saves a list of symbols into a file."
Save[fn_String, pattern_String] := Save[fn, syms] /. syms -> Names[pattern];
Attributes[Save] = {HoldRest, Protected};

Module::usage = "`Module[{locals}, expr]` evaluates `expr` with the local variables `locals`.";
Attributes[Module] = {HoldAll, Protected};
Tests`Module = {
Expand Down

0 comments on commit 17ffa92

Please sign in to comment.