io.go 1.0 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253
  1. package main
  2. import (
  3. "fmt"
  4. "strings"
  5. )
  6. func opRead(scanner *scanProvider) value {
  7. s := "\n"
  8. for s == "\n" && scanner.Scan() {
  9. s = scanner.Text()
  10. }
  11. if s == "\n" {
  12. panic(fmt.Errorf("read: %s", errUnexpectedEndOfInput))
  13. }
  14. return value{word: `"` + s}
  15. }
  16. func opPrint(val1 value) value {
  17. if val1.tp == typeNumber {
  18. fmt.Println(val1.num)
  19. } else if val1.tp == typeBool {
  20. fmt.Println(val1.b)
  21. } else if val1.tp == typeWord {
  22. fmt.Println(escapeWord(val1.word[1:]))
  23. } else {
  24. list, space := strings.Split(makeList(val1.list), " "), false
  25. for i := 0; i < len(list); i++ {
  26. if space && list[i] != "]" {
  27. fmt.Print(" ")
  28. }
  29. fmt.Print(escapeWord(list[i]))
  30. space = list[i] != "["
  31. }
  32. fmt.Println()
  33. }
  34. return val1
  35. }
  36. func opReadList(scanner *scanProvider) value {
  37. list, line := []string{}, false
  38. for scanner.Scan() {
  39. s := scanner.Text()
  40. if s == "\n" && line {
  41. break
  42. }
  43. line = true
  44. if s != "\n" {
  45. list = append(list, parseWord(`"` + s).word[1:])
  46. }
  47. }
  48. return value{word: makeList(list)}
  49. }