diff --git a/src/contexts/cli/cli.go b/src/contexts/cli/cli.go index 71fb357a..b0254c49 100644 --- a/src/contexts/cli/cli.go +++ b/src/contexts/cli/cli.go @@ -300,9 +300,6 @@ var Index = &ctx.Context{Name: "cli", Help: "管理中心", if len(cmd.Env) > 0 { m.Log("info", "env %v", cmd.Env) } - for _, k := range []string{"PATH", "HOME"} { - cmd.Env = append(cmd.Env, fmt.Sprintf("%s=%s", k, os.Getenv(k))) - } // 交互命令 if m.Options("cmd_active") || kit.Right(conf["active"]) { diff --git a/src/contexts/cli/version.go b/src/contexts/cli/version.go index 1e935526..07e4e6c7 100644 --- a/src/contexts/cli/version.go +++ b/src/contexts/cli/version.go @@ -4,5 +4,5 @@ var version = struct { host string self int }{ - "2019-08-01 17:49:56", "ZYB-20190522USI", 350, + "2019-08-02 22:20:17", "ZYB-20190522USI", 367, } diff --git a/src/contexts/ctx/ctx.go b/src/contexts/ctx/ctx.go index 1b753062..47f0c6bb 100644 --- a/src/contexts/ctx/ctx.go +++ b/src/contexts/ctx/ctx.go @@ -815,7 +815,8 @@ var Index = &Context{Name: "ctx", Help: "模块中心", Server: &CTX{}, } msg := m.Optionv("bio.msg").(*Message) - if len(arg) == 0 { + switch len(arg) { + case 0: vals := map[string]interface{}{} list := []string{} @@ -841,13 +842,15 @@ var Index = &Context{Name: "ctx", Help: "模块中心", Server: &CTX{}, m.Push("val", kit.Format(vals[k])) } m.Table() - return - } - switch v := msg.Optionv(arg[0]).(type) { - case []string: - m.Echo(strings.Join(v, "")) + case 1: + switch v := msg.Optionv(arg[0]).(type) { + case []string: + m.Echo(strings.Join(v, "")) + default: + m.Echo(kit.Format(v)) + } default: - m.Echo(kit.Format(v)) + m.Echo(m.Option(arg[0], arg[1])) } return }}, diff --git a/src/contexts/web/web.go b/src/contexts/web/web.go index b1df8ff7..94ccc0c4 100644 --- a/src/contexts/web/web.go +++ b/src/contexts/web/web.go @@ -563,8 +563,8 @@ var Index = &ctx.Context{Name: "web", Help: "应用中心", data = kit.Chain(data, k, v[0]) } } else { - for _, val := range v { - if i, e := strconv.Atoi(v[0]); e == nil { + for i, val := range v { + if i, e := strconv.Atoi(v[i]); e == nil { data = kit.Chain(data, []string{k, "-2"}, i) } else { data = kit.Chain(data, []string{k, "-2"}, val) diff --git a/src/contexts/yac/yac.go b/src/contexts/yac/yac.go index 13cd468e..2b66a6f0 100644 --- a/src/contexts/yac/yac.go +++ b/src/contexts/yac/yac.go @@ -2,7 +2,8 @@ package yac import ( "contexts/ctx" - "toolkit" + "sort" + kit "toolkit" "fmt" "os" @@ -334,7 +335,12 @@ var Index = &ctx.Context{Name: "yac", Help: "语法中心", map[string]interface{}{"page": "exe", "hash": "exe", "word": []interface{}{"$", "(", "cmd", ")"}}, map[string]interface{}{"page": "stm", "hash": "var", "word": []interface{}{"var", "key", "opt{", "=", "exp", "}"}}, map[string]interface{}{"page": "stm", "hash": "let", "word": []interface{}{"let", "key", "opt{", "=", "exp", "}"}}, + map[string]interface{}{"page": "stm", "hash": "let", "word": []interface{}{"let", "key", "=", "\\[", "rep{", "exp", "}", "\\]"}}, + map[string]interface{}{"page": "stm", "hash": "let", "word": []interface{}{"let", "key", "=", "\\{", "rep{", "exp", "}", "\\}"}}, map[string]interface{}{"page": "stm", "hash": "if", "word": []interface{}{"if", "exp"}}, + map[string]interface{}{"page": "stm", "hash": "for", "word": []interface{}{"for", "key", "key", "key", "in", "key"}}, + map[string]interface{}{"page": "stm", "hash": "for", "word": []interface{}{"for", "key", "key", "in", "key"}}, + map[string]interface{}{"page": "stm", "hash": "for", "word": []interface{}{"for", "key", "in", "key"}}, map[string]interface{}{"page": "stm", "hash": "for", "word": []interface{}{"for", "rep{", "exp", "}"}}, map[string]interface{}{"page": "stm", "hash": "fun", "word": []interface{}{"fun", "key", "rep{", "exp", "}"}}, map[string]interface{}{"page": "stm", "hash": "kit", "word": []interface{}{"kit", "rep{", "exp", "}"}}, @@ -993,8 +999,27 @@ var Index = &ctx.Context{Name: "yac", Help: "语法中心", }}, "let": &ctx.Command{Name: "let a = exp", Help: "设置变量, a: 变量名, exp: 表达式", Hand: func(m *ctx.Message, c *ctx.Context, key string, arg ...string) (e error) { if stack, ok := m.Optionv("bio.stack").(*kit.Stack); ok { - m.Log("stack", "%v = %v", arg[1], arg[3]) - stack.Hash(arg[1], arg[3]) + switch arg[3] { + case "[": + list := []interface{}{} + for i := 4; i < len(arg)-1; i++ { + list = append(list, arg[i]) + } + m.Log("stack", "%v = %v", arg[1], list) + stack.Hash(arg[1], list) + + case "{": + list := map[string]interface{}{} + for i := 4; i < len(arg)-2; i += 2 { + list[arg[i]] = arg[i+1] + } + m.Log("stack", "%v = %v", arg[1], list) + stack.Hash(arg[1], list) + + default: + m.Log("stack", "%v = %v", arg[1], arg[3]) + stack.Hash(arg[1], arg[3]) + } } return }}, @@ -1008,68 +1033,44 @@ var Index = &ctx.Context{Name: "yac", Help: "语法中心", } return }}, - "for": &ctx.Command{Name: "for [[express ;] condition]|[index message meta value]", - Help: "循环语句, express: 每次循环运行的表达式, condition: 循环条件, index: 索引消息, message: 消息编号, meta: value: ", + "for": &ctx.Command{Name: "for exp | for index val... in list", Help: "循环语句", Hand: func(m *ctx.Message, c *ctx.Context, key string, arg ...string) (e error) { stack := m.Optionv("bio.stack").(*kit.Stack) m.Log("stack", "push %v", stack.Push(arg[0], stack.Peek().Run && kit.Right(arg[1]), m.Optioni("stack.pos")).String("\\")) - /* - if cli, ok := m.Target().Server.(*YAC); m.Assert(ok) { - run := m.Caps("parse") - defer func() { m.Caps("parse", run) }() - - msg := m - if run { - if arg[1] == "index" { - if code, e := strconv.Atoi(arg[2]); m.Assert(e) { - msg = m.Target().Message().Tree(code) - run = run && msg != nil && msg.Meta != nil - switch len(arg) { - case 4: - run = run && len(msg.Meta) > 0 - case 5: - run = run && len(msg.Meta[arg[3]]) > 0 - } - } - } else { - run = run && kit.Right(arg[len(arg)-1]) - } - - if len(cli.stack) > 0 { - if frame := cli.stack[len(cli.stack)-1]; frame.key == "for" && frame.pos == m.Optioni("file_pos") { - if arg[1] == "index" { - frame.index++ - if run = run && len(frame.list) > frame.index; run { - if len(arg) == 5 { - arg[3] = arg[4] - } - m.Cap(arg[3], frame.list[frame.index]) - } - } - frame.run = run - return - } - } - } - - cli.stack = append(cli.stack, &Frame{pos: m.Optioni("file_pos"), key: key, run: run, index: 0}) - if m.Capi("level", 1); run && arg[1] == "index" { - frame := cli.stack[len(cli.stack)-1] - switch len(arg) { - case 4: - frame.list = []string{} - for k, _ := range msg.Meta { - frame.list = append(frame.list, k) - } - case 5: - frame.list = msg.Meta[arg[3]] - arg[3] = arg[4] - } - m.Cap(arg[3], arg[3], frame.list[0], "临时变量") - } + val, _ := stack.Hash(arg[len(arg)-1]) + index := kit.Int(stack.FS[len(stack.FS)-2].Hash["_index"]) + switch val := val.(type) { + case map[string]interface{}: + list := make([]string, 0, len(val)) + for k, _ := range val { + list = append(list, k) } - */ + sort.Strings(list) + + if index < len(list) { + stack.Hash(arg[1], list[index]) + } + stack.Peek().Run = false + for i, j := 2, index; i < len(arg)-2 && j < len(list); i, j = i+1, j+1 { + stack.Peek().Run = true + stack.Hash(arg[i], val[list[j]]) + stack.FS[len(stack.FS)-2].Hash["_index"] = j + 1 + } + + case []interface{}: + stack.Hash(arg[1], index) + stack.Peek().Run = false + for i, j := 2, index; i < len(arg)-2 && j < len(val); i, j = i+1, j+1 { + stack.Peek().Run = true + stack.Hash(arg[i], val[j]) + stack.FS[len(stack.FS)-2].Hash["_index"] = j + 1 + } + default: + } + if !stack.Peek().Run { + stack.FS[len(stack.FS)-2].Hash["_index"] = 0 + } return }}, "fun": &ctx.Command{Name: "fun", Help: "", Hand: func(m *ctx.Message, c *ctx.Context, key string, arg ...string) (e error) { diff --git a/src/plugin/favor/index.shy b/src/plugin/favor/index.shy index 77fc5ab2..2376d85b 100644 --- a/src/plugin/favor/index.shy +++ b/src/plugin/favor/index.shy @@ -34,36 +34,15 @@ fun salary "工资单" "" "" \ let tax = 0 let rest = $get - if $rest > 85000 - let tax = $tax + ($rest - 85000) * 45 / 100 - let rest = 85000 - end - if $rest > 60000 - let tax = $tax + ($rest - 60000) * 35 / 100 - let rest = 60000 - end - if $rest > 40000 - let tax = $tax + ($rest - 40000) * 30 / 100 - let rest = 40000 - end - if $rest > 30000 - let tax = $tax + ($rest - 30000) * 25 / 100 - let rest = 30000 - end - if $rest > 17000 - let tax = $tax + ($rest - 17000) * 20 / 100 - let rest = 17000 - end - if $rest > 8000 - let tax = $tax + ($rest - 8000) * 10 / 100 - let rest = 8000 - end - if $rest > 5000 - let tax = $tax + ($rest - 5000) * 3 / 100 + let list = [85000 45 60000 35 40000 30 30000 25 17000 20 8000 10 5000 3] + for i amount percent in list + if $rest > $amount + let tax = $tax + ($rest - $amount) * $percent / 100 + let rest = $amount + end end let rest = $get - $tax - append "公积金" $house append "养老保险" $old append "医疗保险" $tread diff --git a/src/toolkit/shy.go b/src/toolkit/shy.go index 98a524cd..cbea01a4 100644 --- a/src/toolkit/shy.go +++ b/src/toolkit/shy.go @@ -25,47 +25,47 @@ var bottom = &Frame{} type Stack struct { Target interface{} - fs []*Frame + FS []*Frame } func (s *Stack) Push(key string, run bool, pos int) *Frame { - s.fs = append(s.fs, &Frame{Key: key, Run: run, Pos: pos, deep: len(s.fs), Hash: map[string]interface{}{}}) - return s.fs[len(s.fs)-1] + s.FS = append(s.FS, &Frame{Key: key, Run: run, Pos: pos, deep: len(s.FS), Hash: map[string]interface{}{}}) + return s.FS[len(s.FS)-1] } func (s *Stack) Peek() *Frame { - if len(s.fs) == 0 { + if len(s.FS) == 0 { return bottom } - return s.fs[len(s.fs)-1] + return s.FS[len(s.FS)-1] } func (s *Stack) Pop() *Frame { - if len(s.fs) == 0 { + if len(s.FS) == 0 { return bottom } - f := s.fs[len(s.fs)-1] - s.fs = s.fs[:len(s.fs)-1] + f := s.FS[len(s.FS)-1] + s.FS = s.FS[:len(s.FS)-1] return f } func (s *Stack) Hash(key string, val ...interface{}) (interface{}, bool) { - for i := len(s.fs) - 1; i >= 0; i-- { - if v, ok := s.fs[i].Hash[key]; ok { + for i := len(s.FS) - 1; i >= 0; i-- { + if v, ok := s.FS[i].Hash[key]; ok { if len(val) > 0 { - s.fs[i].Hash[key] = val[0] + s.FS[i].Hash[key] = val[0] } return v, ok } } if len(val) > 0 { - s.fs[len(s.fs)-1].Hash[key] = val[0] + s.FS[len(s.FS)-1].Hash[key] = val[0] return val[0], true } return nil, false } func (s *Stack) Label(key string) (int, bool) { - for i := len(s.fs) - 1; i >= 0; i-- { - if v, ok := s.fs[i].Label[key]; ok { - s.fs = s.fs[:i+1] + for i := len(s.FS) - 1; i >= 0; i-- { + if v, ok := s.FS[i].Label[key]; ok { + s.FS = s.FS[:i+1] return v, ok } }