func scm_define(args *goscm.Pair, env *goscm.Environ) (goscm.SCMT, error) { symb := args.Car switch reflect.TypeOf(symb) { case reflect.TypeOf(&goscm.Symbol{}): tobind, err := args.Cdr.(*goscm.Pair).Car.Eval(env) if err != nil { return goscm.SCM_Nil, err } env.Add(symb.(*goscm.Symbol), tobind) return symb, nil case reflect.TypeOf(&goscm.Pair{}): name := symb.(*goscm.Pair).Car.(*goscm.Symbol) proc_args := symb.(*goscm.Pair).Cdr proc_body := args.Cdr proc_tail := goscm.Cons(proc_args, proc_body) proc, err := scm_lambda(proc_tail, env) if err != nil { return goscm.SCM_Nil, err } env.Add(name, proc) return name, nil default: return goscm.SCM_Nil, errors.New("Attempting to define type: " + reflect.TypeOf(symb).String()) } }
func scm_set_bang(args *goscm.Pair, env *goscm.Environ) (goscm.SCMT, error) { symb := args.Car.(*goscm.Symbol) val, err := args.Cdr.(*goscm.Pair).Car.Eval(env) if err != nil { return goscm.SCM_Nil, err } return symb, env.Set(symb, val) }