diff options
Diffstat (limited to 'go/src/types/types.go')
| -rw-r--r-- | go/src/types/types.go | 27 |
1 files changed, 23 insertions, 4 deletions
diff --git a/go/src/types/types.go b/go/src/types/types.go index f0ab427..c79810f 100644 --- a/go/src/types/types.go +++ b/go/src/types/types.go @@ -35,10 +35,12 @@ func Symbol_Q(obj MalType) bool { // Functions type MalFunc struct { - Eval func(MalType, EnvType) (MalType, error) - Exp MalType - Env EnvType - Params MalType + Eval func(MalType, EnvType) (MalType, error) + Exp MalType + Env EnvType + Params MalType + IsMacro bool + GenEnv func(EnvType, []MalType, []MalType) (EnvType, error) } func MalFunc_Q(obj MalType) bool { @@ -48,6 +50,23 @@ func MalFunc_Q(obj MalType) bool { } } +func (f MalFunc) SetMacro() MalType { + f.IsMacro = true + return f +} + +func (f MalFunc) GetMacro() bool { + return f.IsMacro +} + +func (f MalFunc) Apply(a []MalType) (MalType, error) { + slc, e := GetSlice(f.Params) + if e != nil { return nil, e } + env, e := f.GenEnv(f.Env, slc, a) + if e != nil { return nil, e } + return f.Eval(f.Exp, env) +} + // Lists type List struct { |
