list.go 4.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167
  1. package main
  2. import (
  3. "fmt"
  4. "strings"
  5. )
  6. func parseList(s string) []string {
  7. if !isList(s) {
  8. panic(fmt.Errorf("parselist: %s (%s)", errListExpected, s))
  9. }
  10. list, bracketCnt, start, resList := strings.Split(s, " "), 0, 1, []string{}
  11. for i := 1; i < len(list)-1; i++ {
  12. if list[i] == "[" {
  13. bracketCnt++
  14. }
  15. if list[i] == "]" {
  16. bracketCnt--
  17. }
  18. if bracketCnt == 0 {
  19. resList = append(resList, strings.Join(list[start:i+1], " "))
  20. start = i + 1
  21. }
  22. }
  23. return resList
  24. }
  25. func makeList(list []string) string {
  26. return strings.Join(append(append([]string{"["}, list...), "]"), " ")
  27. }
  28. func indexOfList(list []string, index int) string {
  29. if index < 0 || index >= len(list) {
  30. panic(fmt.Errorf("indexoflist: %s", errIndexOutOfBound))
  31. }
  32. return list[index]
  33. }
  34. func rangeOfList(list []string, index1, index2 int) string {
  35. if index1 < 0 || index1 > len(list) || index2 < 0 || index2 > len(list) {
  36. panic(fmt.Errorf("rangeoflist: %s", errIndexOutOfBound))
  37. }
  38. if index1 > index2 {
  39. panic(fmt.Errorf("rangelist: %s", errIllegalRange))
  40. }
  41. return makeList(list[index1:index2])
  42. }
  43. func spliceList(list []string, index int, cnt int, val ...string) string {
  44. if index < 0 || index > len(list) {
  45. panic(fmt.Errorf("splicelist: %s", errIndexOutOfBound))
  46. }
  47. if index+cnt > len(list) {
  48. cnt = len(list) - index
  49. }
  50. return makeList(append(append(list[:index], val...), list[index+cnt:]...))
  51. }
  52. func opWord(val1, val2 value) value {
  53. if !isWord(val1.val) {
  54. panic(fmt.Errorf("word: %s (%s)", errWordExpceted, val1.val))
  55. }
  56. if isWord(val2.val) {
  57. return value{val: val1.val + val2.val[1:]}
  58. }
  59. if isNumber(val2.val) || isBool(val2.val) {
  60. return value{val: val1.val + val2.val}
  61. }
  62. panic(fmt.Errorf("word: %s (%s)", errWordExpceted, val2.val))
  63. }
  64. func opSentence(val1, val2 value) value {
  65. list1, list2 := []string{val1.val}, []string{val2.val}
  66. if isWord(val1.val) {
  67. list1 = []string{val1.val[1:]}
  68. } else if isList(val1.val) {
  69. list1 = parseList(val1.val)
  70. }
  71. if isWord(val2.val) {
  72. list2 = []string{val2.val[1:]}
  73. } else if isList(val2.val) {
  74. list2 = parseList(val2.val)
  75. }
  76. return value{val: makeList(append(list1, list2...))}
  77. }
  78. func opList(val1, val2 value) value {
  79. if isWord(val1.val) {
  80. val1.val = val1.val[1:]
  81. }
  82. if isWord(val2.val) {
  83. val2.val = val2.val[1:]
  84. }
  85. return value{val: makeList([]string{val1.val, val2.val})}
  86. }
  87. func opJoin(val1, val2 value) value {
  88. if !isList(val1.val) {
  89. panic(fmt.Errorf("join: %s (%s)", errListExpected, val1.val))
  90. }
  91. if isWord(val2.val) {
  92. val2.val = val2.val[1:]
  93. }
  94. return value{val: makeList(append(parseList(val1.val), val2.val))}
  95. }
  96. func opFirst(val1 value) value {
  97. if !isWord(val1.val) && !isList(val1.val) {
  98. panic(fmt.Errorf("first: %s (%s)", errWordOrListExpected, val1.val))
  99. }
  100. if isEmpty(val1.val) {
  101. panic(fmt.Errorf("first: %s (%s)", errEmptyWordOrList, val1.val))
  102. }
  103. if isWord(val1.val) {
  104. return value{val: val1.val[:2]}
  105. }
  106. list1 := parseList(val1.val)
  107. if !isList(list1[0]) {
  108. list1[0] = `"` + list1[0]
  109. }
  110. return value{val: list1[0]}
  111. }
  112. func opLast(val1 value) value {
  113. if !isWord(val1.val) && !isList(val1.val) {
  114. panic(fmt.Errorf("last: %s (%s)", errWordOrListExpected, val1.val))
  115. }
  116. if isEmpty(val1.val) {
  117. panic(fmt.Errorf("last: %s (%s)", errEmptyWordOrList, val1.val))
  118. }
  119. if isWord(val1.val) {
  120. return value{val: `"` + val1.val[len(val1.val)-1:]}
  121. }
  122. list1 := parseList(val1.val)
  123. if !isList(list1[len(list1)-1]) {
  124. list1[len(list1)-1] = `"` + list1[len(list1)-1]
  125. }
  126. return value{val: list1[len(list1)-1]}
  127. }
  128. func opButFirst(val1 value) value {
  129. if !isWord(val1.val) && !isList(val1.val) {
  130. panic(fmt.Errorf("butfirst: %s (%s)", errWordOrListExpected, val1.val))
  131. }
  132. if isEmpty(val1.val) {
  133. panic(fmt.Errorf("butfirst: %s (%s)", errEmptyWordOrList, val1.val))
  134. }
  135. if isWord(val1.val) {
  136. return value{val: `"` + val1.val[2:]}
  137. }
  138. list1 := parseList(val1.val)
  139. return value{val: makeList(list1[1:])}
  140. }
  141. func opButLast(val1 value) value {
  142. if !isWord(val1.val) && !isList(val1.val) {
  143. panic(fmt.Errorf("butlast: %s (%s)", errWordOrListExpected, val1.val))
  144. }
  145. if isEmpty(val1.val) {
  146. panic(fmt.Errorf("butlast: %s (%s)", errEmptyWordOrList, val1.val))
  147. }
  148. if isWord(val1.val) {
  149. return value{val: val1.val[:len(val1.val)-1]}
  150. }
  151. list1 := parseList(val1.val)
  152. return value{val: makeList(list1[:len(list1)-1])}
  153. }