/pprint.arc

http://github.com/alimoeeny/arc · Unknown · 80 lines · 69 code · 11 blank · 0 comment · 0 complexity · 0478213784fb97d09895333cc9eb869f MD5 · raw file

  1. ; Pretty-Printing. Spun off 4 Aug 06.
  2. ; todo: indentation of long ifs; quasiquote, unquote, unquote-splicing
  3. (= bodops* (fill-table (table)
  4. '(let 2 with 1 while 1 def 2 fn 1 rfn 2 afn 1
  5. when 1 unless 1 after 1 whilet 2 for 3 each 2 whenlet 2 awhen 1
  6. whitepage 0 tag 1 form 1 aform 1 aformh 1 w/link 1 textarea 3
  7. )))
  8. (= oneline* 35) ; print exprs less than this long on one line
  9. ; If returns nil, can assume it didn't have to break expr.
  10. (def ppr (expr (o col 0) (o noindent nil))
  11. (if (or (atom expr) (dotted expr))
  12. (do (unless noindent (sp col))
  13. (write expr)
  14. nil)
  15. (is (car expr) 'quote)
  16. (do (unless noindent (sp col))
  17. (pr "'")
  18. (ppr (cadr expr) (+ col 1) t))
  19. (bodops* (car expr))
  20. (do (unless noindent (sp col))
  21. (let whole (tostring (write expr))
  22. (if (< (len whole) oneline*)
  23. (do (pr whole) nil)
  24. (ppr-progn expr col noindent))))
  25. (do (unless noindent (sp col))
  26. (let whole (tostring (write expr))
  27. (if (< (len whole) oneline*)
  28. (do (pr whole) nil)
  29. (ppr-call expr col noindent))))))
  30. (def ppr-progn (expr col noindent)
  31. (lpar)
  32. (let n (bodops* (car expr))
  33. (let str (tostring (write-spaced (firstn n expr)))
  34. (unless (is n 0) (pr str) (sp))
  35. (ppr (expr n) (+ col (len str) 2) t))
  36. (map (fn (e) (prn) (ppr e (+ col 2)))
  37. (nthcdr (+ n 1) expr)))
  38. (rpar)
  39. t)
  40. (def ppr-call (expr col noindent)
  41. (lpar)
  42. (let carstr (tostring (write (car expr)))
  43. (pr carstr)
  44. (if (cdr expr)
  45. (do (sp)
  46. (let broke (ppr (cadr expr) (+ col (len carstr) 2) t)
  47. (pprest (cddr expr)
  48. (+ col (len carstr) 2)
  49. (no broke)))
  50. t)
  51. (do (rpar) t))))
  52. (def pprest (exprs col (o oneline t))
  53. (if (and oneline
  54. (all (fn (e)
  55. (or (atom e) (and (is (car e) 'quote) (atom (cadr e)))))
  56. exprs))
  57. (do (map (fn (e) (pr " ") (write e))
  58. exprs)
  59. (rpar))
  60. (do (when exprs
  61. (each e exprs (prn) (ppr e col)))
  62. (rpar))))
  63. (def write-spaced (xs)
  64. (when xs
  65. (write (car xs))
  66. (each x (cdr xs) (pr " ") (write x))))
  67. (def sp ((o n 1)) (repeat n (pr " ")))
  68. (def lpar () (pr "("))
  69. (def rpar () (pr ")"))