io.go 907 B

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849
  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 &_unknown{s: `"` + s}
  15. }
  16. func opPrint(val1 value) value {
  17. if isList(val1) {
  18. list, space := strings.Split(makeList(toList(val1)), " "), false
  19. for i := 1; i < len(list)-1; i++ {
  20. if space && list[i] != "]" {
  21. fmt.Print(" ")
  22. }
  23. fmt.Print(escapeWord(list[i]))
  24. space = list[i] != "["
  25. }
  26. fmt.Println()
  27. } else {
  28. fmt.Println(escapeWord(val1.String()))
  29. }
  30. return val1
  31. }
  32. func opReadList(scanner *scanProvider) *_list {
  33. list, line := []string{}, false
  34. for scanner.Scan() {
  35. s := scanner.Text()
  36. if s == "\n" && line {
  37. break
  38. }
  39. line = true
  40. if s != "\n" {
  41. list = append(list, parseWord(`"`+s).Value())
  42. }
  43. }
  44. return &_list{list: list}
  45. }