forked from x/ContextOS
add shy.array
This commit is contained in:
parent
a1332f9eee
commit
2efd17d4c7
@ -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"]) {
|
||||
|
@ -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,
|
||||
}
|
||||
|
@ -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
|
||||
}},
|
||||
|
@ -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)
|
||||
|
@ -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) {
|
||||
|
@ -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
|
||||
|
@ -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
|
||||
}
|
||||
}
|
||||
|
Loading…
x
Reference in New Issue
Block a user