From 82efc357ba67da1eaf35ca92b6f249a344aae8d5 Mon Sep 17 00:00:00 2001 From: Joel Martin Date: Mon, 6 Oct 2014 23:53:51 -0500 Subject: go: add step8_macros --- go/src/types/types.go | 27 +++++++++++++++++++++++---- 1 file changed, 23 insertions(+), 4 deletions(-) (limited to 'go/src/types') 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 { -- cgit v1.2.3