Example #1
0
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())
	}
}
Example #2
0
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)
}