// MatchArgsSign 校验参数是否匹配 func (lambda Lambda) MatchArgsSign(env Env, args ...interface{}) (interface{}, error) { params := make([]interface{}, len(args)) for idx, arg := range args { param, err := Eval(env, arg) if err != nil { return nil, err } params[idx] = param } pxs := lambda.Meta["parameter parsexs"].([]px.Parser) st := px.NewStateInMemory(params) return px.UnionAll(pxs...)(st) }
if err != nil { return nil, err } switch parser := param.(type) { case Parsecer: return ParsecBox(p.Try(parser.Parser)), nil default: return nil, ParsexSignErrorf( "Try Arg Error:except 1 parser arg but %v.", reflect.TypeOf(param)) } }, "either": func(env Env, args ...interface{}) (Lisp, error) { ptype := reflect.TypeOf((px.Parser)(nil)) params, err := GetArgs(env, px.UnionAll(TypeAs(ptype), TypeAs(ptype), px.Eof), args) if err != nil { return nil, err } return ParsecBox(p.Either(params[0].(Parsecer).Parser, params[1].(Parsecer).Parser)), nil }, "choice": func(env Env, args ...interface{}) (Lisp, error) { ptype := reflect.TypeOf((px.Parser)(nil)) params, err := GetArgs(env, px.ManyTil(TypeAs(ptype), px.Eof), args) if err != nil { return nil, err } parsers := make([]p.Parser, len(params)) for idx, prs := range params { if parser, ok := prs.(Parsecer); ok { parsers[idx] = parser.Parser