#!/home/arne/wisp/wisp-multiline.sh ; !# ;; ;; Implement wisp in guile ;; ;; -Author: Arne Babenhauserheide ; adapted from guile-sweet: https://gitorious.org/nacre/guile-sweet/source/ae306867e371cb4b56e00bb60a50d9a0b8353109:sweet/common.scm ; adapted from spec.scm: https://gitorious.org/nacre/guile-sweet/source/ae306867e371cb4b56e00bb60a50d9a0b8353109:sweet/spec.scm define-module : language wisp spec ; . #:use-module : wisp . #:use-module : wisp-scheme . #:use-module : system base compile . #:use-module : system base language . #:export : wisp ; Set locale to something which supports unicode. Required to avoid using fluids. 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 '() define : read-one-wisp-sexp port env define : wisp-scheme-read-chunk-env if : eof-object? : peek-char port read-char port ; return eof: we’re done begin set! wisp-pending-sexps append wisp-pending-sexps : wisp-scheme-read-chunk port try-pending define : try-pending if : null? wisp-pending-sexps wisp-scheme-read-chunk-env let : : sexp : car wisp-pending-sexps set! wisp-pending-sexps : cdr wisp-pending-sexps . sexp try-pending define-language wisp . #:title "Wisp Scheme Syntax 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)) . #:evaluator : lambda (x module) : primitive-eval x . #:printer write . #:make-default-environment lambda : ;; Ideally we'd duplicate the whole module hierarchy so that `set!', ;; `fluid-set!', etc. don't have any effect in the current environment. let : : m : make-fresh-user-module ;; Provide a separate `current-reader' fluid so that ;; compile-time changes to `current-reader' are ;; limited to the current compilation unit. module-define! m 'current-reader : make-fluid ;; Default to `simple-format', as is the case until ;; (ice-9 format) is loaded. This allows ;; compile-time warnings to be emitted when using ;; unsupported options. module-set! m 'format simple-format . m