aboutsummaryrefslogtreecommitdiff
path: root/go/src/types/types.go
diff options
context:
space:
mode:
Diffstat (limited to 'go/src/types/types.go')
-rw-r--r--go/src/types/types.go27
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 {