list.go 3.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146
  1. package main
  2. import (
  3. "fmt"
  4. "strings"
  5. )
  6. func parseList(s string) []string {
  7. if !isList(value{word: s}) {
  8. panic(fmt.Errorf("list: %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("list: %s (%d / %d)", errIndexOutOfBound, index, len(list)))
  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("list: %s (%d : %d / %d)", errIndexOutOfBound, index1, index2, len(list)))
  37. }
  38. if index1 > index2 {
  39. panic(fmt.Errorf("list: %s (%d : %d)", errIllegalRange, index1, index2))
  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("list: %s (%d / %d)", errIndexOutOfBound, index, len(list)))
  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) || isList(val2) {
  54. panic(fmt.Errorf("word: %s (%s, %s)", errWordExpceted, toString(val1), toString(val2)))
  55. }
  56. return value{tp: typeWord, word: val1.word + toString(val2)}
  57. }
  58. func opSentence(val1, val2 value) value {
  59. list1, list2 := []string{toString(val1)}, []string{toString(val2)}
  60. if isList(val1) {
  61. list1 = val1.list
  62. }
  63. if isList(val2) {
  64. list2 = val2.list
  65. }
  66. return value{word: makeList(append(list1, list2...))}
  67. }
  68. func opList(val1, val2 value) value {
  69. return value{word: makeList([]string{toString(val1), toString(val2)})}
  70. }
  71. func opJoin(val1, val2 value) value {
  72. if !isList(val1) {
  73. panic(fmt.Errorf("join: %s (%s)", errListExpected, toString(val1)))
  74. }
  75. return value{word: makeList(append(val1.list, toString(val2)))}
  76. }
  77. func opFirst(val1 value) value {
  78. if !isWord(val1) && !isList(val1) {
  79. panic(fmt.Errorf("first: %s (%s)", errWordOrListExpected, toString(val1)))
  80. }
  81. if isEmpty(val1) {
  82. panic(fmt.Errorf("first: %s (%s)", errEmptyWordOrList, toString(val1)))
  83. }
  84. if isWord(val1) {
  85. return value{word: val1.word[:2]}
  86. }
  87. val := value{word: val1.list[0]}
  88. if !isList(val) {
  89. val.word = `"` + val.word
  90. }
  91. return val
  92. }
  93. func opLast(val1 value) value {
  94. if !isWord(val1) && !isList(val1) {
  95. panic(fmt.Errorf("last: %s (%s)", errWordOrListExpected, toString(val1)))
  96. }
  97. if isEmpty(val1) {
  98. panic(fmt.Errorf("last: %s (%s)", errEmptyWordOrList, toString(val1)))
  99. }
  100. if isWord(val1) {
  101. return value{word: `"` + val1.word[len(val1.word)-1:]}
  102. }
  103. val := value{word: val1.list[len(val1.list)-1]}
  104. if !isList(val) {
  105. val.word = `"` + val.word
  106. }
  107. return val
  108. }
  109. func opButFirst(val1 value) value {
  110. if !isWord(val1) && !isList(val1) {
  111. panic(fmt.Errorf("butfirst: %s (%s)", errWordOrListExpected, toString(val1)))
  112. }
  113. if isEmpty(val1) {
  114. panic(fmt.Errorf("butfirst: %s (%s)", errEmptyWordOrList, toString(val1)))
  115. }
  116. if isWord(val1) {
  117. return value{word: `"` + val1.word[2:]}
  118. }
  119. return value{word: makeList(val1.list[1:])}
  120. }
  121. func opButLast(val1 value) value {
  122. if !isWord(val1) && !isList(val1) {
  123. panic(fmt.Errorf("butlast: %s (%s)", errWordOrListExpected, toString(val1)))
  124. }
  125. if isEmpty(val1) {
  126. panic(fmt.Errorf("butlast: %s (%s)", errEmptyWordOrList, toString(val1)))
  127. }
  128. if isWord(val1) {
  129. return value{word: val1.word[:len(val1.word)-1]}
  130. }
  131. return value{word: makeList(val1.list[:len(val1.list)-1])}
  132. }