wisp
 
(Arne Babenhauserheide)
2015-09-12: end chunks on trailing period.

end chunks on trailing period.

diff --git a/wisp-scheme.w b/wisp-scheme.w
--- a/wisp-scheme.w
+++ b/wisp-scheme.w
@@ -222,16 +222,34 @@ define : indent-reduce-to-level indentat
            lambda : x ; get the levels
                     car : cdr x
 
+define : chunk-ends-with-period currentsymbols port
+       . "Check whether indent-and-symbols ends with a period, indicating the end of a chunk."
+       define : ref-last li
+                list-ref li : - (length li) 1
+       define : drop-last li
+                drop-right li 1
+       and : not : null? currentsymbols
+             equal? #\newline : peek-char port
+             equal? repr-dot
+                    ref-last currentsymbols
+
+define : indent-and-lines-drop-last-symbol indent-and-symbols
+       . "Check whether indent-and-symbols ends with a period, indicating the end of a chunk."
+       define : drop-last li
+                drop-right li 1
+       define : ref-last li
+                list-ref li : - (length li) 1
+       define : set-last! li val
+                list-set! li : - (length li) 1
+                  . val
+       when : not : null? indent-and-symbols
+              set-last! indent-and-symbols
+                drop-last : ref-last indent-and-symbols
+       . indent-and-symbols
 
 define : wisp-scheme-read-chunk-lines port
-         define : ends-with-period indent-and-symbols
-                . "Check whether indent-and-symbols ends with a period, indicating the end of a chunk."
-                equal? repr-dot
-                       take-right
-                         take-right
-                           take-right indent-and-symbols 1
-                           . 1
-                         . 1
+         define : finalize indent-and-symbols currentindent currentsymbols
+                  append indent-and-symbols : list : append (list currentindent) currentsymbols
          let loop
            : indent-and-symbols : list ; '((5 "(foobar)" "\"yobble\"")(3 "#t"))
              inindent #t
@@ -247,15 +265,16 @@ define : wisp-scheme-read-chunk-lines po
                               ; after two empty lines work
                               ; (otherwise it shows one more line).
              . indent-and-symbols
-            : and (equal? '() currentsymbols) : ends-with-period indent-and-symbols
+            : chunk-ends-with-period currentsymbols port
               ; the line ends with a period. This is forbidden in SRFI-119.
               ; use it to end the line in the REPL without hitting return thrice.
-              . indent-and-symbols
+              indent-and-lines-drop-last-symbol
+                finalize indent-and-symbols currentindent currentsymbols
             else
              let : : next-char : peek-char port
                cond
                  : eof-object? next-char
-                   append indent-and-symbols : list : append (list currentindent) currentsymbols
+                   finalize indent-and-symbols currentindent currentsymbols
                  : and inindent (zero? currentindent) (not incomment) (not (null? indent-and-symbols)) (not inunderscoreindent) (not (or (equal? #\space next-char) (equal? #\newline next-char) (equal? (string-ref ";" 0) next-char)))
                   append indent-and-symbols ; top-level form ends chunk
                  : and inindent : equal? #\space next-char