Ejemplo n.º 1
0
// IntParser 解析整数
func IntParser(st p.State) (interface{}, error) {
	i, err := p.Int(st)
	if err == nil {
		val, err := strconv.Atoi(i.(string))
		if err == nil {
			return Int(val), nil
		}
		return nil, err
	}
	return nil, err

}
Ejemplo n.º 2
0
		"digit": ParsecBox(p.Digit),
		"int": func(env Env, args ...interface{}) (Lisp, error) {
			if len(args) != 1 {
				return nil, fmt.Errorf("int Arg Error:expect args has 1 arg")
			}
			param, err := Eval(env, args[0])
			if err != nil {
				return nil, err
			}
			var i Int
			var ok bool
			if i, ok = param.(Int); !ok {
				return nil, fmt.Errorf("int Arg Error:expect 1 string arg")
			}
			return ParsecBox(func(st p.State) (interface{}, error) {
				data, err := p.Int(st)
				if err != nil {
					return nil, st.Trap("gisp parsex error:expect a int but error: %v", err)
				}
				if Int(data.(int)) != i {
					return nil, st.Trap("gisp parsex error:expect a Int but %v", data)
				}
				return data, nil
			}), nil
		},
		"float": func(env Env, args ...interface{}) (Lisp, error) {
			if len(args) != 1 {
				return nil, fmt.Errorf("float Arg Error:expect args has 1 arg")
			}
			param, err := Eval(env, args[0])
			if err != nil {