remove escapes
[guile-scsh:guile-scsh.git] / scsh / here-strings.scm
1 ;;; Python style here-string support for guile.
2 ;;; by Mark H Weaver
3 ;;; modified by Chaos Eternal to be integrated in guile-scsh
4 ;;; Licensed under GPLv3 or later.
5
6 ;;; Usage: just put (use-module (scsh here-strings)) in the beginning of your code.
7 ;;; Block starts with #""", ends with """ and no escape sequences apply.
8
9 ;;; for example:
10 ;; 
11 ;; (run (cat ) (<< #"""
12 ;; here strings
13 ;; with " " and 
14 ;; """))
15 ;; 
16
17
18
19 (define-module (scsh here-strings)
20   #:use-module (ice-9 match))
21
22 (define (read-here-string c port)
23   (unless (and (char=? #\" (read-char port))
24                (char=? #\" (read-char port)))
25     (error "Invalid here-string syntax"))
26   (let loop ((chars '()))
27     (match chars
28       ((#\" #\" #\" . chars)
29        (list->string (reverse! chars)))
30       (_ (let ((c (read-char port)))
31            (if (eof-object? c)
32                (error "EOF within here-string")
33                (loop (cons c chars))))))))
34
35 (read-hash-extend #\" read-here-string)
36
37 ;; (define (read-here-string c port)
38 ;;   (unless (and (char=? #\' (read-char port))
39 ;;                (char=? #\' (read-char port)))
40 ;;     (error "Invalid here-string syntax"))
41 ;;   (let loop ((chars '()))
42 ;;     (match chars
43 ;;       ((#\' #\' #\' . chars)
44 ;;        (list->string (reverse! chars)))
45 ;;       ((#\n #\\ . chars)
46 ;;        (loop (cons #\newline chars)))
47 ;;       ((#\r #\\ . chars)
48 ;;        (loop (cons #\cr chars)))
49 ;;       ((#\t #\\ . chars)
50 ;;        (loop (cons #\tab chars)))
51 ;;       ((#\0 #\\ . chars)
52 ;;        (loop (cons #\null chars)))
53 ;;       (_ (let ((c (read-char port)))
54 ;;            (if (eof-object? c)
55 ;;                (error "EOF within here-string")
56 ;;                (loop (cons c chars))))))))
57
58 ;; (read-hash-extend #\" read-here-string)