diff options
| author | Joel Martin <github@martintribe.org> | 2014-10-06 23:53:51 -0500 |
|---|---|---|
| committer | Joel Martin <github@martintribe.org> | 2014-10-06 23:53:51 -0500 |
| commit | 82efc357ba67da1eaf35ca92b6f249a344aae8d5 (patch) | |
| tree | 1cdf298c1c971a3bdecec1e31727ea8f214eedef /go/src/types/types.go | |
| parent | aeabd2145ff133cc6991166d8f1023ed33e223c8 (diff) | |
| download | mal-82efc357ba67da1eaf35ca92b6f249a344aae8d5.tar.gz mal-82efc357ba67da1eaf35ca92b6f249a344aae8d5.zip | |
go: add step8_macros
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 { |
