(Arne Babenhauserheide)
2013-04-23: merge wisp.w merge wisp.w
diff --git a/.bugs/bugs b/.bugs/bugs
--- a/.bugs/bugs
+++ b/.bugs/bugs
@@ -1,1 +1,3 @@
fails when I add stuff at the end of end of example.w | owner:, open:False, id:08c68e1ce0c9798184c01806d2661a3220bff3cd, time:1363789693.79
+inline ' : should be '( | owner:Arne Babenhauserheide <bab@draketo.de>, open:True, id:72d534a8b23b4cb168017f1bb7d8816f0ea170c4, time:1366497335.26
+make this work: let : : origfile ( open-file : nth 1 : command-line ) r | owner:Arne Babenhauserheide <bab@draketo.de>, open:True, id:d6de2074a5017f1f29f34d142ce797981ed270a0, time:1366529287.67
diff --git a/hello-world-server.w b/hello-world-server.w
--- a/hello-world-server.w
+++ b/hello-world-server.w
@@ -1,19 +1,21 @@
-#!/home/arne/Quell/Programme/wisp/wisp-multiline.sh !#
+#!/home/arne/Quell/Programme/wisp/wisp-multiline.sh
+; !#
define : hello-world-handler request request-body
values
+ ; header
' : content-type . : text/plain
-
+ ; content
let : : text "Hello World!"
if : string? : getlogin
- set! text : string-append text : getlogin
- set! text : string-append text " Sucker!"
+ set! text : string-append text : getlogin
+ set! text : string-append text " Sucker!"
set! text
- string-append text " "
- number->string : tm:hour : gmtime : current-time
- . ":"
- number->string : tm:min : gmtime : current-time
+ string-append text " "
+ number->string : tm:hour : gmtime : current-time
+ . ":"
+ number->string : tm:min : gmtime : current-time
. text
@@ -24,3 +26,5 @@ display : string-append "Server starting
newline
run-server hello-world-handler 'http ' : #:port 8081
+
+
diff --git a/wisp-mode.el b/wisp-mode.el
new file mode 100644
--- /dev/null
+++ b/wisp-mode.el
@@ -0,0 +1,43 @@
+;;; wisp-mode.el --- Major mode for editing wisp: Whitespace-to-Lisp
+
+;; Copyright (C) 2013 Arne Babenhauserheide <arne_bab@web.de>
+
+;; Author: Arne Babenhauserheide <arne_bab@web.de>
+;; Version: 0.0
+;; Keywords: languages, lisp
+
+;; This program is free software; you can redistribute it and/or
+;; modify it under the terms of the GNU General Public License
+;; as published by the Free Software Foundation; either version 3
+;; of the License, or (at your option) any later version.
+
+;; This program is distributed in the hope that it will be useful,
+;; but WITHOUT ANY WARRANTY; without even the implied warranty of
+;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+;; GNU General Public License for more details.
+
+;; You should have received a copy of the GNU General Public License
+;; along with this program. If not, see <http://www.gnu.org/licenses/>.
+
+;;; Commentary:
+
+;;; Code:
+
+(define-derived-mode wisp-mode
+ emacs-lisp-mode "Wisp"
+ "Major mode for whitespace-to-lisp files.
+
+ \\{wisp-mode-map}"
+ ; :group wisp
+ (set (make-local-variable 'indent-tabs-mode) nil)
+ (set (make-local-variable 'comment-start) "; ")
+ (set (make-local-variable 'font-lock-comment-start-skip) ";+ *")
+ (set (make-local-variable 'parse-sexp-ignore-comments) t)
+ (set (make-local-variable 'font-lock-defaults)
+ '((scheme-font-lock-keywords
+ scheme-font-lock-keywords-1 scheme-font-lock-keywords-2)
+ nil nil nil nil))
+ (set (make-local-variable 'mode-require-final-newline) t))
+
+(provide 'wisp-mode)
+;;; wisp-mode.el ends here
diff --git a/wisp.py b/wisp.py
--- a/wisp.py
+++ b/wisp.py
@@ -48,7 +48,7 @@ def replaceinwisp(code, string, replacem
for n in range(len(code) - strlen):
i = code[n]
# comments start with a ; - but only in regular wisp code.
- if not incomment and not instring and not inbrackets and i == ";":
+ if not incomment and not instring and not inbrackets and i == ";" and not code[n-2:n] == "#\\":
incomment = not incomment
# a linebreak ends the comment
if incomment:
@@ -56,14 +56,14 @@ def replaceinwisp(code, string, replacem
incomment = not incomment
# all processing stops in comments
continue
- if i == '"':
+ if i == '"' and not code[n-1:n] == "\\":
instring = not instring
# all processing stops in strings
if instring:
continue
- if i == "(":
+ if i == "(" and not code[n-2:n] == "#\\":
inbrackets += 1
- elif i == ")":
+ elif i == ")" and not code[n-2:n] == "#\\":
inbrackets -= 1
# all processing stops in brackets
if inbrackets:
@@ -137,9 +137,9 @@ class Line:
self.comment = ""
instring = False
for n, i in enumerate(self.content):
- if i == '"':
+ if i == '"' and not self.content[n-1:n] == "\\":
instring = not instring
- if not instring and i == ";":
+ if not instring and i == ";" and not self.content[n-2:n] == "#\\":
self.comment = self.content[n+1:]
self.content = self.content[:n]
break
@@ -154,11 +154,11 @@ class Line:
# go backwards through the content to be able to leave out the
# space after a colon without breaking later colons.
for n, i in reversed(list(enumerate(self.content))):
- if i == '"':
+ if i == '"' and not self.content[n-1:n] == "\\":
instring = not instring
- if not instring and i == ")":
+ if not instring and i == ")" and not self.content[n-2:n] == "#\\":
inbrackets += 1
- elif not instring and i == "(":
+ elif not instring and i == "(" and not self.content[n-2:n] == "#\\":
inbrackets -= 1
if (not instring and
not inbrackets and
@@ -202,8 +202,8 @@ def nostringbreaks(code):
"""remove linebreaks inside strings (will be readded at the end)"""
instring = False
nostringbreaks = []
- for char in code:
- if char == '"':
+ for n, char in enumerate(code):
+ if char == '"' and not code[n-1:n] == "\\":
instring = not instring
if instring and char == "\n":
nostringbreaks.append("\\LINEBREAK")
@@ -214,12 +214,15 @@ def nostringbreaks(code):
def nobracketbreaks(code):
"""remove linebreaks inside brackets (will be readded at the end)."""
+ instring = False
inbracket = 0
nostringbreaks = []
- for char in code:
- if char == '(':
+ for n, char in enumerate(code):
+ if char == '"' and not code[n-1:n] == "\\":
+ instring = not instring
+ if char == '(' and not instring and not code[n-2:n] == "#\\":
inbracket += 1
- elif char == ')':
+ elif char == ')' and not instring and not code[n-2:n] == "#\\":
inbracket -= 1
if inbracket and char == "\n":
nostringbreaks.append("\\LINEBREAK")
diff --git a/wisp.w b/wisp.w
--- a/wisp.w
+++ b/wisp.w
@@ -1,4 +1,58 @@
-#!/home/arne/wisp/wisp-multiline.sh
+#!/usr/bin/env guile
; !#
-; first step to a wisp preprocessor in wisp: output a file on stdout.
+; first step: Be able to mirror a file to stdout
+
+let ((i (display
+ 1)))
+ display 1
+
+let : : a "rcie
+rcie
+crie"
+ display "
+"
+
+let*
+ : filename : list-ref ( command-line ) 1
+ origfile : open-file filename "r" ; mode
+ nextchar : read-char origfile
+
+ ; Replace end of line characters in brackets and strings
+ let*
+ : text ""
+ incomment #f
+ instring #f
+ inbrackets 0
+ while : not : eof-object? nextchar
+ when : and ( char=? nextchar #\" ) ( not incomment )
+ set! instring : not instring
+ display instring
+ when : and ( char=? nextchar #\; ) ( not incomment ) ( not instring )
+ set! incomment #t
+ when
+ and incomment
+ not instring
+ or
+ char=? nextchar #\newline
+ char=? nextchar #\linefeed
+ set! incomment #f
+ ; TODO: This still treats cod as in brackets which is not, possibly because it cannot cope with char literals: #\( and #\)
+ when : and ( char=? nextchar #\( ) ( not instring ) ( not incomment )
+ set! inbrackets : + inbrackets 1
+ when : and ( char=? nextchar #\) ) ( not instring ) ( not incomment )
+ set! inbrackets : - inbrackets 1
+
+ if : or instring : > inbrackets 0
+ if : char=? nextchar #\linefeed
+ set! text : string-append text "\\LINE_BREAK_N"
+ if : char=? nextchar #\newline
+ set! text : string-append text "\\LINE_BREAK_R"
+ set! text : string-append text : string nextchar
+ ; when not in brackets or string: just append the char
+ set! text : string-append text : string nextchar
+
+ set! nextchar : read-char origfile
+ display text
+
+newline