(Arne Babenhauserheide)
2015-06-23: break wisp chunk at the next top-level form and compile to tree-il break wisp chunk at the next top-level form and compile to tree-il to avoid wrapping top-level forms in begin.
diff --git a/wisp-reader.w b/wisp-reader.w
--- a/wisp-reader.w
+++ b/wisp-reader.w
@@ -14,6 +14,8 @@ define-module : language wisp spec
. #:use-module : wisp-scheme
. #:use-module : system base compile
. #:use-module : system base language
+ . #:use-module : language scheme compile-tree-il
+ . #:use-module : language scheme decompile-tree-il
. #:export : wisp
; Set locale to something which supports unicode. Required to avoid using fluids.
@@ -23,34 +25,6 @@ setlocale LC_ALL ""
;;; Language definition
;;;
-define : compile-scheme x e opts
- values x e e
-
-define : decompile-scheme x e opts
- values x e
-
-define wisp-pending-port : make-object-property
-
-; Code thanks to Mark Weaver
-; define : read-one-wisp-sexp port env
-; define : read-wisp-chunk
-; if : eof-object? : peek-char port
-; read-char port ; return eof: we’re done
-; let : : s : wisp2lisp : wisp-chunkreader port
-; set! : wisp-pending-port port
-; open-input-string s
-; try-pending
-; define : try-pending
-; let : : pending-port : wisp-pending-port port
-; if pending-port
-; let : : x : read pending-port
-; if : eof-object? x
-; read-wisp-chunk
-; . x
-; read-wisp-chunk
-; try-pending
-
-
define wisp-pending-sexps : list
define : read-one-wisp-sexp port env
@@ -69,18 +43,19 @@ define : read-one-wisp-sexp port env
: sexp : car wisp-pending-sexps
pending wisp-pending-sexps
set! wisp-pending-sexps : list ; : cdr wisp-pending-sexps
- ; write : cons 'begin pending
+ ; write pending
if : = 1 : length pending
car pending
cons 'begin pending
try-pending
+
define-language wisp
. #:title "Wisp Scheme Syntax. See SRFI-119 for details. THIS IS EXPERIMENTAL, USE AT YOUR OWN RISK"
; . #:reader read-one-wisp-sexp
- . #:reader : lambda (port env) : let ((x (read-one-wisp-sexp port env))) x
- . #:compilers `((scheme . ,compile-scheme))
- . #:decompilers `((scheme . ,decompile-scheme))
+ . #:reader : lambda (port env) : let ((x (read-one-wisp-sexp port env))) (write x)(newline) x
+ . #:compilers `((tree-il . ,compile-tree-il))
+ . #:decompilers `((tree-il . ,decompile-tree-il))
. #:evaluator : lambda (x module) : primitive-eval x
. #:printer write ; TODO: backtransform to wisp? Use source-properties?
. #:make-default-environment
diff --git a/wisp-scheme.w b/wisp-scheme.w
--- a/wisp-scheme.w
+++ b/wisp-scheme.w
@@ -210,12 +210,16 @@ define : wisp-scheme-read-chunk-lines po
currentindent 0
currentsymbols '()
emptylines 0
- if : <= 2 emptylines ; the chunk end has to be checked
- ; before we look for new chars in the
- ; port to make execution in the REPL
- ; after two empty lines work
- ; (otherwise it shows one more line).
+ cond
+ : <= 2 emptylines ; the chunk end has to be checked
+ ; before we look for new chars in the
+ ; port to make execution in the REPL
+ ; after two empty lines work
+ ; (otherwise it shows one more line).
. indent-and-symbols
+ : and inindent (zero? currentindent) (not (null? indent-and-symbols)) (not inunderscoreindent) (not (or (equal? #\space (peek-char port)) (equal? #\newline (peek-char port))))
+ . indent-and-symbols ; top-level form ends chunk
+ else
let : : next-char : peek-char port
cond
: eof-object? next-char