package main import ( "fmt" "strings" ) func opWord(val1, val2 value) value { if !isWord(val1.val) { panic(fmt.Errorf("word: %s (%s)", errWordExpceted, val1.val)) } if isWord(val2.val) { return value{val: val1.val + val2.val[1:]} } if isNumber(val2.val) || isBool(val2.val) { return value{val: val1.val + val2.val} } panic(fmt.Errorf("word: %s (%s)", errWordExpceted, val2.val)) } func opSentence(val1, val2 value) value { return value{val: "[ " + strings.TrimSuffix(strings.TrimPrefix(val1.val, "[ "), " ]") + " " + strings.TrimSuffix(strings.TrimPrefix(val2.val, "[ "), " ]") + " ]"} } func opList(val1, val2 value) value { return value{val: "[ " + val1.val + " " + val2.val + " ]"} } func opJoin(val1, val2 value) value { if !isList(val1.val) { panic(fmt.Errorf("join: %s (%s)", errListExpected, val1.val)) } return value{val: strings.TrimSuffix(val1.val, " ]") + " " + val2.val + " ]"} } func opFirst(val1 value) value { if !isWord(val1.val) && !isList(val1.val) { panic(fmt.Errorf("first: %s (%s)", errWordOrListExpected, val1.val)) } if isEmpty(val1.val) { panic(fmt.Errorf("first: %s (%s)", errEmptyWordOrList, val1.val)) } if isWord(val1.val) { return value{val: val1.val[1:2]} } list1 := strings.Split(val1.val, " ") if list1[1] != "[" { return value{val: list1[1]} } i, bracketCnt := 2, 1 for ; bracketCnt > 0; i++ { if list1[i] == "[" { bracketCnt++ } if list1[i] == "]" { bracketCnt-- } } return value{val: strings.Join(list1[1:i], " ")} } func opLast(val1 value) value { if !isWord(val1.val) && !isList(val1.val) { panic(fmt.Errorf("last: %s (%s)", errWordOrListExpected, val1.val)) } if isEmpty(val1.val) { panic(fmt.Errorf("last: %s (%s)", errEmptyWordOrList, val1.val)) } if isWord(val1.val) { return value{val: val1.val[len(val1.val)-1:]} } list1 := strings.Split(val1.val, " ") if list1[len(list1)-2] != "]" { return value{val: list1[len(list1)-2]} } i, bracketCnt := len(list1)-3, 1 for ; bracketCnt > 0; i-- { if list1[i] == "]" { bracketCnt++ } if list1[i] == "[" { bracketCnt-- } } return value{val: strings.Join(list1[i+1:len(list1)-1], " ")} } func opButFirst(val1 value) value { if !isWord(val1.val) && !isList(val1.val) { panic(fmt.Errorf("butfirst: %s (%s)", errWordOrListExpected, val1.val)) } if isEmpty(val1.val) { panic(fmt.Errorf("butfirst: %s (%s)", errEmptyWordOrList, val1.val)) } if isWord(val1.val) { return value{val: `"` + val1.val[2:]} } list1 := strings.Split(val1.val, " ") if list1[1] != "[" { return value{val: "[ " + strings.Join(list1[2:], " ")} } i, bracketCnt := 2, 1 for ; bracketCnt > 0; i++ { if list1[i] == "[" { bracketCnt++ } if list1[i] == "]" { bracketCnt-- } } return value{val: "[ " + strings.Join(list1[i:], " ")} } func opButLast(val1 value) value { if !isWord(val1.val) && !isList(val1.val) { panic(fmt.Errorf("butlast: %s (%s)", errWordOrListExpected, val1.val)) } if isEmpty(val1.val) { panic(fmt.Errorf("butlast: %s (%s)", errEmptyWordOrList, val1.val)) } if isWord(val1.val) { return value{val: val1.val[:len(val1.val)-1]} } list1 := strings.Split(val1.val, " ") if list1[len(list1)-2] != "]" { return value{val: strings.Join(list1[:len(list1)-2], " ") + " ]"} } i, bracketCnt := len(list1)-3, 1 for ; bracketCnt > 0; i-- { if list1[i] == "]" { bracketCnt++ } if list1[i] == "[" { bracketCnt-- } } return value{val: strings.Join(list1[:i+1], " ") + " ]"} }