(Arne Babenhauserheide)
2013-08-08: merge merge
diff --git a/.bugs/bugs b/.bugs/bugs
--- a/.bugs/bugs
+++ b/.bugs/bugs
@@ -1,4 +1,5 @@
fails when I add stuff at the end of end of example.w | owner:, open:False, id:08c68e1ce0c9798184c01806d2661a3220bff3cd, time:1363789693.79
implement wisp in wisp | owner:Arne Babenhauserheide <bab@draketo.de>, open:True, id:6299306916706410702029289bf32edab1e7f17c, time:1367113341.49
-inline ' : should be '( | owner:Arne Babenhauserheide <bab@draketo.de>, open:True, id:72d534a8b23b4cb168017f1bb7d8816f0ea170c4, time:1366497335.26
+inline ' : should be '( | owner:Arne Babenhauserheide <bab@draketo.de>, open:False, id:72d534a8b23b4cb168017f1bb7d8816f0ea170c4, time:1366497335.26
make this work: let : : origfile ( open-file : nth 1 : command-line ) r | owner:Arne Babenhauserheide <bab@draketo.de>, open:False, id:d6de2074a5017f1f29f34d142ce797981ed270a0, time:1366529287.67
+comments containing a closing parenthesis can break the parser. | owner:, open:False, id:d9147504868960e5fbc2648474d48ce5c9bd1a02, time:1374838747.22
diff --git a/.bugs/details/d9147504868960e5fbc2648474d48ce5c9bd1a02.txt b/.bugs/details/d9147504868960e5fbc2648474d48ce5c9bd1a02.txt
new file mode 100644
--- /dev/null
+++ b/.bugs/details/d9147504868960e5fbc2648474d48ce5c9bd1a02.txt
@@ -0,0 +1,28 @@
+# Lines starting with '#' and sections without content
+# are not displayed by a call to 'details'
+#
+[paths]
+# Paths related to this bug.
+# suggested format: REPO_PATH:LINENUMBERS
+
+
+[details]
+# Additional details
+
+
+[expected]
+# The expected result
+
+
+[actual]
+# What happened instead
+
+
+[reproduce]
+# Reproduction steps
+ echo "define ; )
+ a ' : b
+ " | ./wisp.py -
+
+[comments]
+# Comments and updates - leave your name
diff --git a/.hgtags b/.hgtags
--- a/.hgtags
+++ b/.hgtags
@@ -1,3 +1,4 @@
220ce60600a7424ec2a167c6c4174b1e43570738 v0.1
d72216a3aeab91f60f0004264e329fc636da32b6 v0.2
60b1c42aae9b4bcef8a3fa1a3e8da04770efa641 v0.3
+5698a4f0fd7090c234732e1dacf38eb3c996f807 v0.3.1
diff --git a/Changelog b/Changelog
new file mode 100644
--- /dev/null
+++ b/Changelog
@@ -0,0 +1,32 @@
+0.3.1
+ * wisp.py: parentheses in comments no longer break the parser
+ * wisp.py: inline " ' : " is turned into " '("
+ * multithreaded-magic.w: New example: Easy multithreading.
+ * hello-world-server.w: Show local time instead of UTC and be a
+ bit more friendly.
+
+0.3
+ * wisp-multiline.sh: started with emacs support. Not yet nice.
+ * wisp.w: renamed to wisp-guile.w to show that it uses guile
+ scheme.
+ * wisp.w: started wisp in wisp. Does not work, yet.
+ * hello-world-server.w: First actually running example code.
+ * wisp-multiline.sh: directly execute the typed script in guile
+ scheme. Robust shell-script commandline parsing.
+ * Readme.txt: Note the license and add references and footnotes.
+ * Readme.txt: Fix the examples and add a stdin-example with guile.
+
+0.2
+ * wisp.py: got more resilient.
+ * wisp.py: condense multiple inline : into multiple brackets
+ without whitespace.
+ * wisp.py: refactored into multiple distinct phases for easier
+ maintainability.
+ * wisp.py: allow escaping : and _ with \.
+ * wisp.py: added websafe indent with _
+ * wisp.py: a colon at the end of the line is interpreted as ()
+ * wisp.py: don’t interpret wisp code in brackets or strings.
+
+0.1
+ * wisp.py: first version.
+ * Readme.txt: Added a readme.
diff --git a/hello-world-server.w b/hello-world-server.w
--- a/hello-world-server.w
+++ b/hello-world-server.w
@@ -1,28 +1,43 @@
-#!/home/arne/Quell/Programme/wisp/wisp-multiline.sh
+#!./wisp-multiline.sh
; !#
+; first the plain text header
+define : header
+ ' : content-type . : text/plain
+
+; now content building functions
+define : timestring
+ string-join
+ list
+ ; use gmtime instead of localtime if you want UTC
+ number->string : tm:hour : localtime : current-time
+ number->string : tm:min : localtime : current-time
+ . ":" ; delimiter
+
+define : greeting
+ if : string? : getlogin
+ getlogin
+ . "Mellon?"
+
+define : content
+ let : : text "Hello World!" ; the let is wisp syntax showoff…
+ string-join
+ list
+ . text
+ greeting
+ timestring
+ . "\n" ; delimiter
+
+; and the request handler
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!"
+ header
+ content
- set! text
- string-append text " "
- number->string : tm:hour : gmtime : current-time
- . ":"
- number->string : tm:min : gmtime : current-time
-
- . text
-
-
+; finally run the webserver
use-modules : web server
-display : string-append "Server starting. Test it at http://127.0.0.1:8081"
+display "Server starting. Test it at http://127.0.0.1:8081"
newline
run-server hello-world-handler 'http ' : #:port 8081
diff --git a/multithreaded-magic.w b/multithreaded-magic.w
new file mode 100755
--- /dev/null
+++ b/multithreaded-magic.w
@@ -0,0 +1,41 @@
+#!./wisp-multiline.sh
+; !#
+
+; Mathematical magic: Always get one.
+;
+; Via http://www.liv.ac.uk/HPC/HTMLF90Course/HTMLF90CourseQuestionsnode18.html
+; (actually for learning fortran)
+;
+; this is the wisp scheme version which I want to compare with the fortran version.
+
+use-modules
+ ice-9 format
+ ice-9 futures
+ ice-9 threads
+
+define : magic-threaded mutex futures integer
+ ; this can cause unordered output. It’s fun anyway :
+ set! futures : append futures : list : future : with-mutex mutex : format #t "~30r\n" integer
+ if : not : = integer 1
+ if : even? integer
+ magic-threaded mutex futures : / integer 2
+ magic-threaded mutex futures : truncate : + 1 : / integer 3
+ for-each touch futures
+
+define : magic integer
+ magic-threaded
+ make-mutex
+ list
+ . integer
+
+define : magic-simple integer
+ format #t "~30r\n" integer
+ if : not : = integer 1
+ if : even? integer
+ magic-simple : / integer 2
+ magic-simple : truncate : + 1 : / integer 3
+
+display ";;; multithreaded magic ;;;\n"
+magic 456189456156456196152615
+display ";;; simple magic ;;;\n"
+magic-simple 456189456156456196152615
diff --git a/tests/quotecolon.w b/tests/quotecolon.w
new file mode 100755
--- /dev/null
+++ b/tests/quotecolon.w
@@ -0,0 +1,10 @@
+#!/home/arne/wisp/wisp-multiline.sh
+; !#
+define a 1 ; test whether ' : correctly gets turned into '(
+; and whether brackets in commments are treated correctly.
+
+define a ' : 1 2 3
+
+define
+ a b
+ c
diff --git a/wisp.py b/wisp.py
--- a/wisp.py
+++ b/wisp.py
@@ -47,8 +47,8 @@ def replaceinwisp(code, string, replacem
strlen = len(string)
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 == ";" and not code[n-2:n] == "#\\":
+ # comments start with a ; - but only in regular wisp code or in brackets.
+ if not incomment and not instring and i == ";" and not code[n-2:n] == "#\\":
incomment = not incomment
# a linebreak ends the comment
if incomment:
@@ -61,7 +61,7 @@ def replaceinwisp(code, string, replacem
# all processing stops in strings
if instring:
continue
- if i == "(" and not code[n-2:n] == "#\\":
+ if i == "(" and not code[n-2:n] == "#\\":
inbrackets += 1
elif i == ")" and not code[n-2:n] == "#\\":
inbrackets -= 1
@@ -169,10 +169,14 @@ class Line:
):
if self.content[n-1:n+2] == " : " or self.content[n-1:] == " :":
bracketstoclose += 1
- # we have to keep the space after the colon (" : "
- # → " ( "), otherwise we cannot use two
- # consecutive colons (" : : ") which would be surprising.
- self.content = self.content[:n] + "(" + self.content[n+2:]
+ # treat ' : as '(
+ if self.content[n-3:n+1] == " ' :":
+ self.content = self.content[:n-2] + "'(" + self.content[n+2:]
+ else:
+ # we have to keep the space after the colon (" : "
+ # → " ( "), otherwise we cannot use two
+ # consecutive colons (" : : ") which would be surprising.
+ self.content = self.content[:n] + "(" + self.content[n+2:]
# after the full line processing, replace " \\: " "\n\\: " and
# " \\:\n" (inside line, start of a line, end of a line) by "
@@ -215,9 +219,20 @@ def nostringbreaks(code):
def nobracketbreaks(code):
"""remove linebreaks inside brackets (will be readded at the end)."""
instring = False
+ incomment = False
inbracket = 0
nostringbreaks = []
for n, char in enumerate(code):
+ # comments start with a ; - but only in regular wisp code or in brackets.
+ if not incomment and not instring and char == ";" and not code[n-2:n] == "#\\":
+ incomment = not incomment
+ # a linebreak ends the comment
+ if incomment:
+ if char == "\n":
+ incomment = not incomment
+ # all processing stops in comments
+ nostringbreaks.append(char)
+ continue
if char == '"' and not code[n-1:n] == "\\":
instring = not instring
if char == '(' and not instring and not code[n-2:n] == "#\\":