From: "Dr. Arne Babenhauserheide" <arne_bab@web.de>
To: "Dr. Arne Babenhauserheide" <arne_bab@web.de>
Cc: "Ludovic Courtès" <ludo@gnu.org>, guile-devel@gnu.org
Subject: Re: [PATCH] add SRFI-119 / language/wisp to Guile? (new patch, squashed)
Date: Fri, 18 Aug 2023 19:50:52 +0200 [thread overview]
Message-ID: <87wmxsck60.fsf@web.de> (raw)
In-Reply-To: <875y5cdyvt.fsf@web.de>
[-- Attachment #1.1: Type: text/plain, Size: 283 bytes --]
"Dr. Arne Babenhauserheide" <arne_bab@web.de> writes:
> I’m attaching the new squashed patch again here and will add the patches
> for the review changes to a second email.
Attached are the promised patches of the additional review changes.
Thank you for your review!
[-- Warning: decoded text below may be mangled, UTF-8 assumed --]
[-- Attachment #1.2: 0012-SRFI-119-Wisp-Fix-capitalize-Wisp.patch --]
[-- Type: text/x-patch, Size: 1013 bytes --]
From 3d9b452137911e1948586657edb1ea614d8a70c0 Mon Sep 17 00:00:00 2001
From: Arne Babenhauserheide <arne_bab@web.de>
Date: Tue, 15 Aug 2023 00:43:53 +0200
Subject: [PATCH 12/21] SRFI-119 (Wisp): Fix: capitalize Wisp
* doc/ref/srfi-modules.texi (srfi-119): capitalize Wisp
---
doc/ref/srfi-modules.texi | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/doc/ref/srfi-modules.texi b/doc/ref/srfi-modules.texi
index 5b82f8070..0ffc01252 100644
--- a/doc/ref/srfi-modules.texi
+++ b/doc/ref/srfi-modules.texi
@@ -5686,7 +5686,7 @@ define : factorial n @result{} (define (factorial n)
* n : factorial @{n - 1@} @result{} (* n (factorial @{n - 1@}))))
@end example
-To execute a file with wisp code, select the language and filename
+To execute a file with Wisp code, select the language and filename
extension @code{.w} vie @code{guile --language=wisp -x .w}.
In files using Wisp, @xref{SRFI-105} (Curly Infix) is always activated.
--
2.41.0
[-- Warning: decoded text below may be mangled, UTF-8 assumed --]
[-- Attachment #1.3: 0013-SRFI-119-Wisp-Fix-capitalize-Scheme.patch --]
[-- Type: text/x-patch, Size: 841 bytes --]
From d8585c6380cbdba2ad0f6c56aaf6637826cd5b93 Mon Sep 17 00:00:00 2001
From: Arne Babenhauserheide <arne_bab@web.de>
Date: Tue, 15 Aug 2023 00:46:53 +0200
Subject: [PATCH 13/21] SRFI-119 (Wisp): Fix: capitalize Scheme
* modules/language/wisp.scm (comments): capitalize Scheme
---
module/language/wisp.scm | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/module/language/wisp.scm b/module/language/wisp.scm
index b4e885eec..f3127c9d3 100644
--- a/module/language/wisp.scm
+++ b/module/language/wisp.scm
@@ -21,7 +21,7 @@
;;; Commentary:
;; Scheme-only implementation of a wisp-preprocessor which output a
-;; scheme code tree to feed to a scheme interpreter instead of a
+;; Scheme code tree to feed to a Scheme interpreter instead of a
;; preprocessed file.
;; Limitations:
--
2.41.0
[-- Warning: decoded text below may be mangled, UTF-8 assumed --]
[-- Attachment #1.4: 0014-SRFI-119-Wisp-Fix-capitalize-Wisp.patch --]
[-- Type: text/x-patch, Size: 1028 bytes --]
From 44344fa738cb51b034bb03791a6e1ee828390a42 Mon Sep 17 00:00:00 2001
From: Arne Babenhauserheide <arne_bab@web.de>
Date: Tue, 15 Aug 2023 00:56:07 +0200
Subject: [PATCH 14/21] SRFI-119 (Wisp): Fix: capitalize Wisp
* modules/language/wisp/spec.scm (define-language): capitalize Wisp
---
module/language/wisp/spec.scm | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/module/language/wisp/spec.scm b/module/language/wisp/spec.scm
index 1efd3e8b2..5f8feca9a 100644
--- a/module/language/wisp/spec.scm
+++ b/module/language/wisp/spec.scm
@@ -57,7 +57,7 @@
#: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?
+ #:printer write ; TODO: backtransform to Wisp? Use source-properties?
#:make-default-environment
(lambda ()
;; Ideally we'd duplicate the whole module hierarchy so that `set!',
--
2.41.0
[-- Warning: decoded text below may be mangled, UTF-8 assumed --]
[-- Attachment #1.5: 0015-SRFI-119-Wisp-cleanup-char-list-cond.patch --]
[-- Type: text/x-patch, Size: 2104 bytes --]
From 16967e979262f7f3d86e194295a1a3f5a7f68cd0 Mon Sep 17 00:00:00 2001
From: Arne Babenhauserheide <arne_bab@web.de>
Date: Fri, 18 Aug 2023 19:06:23 +0200
Subject: [PATCH 15/21] SRFI-119 (Wisp): cleanup char-list cond
* module/language/wisp.scm (match-charlist-to-repr): use helper and re-indent
---
module/language/wisp.scm | 38 +++++++++++++++-----------------------
1 file changed, 15 insertions(+), 23 deletions(-)
diff --git a/module/language/wisp.scm b/module/language/wisp.scm
index f3127c9d3..3ac128df2 100644
--- a/module/language/wisp.scm
+++ b/module/language/wisp.scm
@@ -97,30 +97,22 @@
;; TODO: wrap the reader to return the repr of the syntax reader
;; additions
-(define (match-charlist-to-repr charlist)
- (let
- ((chlist (reverse charlist)))
+(define (equal-rest? chars . args)
+ (equal? chars args))
+
+(define (match-charlist-to-repr char-list)
+ (let ((chars (reverse char-list)))
(cond
- ((equal? chlist (list #\.))
- repr-dot)
- ((equal? chlist (list #\'))
- repr-quote)
- ((equal? chlist (list #\,))
- repr-unquote)
- ((equal? chlist (list #\`))
- repr-quasiquote)
- ((equal? chlist (list #\, #\@))
- repr-unquote-splicing)
- ((equal? chlist (list #\# #\'))
- repr-syntax)
- ((equal? chlist (list #\# #\,))
- repr-unsyntax)
- ((equal? chlist (list #\# #\`))
- repr-quasisyntax)
- ((equal? chlist (list #\# #\, #\@))
- repr-unsyntax-splicing)
- (else
- #f))))
+ ((equal-rest? chars #\.) repr-dot)
+ ((equal-rest? chars #\') repr-quote)
+ ((equal-rest? chars #\,) repr-unquote)
+ ((equal-rest? chars #\`) repr-quasiquote)
+ ((equal-rest? chars #\, #\@) repr-unquote-splicing)
+ ((equal-rest? chars #\# #\') repr-syntax)
+ ((equal-rest? chars #\# #\,) repr-unsyntax)
+ ((equal-rest? chars #\# #\`) repr-quasisyntax)
+ ((equal-rest? chars #\# #\, #\@) repr-unsyntax-splicing)
+ (else #f))))
(define (wisp-read port)
"wrap read to catch list prefixes."
--
2.41.0
[-- Warning: decoded text below may be mangled, UTF-8 assumed --]
[-- Attachment #1.6: 0016-SRFI-119-Wisp-improve-docstring.patch --]
[-- Type: text/x-patch, Size: 891 bytes --]
From a74e63f65e6f02c9aeff76bf1d6a93043fa95c45 Mon Sep 17 00:00:00 2001
From: Arne Babenhauserheide <arne_bab@web.de>
Date: Fri, 18 Aug 2023 19:10:07 +0200
Subject: [PATCH 16/21] SRFI-119 (Wisp): improve docstring
* module/language/wisp.scm (wisp-read): improve docstring
---
module/language/wisp.scm | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/module/language/wisp.scm b/module/language/wisp.scm
index 3ac128df2..96429218d 100644
--- a/module/language/wisp.scm
+++ b/module/language/wisp.scm
@@ -115,7 +115,7 @@
(else #f))))
(define (wisp-read port)
- "wrap read to catch list prefixes."
+ "Wrap read to catch list prefixes: read one or several chars from PORT and return read symbols or replacement-symbols as representation for special forms."
(let ((prefix-maxlen 4))
(let longpeek
((peeked '())
--
2.41.0
[-- Warning: decoded text below may be mangled, UTF-8 assumed --]
[-- Attachment #1.7: 0017-SRFI-119-Wisp-improve-let-and-let-formatting.patch --]
[-- Type: text/x-patch, Size: 10900 bytes --]
From 361c00fc77a3cd8621be47a37fca18265ae59310 Mon Sep 17 00:00:00 2001
From: Arne Babenhauserheide <arne_bab@web.de>
Date: Fri, 18 Aug 2023 19:14:07 +0200
Subject: [PATCH 17/21] SRFI-119 (Wisp): improve let and let* formatting
* module/language/wisp.scm (wisp-read, wisp-scheme-read-chunk-lines):
clean up let and let* arguments
---
module/language/wisp.scm | 133 +++++++++++++++++++--------------------
1 file changed, 64 insertions(+), 69 deletions(-)
diff --git a/module/language/wisp.scm b/module/language/wisp.scm
index 96429218d..3b14eba54 100644
--- a/module/language/wisp.scm
+++ b/module/language/wisp.scm
@@ -117,15 +117,15 @@
(define (wisp-read port)
"Wrap read to catch list prefixes: read one or several chars from PORT and return read symbols or replacement-symbols as representation for special forms."
(let ((prefix-maxlen 4))
- (let longpeek
- ((peeked '())
- (repr-symbol #f))
+ (let longpeek ((peeked '()) (repr-symbol #f))
(cond
- ((or (< prefix-maxlen (length peeked)) (eof-object? (peek-char port)) (equal? #\space (peek-char port)) (equal? #\newline (peek-char port)))
+ ((or (< prefix-maxlen (length peeked))
+ (eof-object? (peek-char port))
+ (equal? #\space (peek-char port))
+ (equal? #\newline (peek-char port)))
(if repr-symbol ; found a special symbol, return it.
repr-symbol
- (let unpeek
- ((remaining peeked))
+ (let unpeek ((remaining peeked))
(cond
((equal? '() remaining)
(read port)); let read to the work
@@ -133,9 +133,8 @@
(unread-char (car remaining) port)
(unpeek (cdr remaining)))))))
(else
- (let*
- ((next-char (read-char port))
- (peeked (cons next-char peeked)))
+ (let* ((next-char (read-char port))
+ (peeked (cons next-char peeked)))
(longpeek
peeked
(match-charlist-to-repr peeked))))))))
@@ -172,9 +171,8 @@
(define (indent-level-reduction indentation-levels level select-fun)
"Reduce the INDENTATION-LEVELS to the given LEVEL and return the value selected by SELECT-FUN"
- (let loop
- ((newlevels indentation-levels)
- (diff 0))
+ (let loop ((newlevels indentation-levels)
+ (diff 0))
(cond
((= level (car newlevels))
(select-fun (list diff indentation-levels)))
@@ -230,7 +228,14 @@
(set-source-property! line 'filename (port-filename port))
(set-source-property! line 'line (port-line port))
(append indent-and-symbols (list line))))
- ((and in-indent? (zero? currentindent) (not in-comment?) (not (null? indent-and-symbols)) (not in-underscoreindent?) (not (or (equal? #\space next-char) (equal? #\newline next-char) (equal? (string-ref ";" 0) next-char))))
+ ((and in-indent?
+ (zero? currentindent)
+ (not in-comment?)
+ (not (null? indent-and-symbols))
+ (not in-underscoreindent?)
+ (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
((chunk-ends-with-period currentsymbols next-char)
;; the line ends with a period. This is forbidden in
@@ -259,9 +264,10 @@
emptylines))
;; any char but whitespace *after* underscoreindent is
;; an error. This is stricter than the current wisp
- ;; syntax definition. TODO: Fix the definition. Better
- ;; start too strict. FIXME: breaks on lines with only
- ;; underscores which should be empty lines.
+ ;; syntax definition.
+ ;; TODO: Fix the definition. Better start too strict.
+ ;; FIXME: breaks on lines with only underscores which should be
+ ;; empty lines.
((and in-underscoreindent? (and (not (equal? #\space next-char)) (not (equal? #\newline next-char))))
(raise-exception (make-exception-from-throw 'wisp-syntax-error (list "initial underscores without following whitespace at beginning of the line after" (last indent-and-symbols)))))
((equal? #\newline next-char)
@@ -351,9 +357,8 @@
(define (line-code-replace-inline-colons line)
"Replace inline colons by opening parens which close at the end of the line"
;; format #t "replace inline colons for line ~A\n" line
- (let loop
- ((processed '())
- (unprocessed line))
+ (let loop ((processed '())
+ (unprocessed line))
(cond
((null? unprocessed)
;; format #t "inline-colons processed line: ~A\n" processed
@@ -417,9 +422,8 @@
(define (wisp-propagate-source-properties code)
"Propagate the source properties from the sourrounding list into every part of the code."
- (let loop
- ((processed '())
- (unprocessed code))
+ (let loop ((processed '())
+ (unprocessed code))
(cond
((and (null? processed) (not (pair? unprocessed)) (not (list? unprocessed)))
unprocessed)
@@ -460,22 +464,20 @@
(list
(format #f "The first symbol in a chunk must start at zero indentation. Indentation and line: ~A"
(car lines)))))))
- (let loop
- ((processed '())
- (unprocessed lines)
- (indentation-levels '(0)))
- (let*
- ((current-line
- (if (<= 1 (length unprocessed))
- (car unprocessed)
- (make-line 0))); empty code
- (next-line
- (if (<= 2 (length unprocessed))
- (car (cdr unprocessed))
- (make-line 0))); empty code
- (current-indentation
- (car indentation-levels))
- (current-line-indentation (line-real-indent current-line)))
+ (let loop ((processed '())
+ (unprocessed lines)
+ (indentation-levels '(0)))
+ (let* ((current-line
+ (if (<= 1 (length unprocessed))
+ (car unprocessed)
+ (make-line 0))); empty code
+ (next-line
+ (if (<= 2 (length unprocessed))
+ (car (cdr unprocessed))
+ (make-line 0))); empty code
+ (current-indentation
+ (car indentation-levels))
+ (current-line-indentation (line-real-indent current-line)))
;; format #t "processed: ~A\ncurrent-line: ~A\nnext-line: ~A\nunprocessed: ~A\nindentation-levels: ~A\ncurrent-indentation: ~A\n\n"
;; . processed current-line next-line unprocessed indentation-levels current-indentation
(cond
@@ -528,9 +530,8 @@
current-line-indentation
(cdr indentation-levels)))))))
((= current-indentation current-line-indentation)
- (let
- ((line (line-finalize current-line))
- (next-line-indentation (line-real-indent next-line)))
+ (let ((line (line-finalize current-line))
+ (next-line-indentation (line-real-indent next-line)))
(cond
((>= current-line-indentation next-line-indentation)
;; simple recursiive step to the next line
@@ -571,9 +572,8 @@
(define (wisp-scheme-replace-inline-colons lines)
"Replace inline colons by opening parens which close at the end of the line"
- (let loop
- ((processed '())
- (unprocessed lines))
+ (let loop ((processed '())
+ (unprocessed lines))
(if (null? unprocessed)
processed
(loop
@@ -583,9 +583,8 @@
(define (wisp-scheme-strip-indentation-markers lines)
"Strip the indentation markers from the beginning of the lines"
- (let loop
- ((processed '())
- (unprocessed lines))
+ (let loop ((processed '())
+ (unprocessed lines))
(if (null? unprocessed)
processed
(loop
@@ -684,21 +683,20 @@ Match is awesome!"
(wisp-add-source-properties-from/when-required code form))
(wisp-add-source-properties-from/when-required
code
- (let
- ((improper
- (match code
- ((a ... b 'REPR-DOT-e749c73d-c826-47e2-a798-c16c13cb89dd c)
- (set! is-proper? #f)
- (wisp-add-source-properties-from/when-required
- code
- (append (map wisp-make-improper (map add-prop/req a))
- (cons (wisp-make-improper (add-prop/req b))
- (wisp-make-improper (add-prop/req c))))))
- ((a ...)
- (add-prop/req
- (map wisp-make-improper (map add-prop/req a))))
- (a
- a))))
+ (let ((improper
+ (match code
+ ((a ... b 'REPR-DOT-e749c73d-c826-47e2-a798-c16c13cb89dd c)
+ (set! is-proper? #f)
+ (wisp-add-source-properties-from/when-required
+ code
+ (append (map wisp-make-improper (map add-prop/req a))
+ (cons (wisp-make-improper (add-prop/req b))
+ (wisp-make-improper (add-prop/req c))))))
+ ((a ...)
+ (add-prop/req
+ (map wisp-make-improper (map add-prop/req a))))
+ (a
+ a))))
(define (syntax-error li msg)
(raise-exception
(make-exception-from-throw
@@ -706,8 +704,7 @@ Match is awesome!"
(list (format #f "incorrect dot-syntax #{.}# in code: ~A: ~A" msg li)))))
(if is-proper?
improper
- (let check
- ((tocheck improper))
+ (let check ((tocheck improper))
(match tocheck
;; lists with only one member
(('REPR-DOT-e749c73d-c826-47e2-a798-c16c13cb89dd)
@@ -725,9 +722,8 @@ Match is awesome!"
(syntax-error tocheck "dot as last element in already improper pair"))
;; more complex pairs
((? pair? a)
- (let
- ((head (drop-right a 1))
- (tail (last-pair a)))
+ (let ((head (drop-right a 1))
+ (tail (last-pair a)))
(cond
((equal? repr-dot (car tail))
(syntax-error tocheck "equal? repr-dot : car tail"))
@@ -754,8 +750,7 @@ Match is awesome!"
(define (wisp-scheme-read-all port)
"Read all chunks from the given port"
- (let loop
- ((tokens '()))
+ (let loop ((tokens '()))
(cond
((eof-object? (peek-char port))
tokens)
--
2.41.0
[-- Warning: decoded text below may be mangled, UTF-8 assumed --]
[-- Attachment #1.8: 0018-SRFI-119-Wisp-Fix-comment-syntax-and-trailing-whites.patch --]
[-- Type: text/x-patch, Size: 1185 bytes --]
From 0ca2a934c96d657c996d8b2f0241cc7e38ae2a0e Mon Sep 17 00:00:00 2001
From: Arne Babenhauserheide <arne_bab@web.de>
Date: Fri, 18 Aug 2023 19:15:20 +0200
Subject: [PATCH 18/21] SRFI-119 (Wisp): Fix comment syntax and trailing
whitespace
* module/language/wisp/spec.scm (define-language): comment with ;;,
strip trailing lines
---
module/language/wisp/spec.scm | 5 +----
1 file changed, 1 insertion(+), 4 deletions(-)
diff --git a/module/language/wisp/spec.scm b/module/language/wisp/spec.scm
index 5f8feca9a..f7fd794e0 100644
--- a/module/language/wisp/spec.scm
+++ b/module/language/wisp/spec.scm
@@ -52,7 +52,7 @@
(define-language wisp
#:title "Wisp Scheme Syntax. See SRFI-119 for details"
- ; . #:reader read-one-wisp-sexp
+ ;; . #:reader read-one-wisp-sexp
#:reader read-one-wisp-sexp ; : lambda (port env) : let ((x (read-one-wisp-sexp port env))) (display x)(newline) x ;
#:compilers `((tree-il . ,compile-tree-il))
#:decompilers `((tree-il . ,decompile-tree-il))
@@ -68,6 +68,3 @@
;; limited to the current compilation unit.
(module-define! m 'current-reader (make-fluid))
m)))
-
-
-
--
2.41.0
[-- Warning: decoded text below may be mangled, UTF-8 assumed --]
[-- Attachment #1.9: 0019-SRFI-119-Wisp-reindent-test.patch --]
[-- Type: text/x-patch, Size: 1206 bytes --]
From 7de03c8ce421e809afb95823037d655aa9a47fd2 Mon Sep 17 00:00:00 2001
From: Arne Babenhauserheide <arne_bab@web.de>
Date: Fri, 18 Aug 2023 19:17:25 +0200
Subject: [PATCH 19/21] SRFI-119 (Wisp): reindent test
* test-suite/tests/srfi-119.test (with-read-options, wisp->list): M-x indent-region
---
test-suite/tests/srfi-119.test | 12 ++++++------
1 file changed, 6 insertions(+), 6 deletions(-)
diff --git a/test-suite/tests/srfi-119.test b/test-suite/tests/srfi-119.test
index f4a19a0a7..6fe87f2b2 100644
--- a/test-suite/tests/srfi-119.test
+++ b/test-suite/tests/srfi-119.test
@@ -27,14 +27,14 @@
(define (with-read-options opts thunk)
(let ((saved-options (read-options)))
(dynamic-wind
- (lambda ()
- (read-options opts))
- thunk
- (lambda ()
- (read-options saved-options)))))
+ (lambda ()
+ (read-options opts))
+ thunk
+ (lambda ()
+ (read-options saved-options)))))
(define (wisp->list str)
- (wisp-scheme-read-string str))
+ (wisp-scheme-read-string str))
(with-test-prefix "wisp-read-simple"
(pass-if (equal? (wisp->list "<= n 5") '((<= n 5))))
--
2.41.0
[-- Warning: decoded text below may be mangled, UTF-8 assumed --]
[-- Attachment #1.10: 0020-SRFI-119-Wisp-use-pass-if-equal-instead-of-pass-if-e.patch --]
[-- Type: text/x-patch, Size: 2557 bytes --]
From 8cd856e060840277b1a8b30892d6ef4f55fe5c7a Mon Sep 17 00:00:00 2001
From: Arne Babenhauserheide <arne_bab@web.de>
Date: Fri, 18 Aug 2023 19:19:40 +0200
Subject: [PATCH 20/21] SRFI-119 (Wisp): use pass-if-equal instead of pass-if
(equal? ...)
* test-suite/tests/srfi-119.test (wisp-read-simple, wisp-read-complex):
use pass-if-equal and invert conditions to improve error messages
---
test-suite/tests/srfi-119.test | 54 ++++++++++++++++++----------------
1 file changed, 29 insertions(+), 25 deletions(-)
diff --git a/test-suite/tests/srfi-119.test b/test-suite/tests/srfi-119.test
index 6fe87f2b2..64ccc2ff6 100644
--- a/test-suite/tests/srfi-119.test
+++ b/test-suite/tests/srfi-119.test
@@ -37,11 +37,21 @@
(wisp-scheme-read-string str))
(with-test-prefix "wisp-read-simple"
- (pass-if (equal? (wisp->list "<= n 5") '((<= n 5))))
- (pass-if (equal? (wisp->list ". 5") '(5)))
- (pass-if (equal? (wisp->list "+ 1 : * 2 3") '((+ 1 (* 2 3))))))
+ (pass-if-equal '((<= n 5))
+ (wisp->list "<= n 5"))
+ (pass-if-equal '(5)
+ (wisp->list ". 5"))
+ (pass-if-equal '((+ 1 (* 2 3)))
+ (wisp->list "+ 1 : * 2 3")))
(with-test-prefix "wisp-read-complex"
- (pass-if (equal? (wisp->list "
+ (pass-if-equal '(
+ (a b c d e
+ f g h
+ i j k)
+
+ (concat "I want "
+ (getwish from me)
+ " - " username)) (wisp->list "
a b c d e
. f g h
. i j k
@@ -49,16 +59,20 @@ a b c d e
concat \"I want \"
getwish from me
. \" - \" username
-") '(
-(a b c d e
- f g h
- i j k)
+"))
+
+ (pass-if-equal
+ '(
+ (define (a b c)
+ (d e
+ (f)
+ (g h)
+ i))
-(concat "I want "
- (getwish from me)
- " - " username))))
+ (define (_)
+ (display "hello\n"))
- (pass-if (equal? (wisp->list "
+ (_)) (wisp->list "
define : a b c
_ d e
___ f
@@ -68,21 +82,11 @@ __ . i
define : _
_ display \"hello\n\"
-\\_") '(
-(define (a b c)
- (d e
- (f)
- (g h)
- i))
-
-(define (_)
- (display "hello\n"))
-
-(_))))
+\\_"))
;; nesting with pairs
- (pass-if (equal? (wisp->list "1 . 2\n3 4\n 5 . 6")
- '((1 . 2)(3 4 (5 . 6))))))
+ (pass-if-equal '((1 . 2)(3 4 (5 . 6)))
+ (wisp->list "1 . 2\n3 4\n 5 . 6")))
(with-test-prefix "wisp-source-properties"
(pass-if (not (find null? (map source-properties (wisp->list "1 . 2\n3 4\n 5 . 6")))))
--
2.41.0
[-- Attachment #1.11: 0021-SRFI-119-Wisp-add-tests-for-equality-of-source-prope.patch --]
[-- Type: text/x-patch, Size: 6683 bytes --]
From e120fc39aca45d55ede90b4200b7b9e39bc83e1e Mon Sep 17 00:00:00 2001
From: Arne Babenhauserheide <arne_bab@web.de>
Date: Fri, 18 Aug 2023 19:25:59 +0200
Subject: [PATCH 21/21] SRFI-119 (Wisp): add tests for equality of
source-properties and fix them
* test-suite/tests/srfi-119.test (scheme->list): new procedure
* test-suite/tests/srfi-119.test (wisp-source-properties): use
pass-if (every pair? ...) for the existance test. Use scheme->list to
compare source-properties from regular Scheme read and wisp read.
* module/language/wisp.scm (line-code): replace custom logic with
wisp-add-source-properties-from/when-required
* module/language/wisp.scm (wisp-scheme-read-chunk-lines): set the
line-number from the start of the chunk as source-property instead of
the line number from the end of the chunk.
---
module/language/wisp.scm | 57 ++++++++++++++++++----------------
test-suite/tests/srfi-119.test | 19 ++++++++++--
2 files changed, 48 insertions(+), 28 deletions(-)
diff --git a/module/language/wisp.scm b/module/language/wisp.scm
index 3b14eba54..dae9642ae 100644
--- a/module/language/wisp.scm
+++ b/module/language/wisp.scm
@@ -45,6 +45,24 @@
(read-enable 'curly-infix))
+;; Helpers to preserver source properties
+
+(define (wisp-add-source-properties-from source target)
+ "Copy the source properties from source into the target and return the target."
+ (catch #t
+ (lambda ()
+ (set-source-properties! target (source-properties source)))
+ (lambda (key . arguments)
+ #f))
+ target)
+
+(define (wisp-add-source-properties-from/when-required source target)
+ "Copy the source properties if target has none."
+ (if (null? (source-properties target))
+ (wisp-add-source-properties-from source target)
+ target))
+
+
;; Helper functions for the indent-and-symbols data structure: '((indent token token ...) ...)
(define make-line list)
@@ -63,7 +81,7 @@
(let ((code (cdr line)))
;; propagate source properties
(when (not (null? code))
- (set-source-properties! code (source-properties line)))
+ (wisp-add-source-properties-from/when-required line code))
code))
;; literal values I need
@@ -204,14 +222,16 @@
(define (wisp-scheme-read-chunk-lines port)
- (let loop
- ((indent-and-symbols (list)); '((5 "(foobar)" "\"yobble\"")(3 "#t"))
- (in-indent? #t)
- (in-underscoreindent? (equal? #\_ (peek-char port)))
- (in-comment? #f)
- (currentindent 0)
- (currentsymbols '())
- (emptylines 0))
+ ;; the line number for this chunk is the line number when starting to read it
+ ;; a top-level form stops processing, so we only need to retrieve this here.
+ (define line-number (port-line port))
+ (let loop ((indent-and-symbols (list)); '((5 "(foobar)" "\"yobble\"")(3 "#t"))
+ (in-indent? #t)
+ (in-underscoreindent? (equal? #\_ (peek-char port)))
+ (in-comment? #f)
+ (currentindent 0)
+ (currentsymbols '())
+ (emptylines 0))
(cond
((>= emptylines 2)
;; the chunk end has to be checked
@@ -226,7 +246,7 @@
((eof-object? next-char)
(let ((line (apply make-line currentindent currentsymbols)))
(set-source-property! line 'filename (port-filename port))
- (set-source-property! line 'line (port-line port))
+ (set-source-property! line 'line line-number)
(append indent-and-symbols (list line))))
((and in-indent?
(zero? currentindent)
@@ -296,7 +316,7 @@
(when (not (= 0 (length (line-code parsedline))))
;; set the source properties to parsedline so we can try to add them later.
(set-source-property! parsedline 'filename (port-filename port))
- (set-source-property! parsedline 'line (port-line port)))
+ (set-source-property! parsedline 'line line-number))
;; TODO: If the line is empty. Either do it here and do not add it, just
;; increment the empty line counter, or strip it later. Replace indent
;; -1 by indent 0 afterwards.
@@ -405,21 +425,6 @@
#f)))
l))
-(define (wisp-add-source-properties-from source target)
- "Copy the source properties from source into the target and return the target."
- (catch #t
- (lambda ()
- (set-source-properties! target (source-properties source)))
- (lambda (key . arguments)
- #f))
- target)
-
-(define (wisp-add-source-properties-from/when-required source target)
- "Copy the source properties if target has none."
- (if (null? (source-properties target))
- (wisp-add-source-properties-from source target)
- target))
-
(define (wisp-propagate-source-properties code)
"Propagate the source properties from the sourrounding list into every part of the code."
(let loop ((processed '())
diff --git a/test-suite/tests/srfi-119.test b/test-suite/tests/srfi-119.test
index 64ccc2ff6..60e1e0377 100644
--- a/test-suite/tests/srfi-119.test
+++ b/test-suite/tests/srfi-119.test
@@ -19,6 +19,7 @@
(define-module (test-srfi-119)
#:use-module (test-suite lib)
#:use-module (srfi srfi-1)
+ #:use-module (srfi srfi-26) ;; cut
#:use-module (language wisp))
(define (read-string s)
@@ -36,6 +37,14 @@
(define (wisp->list str)
(wisp-scheme-read-string str))
+(define (scheme->list str)
+ (with-input-from-string str
+ (λ ()
+ (let loop ((result '()))
+ (if (eof-object? (peek-char))
+ (reverse! result)
+ (loop (cons (read) result)))))))
+
(with-test-prefix "wisp-read-simple"
(pass-if-equal '((<= n 5))
(wisp->list "<= n 5"))
@@ -89,5 +98,11 @@ _ display \"hello\n\"
(wisp->list "1 . 2\n3 4\n 5 . 6")))
(with-test-prefix "wisp-source-properties"
- (pass-if (not (find null? (map source-properties (wisp->list "1 . 2\n3 4\n 5 . 6")))))
- (pass-if (not (find null? (map source-properties (wisp->list "1 2\n3 4\n 5 6"))))))
+ ;; has properties
+ (pass-if (every pair? (map source-properties (wisp->list "1 . 2\n3 4\n 5 . 6"))))
+ (pass-if (every pair? (map source-properties (wisp->list "1 2\n3 4\n 5 6"))))
+ ;; has the same properties
+ (pass-if-equal
+ (map source-properties (scheme->list "(1 . 2)\n(3 4\n (5 . 6))\n(1 4)\n\n(7 8)"))
+ (map (cut cons '(filename . #f) <>)
+ (map source-properties (wisp->list "1 . 2\n3 4\n 5 . 6\n1 4\n\n7 8")))))
--
2.41.0
[-- Attachment #1.12: Type: text/plain, Size: 101 bytes --]
Best wishes,
Arne
--
Unpolitisch sein
heißt politisch sein,
ohne es zu merken.
draketo.de
[-- Attachment #2: signature.asc --]
[-- Type: application/pgp-signature, Size: 1125 bytes --]
next prev parent reply other threads:[~2023-08-18 17:50 UTC|newest]
Thread overview: 77+ messages / expand[flat|nested] mbox.gz Atom feed top
2023-02-03 21:26 [PATCH] add language/wisp to Guile? Dr. Arne Babenhauserheide
2023-02-04 15:08 ` Maxime Devos
2023-02-04 15:46 ` Dr. Arne Babenhauserheide
2023-02-04 19:09 ` Maxime Devos
2023-02-04 21:35 ` Dr. Arne Babenhauserheide
2023-02-05 15:08 ` Maxime Devos
2023-02-14 8:32 ` Dr. Arne Babenhauserheide
2023-02-14 21:24 ` Dr. Arne Babenhauserheide
2023-02-14 23:01 ` Maxime Devos
2023-02-15 1:46 ` Matt Wette
2023-02-16 21:38 ` Dr. Arne Babenhauserheide
2023-02-17 1:26 ` Matt Wette
2023-02-23 11:36 ` Ludovic Courtès
2023-02-23 17:48 ` Dr. Arne Babenhauserheide
2023-02-23 18:42 ` Maxime Devos
2023-02-24 15:45 ` Ludovic Courtès
2023-02-24 16:34 ` Dr. Arne Babenhauserheide
2023-03-08 10:34 ` Dr. Arne Babenhauserheide
2023-05-01 9:54 ` [PATCH] add SRFI-119 / language/wisp to Guile? (new patch, squashed) Dr. Arne Babenhauserheide
2023-06-10 16:40 ` Ludovic Courtès
2023-06-12 10:22 ` Maxime Devos
2023-08-10 6:28 ` Dr. Arne Babenhauserheide
2023-08-14 20:11 ` Dr. Arne Babenhauserheide
2023-08-14 20:30 ` Dr. Arne Babenhauserheide
2023-08-14 22:43 ` Dr. Arne Babenhauserheide
2023-08-18 10:29 ` Ludovic Courtès
2023-08-18 12:16 ` Dr. Arne Babenhauserheide
2023-08-18 17:50 ` Dr. Arne Babenhauserheide [this message]
2023-09-08 17:46 ` Dr. Arne Babenhauserheide
2023-10-05 14:10 ` Dr. Arne Babenhauserheide
2023-10-10 23:04 ` Dr. Arne Babenhauserheide
2023-10-27 22:05 ` Dr. Arne Babenhauserheide
2024-01-09 7:05 ` Dr. Arne Babenhauserheide
2024-01-19 8:21 ` Dr. Arne Babenhauserheide
2024-03-11 1:16 ` [PATCH] add SRFI-119 / language/wisp to Guile? (new patch with more tests, squashed) Dr. Arne Babenhauserheide
2024-01-19 12:10 ` [PATCH] add SRFI-119 / language/wisp to Guile? (new patch, squashed) Christina O'Donnell
2024-01-19 21:37 ` Ricardo Wurmus
2024-01-19 21:47 ` Christina O'Donnell
2024-01-20 11:01 ` Damien Mattei
2024-01-20 19:18 ` Dr. Arne Babenhauserheide
2024-01-20 22:59 ` Damien Mattei
2024-01-20 23:22 ` Dr. Arne Babenhauserheide
2024-01-21 23:21 ` Damien Mattei
2024-01-19 23:56 ` Dr. Arne Babenhauserheide
2023-02-24 23:48 ` [PATCH] add language/wisp to Guile? Maxime Devos
2023-02-24 23:51 ` Maxime Devos
2023-02-25 0:15 ` Matt Wette
2023-02-25 10:42 ` Maxime Devos
2023-02-17 23:06 ` Maxime Devos
2023-02-18 3:50 ` Philip McGrath
2023-02-18 15:58 ` Maxime Devos
2023-02-18 19:56 ` Matt Wette
2023-02-21 12:09 ` Dr. Arne Babenhauserheide
2023-02-26 7:45 ` Philip McGrath
2023-02-26 15:42 ` Maxime Devos
2023-02-26 16:14 ` Dr. Arne Babenhauserheide
2023-02-26 17:58 ` Matt Wette
2023-02-26 18:03 ` Dr. Arne Babenhauserheide
2023-02-26 18:20 ` Matt Wette
2023-02-26 21:39 ` Dr. Arne Babenhauserheide
2023-10-02 14:59 ` Christine Lemmer-Webber
2023-10-02 21:46 ` guile support for multiple languages [was: [PATCH] add language/wisp to Guile?] Matt Wette
2023-02-23 7:59 ` [PATCH] add language/wisp to Guile? Maxime Devos
2023-02-23 8:51 ` Dr. Arne Babenhauserheide
2023-02-23 18:04 ` Maxime Devos
2023-02-23 18:22 ` Maxime Devos
2023-02-23 18:36 ` Maxime Devos
2023-02-23 18:37 ` Maxime Devos
2023-02-15 8:36 ` Dr. Arne Babenhauserheide
2023-02-15 20:13 ` Maxime Devos
2023-02-16 7:01 ` Dr. Arne Babenhauserheide
2023-02-16 8:03 ` Dr. Arne Babenhauserheide
2023-02-16 11:30 ` Maxime Devos
2023-02-16 21:35 ` Dr. Arne Babenhauserheide
2023-09-30 13:17 ` Christine Lemmer-Webber
2023-09-30 20:09 ` Maxime Devos
2023-10-02 14:48 ` Christine Lemmer-Webber
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
List information: https://www.gnu.org/software/guile/
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=87wmxsck60.fsf@web.de \
--to=arne_bab@web.de \
--cc=guile-devel@gnu.org \
--cc=ludo@gnu.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).