test: Add syntax tests.
[mes.git] / module / mes / guile.mes
1 ;;; -*-scheme-*-
2
3 ;;; Mes --- Maxwell Equations of Software
4 ;;; Copyright © 2016,2017,2018 Jan Nieuwenhuizen <janneke@gnu.org>
5 ;;;
6 ;;; This file is part of Mes.
7 ;;;
8 ;;; Mes is free software; you can redistribute it and/or modify it
9 ;;; under the terms of the GNU General Public License as published by
10 ;;; the Free Software Foundation; either version 3 of the License, or (at
11 ;;; your option) any later version.
12 ;;;
13 ;;; Mes is distributed in the hope that it will be useful, but
14 ;;; WITHOUT ANY WARRANTY; without even the implied warranty of
15 ;;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
16 ;;; GNU General Public License for more details.
17 ;;;
18 ;;; You should have received a copy of the GNU General Public License
19 ;;; along with Mes.  If not, see <http://www.gnu.org/licenses/>.
20
21 ;;; Commentary:
22
23 ;;; Code:
24
25 (define-macro (define-module module . rest) #t)
26 (define-macro (use-modules . rest) #t)
27 (define-macro (cond-expand-provide . rest) #t)
28
29 (define-macro (include-from-path file)
30   (let loop ((path (cons %moduledir (string-split (or (getenv "GUILE_LOAD_PATH") "") #\:))))
31     (if (getenv "MES_DEBUG") 
32         ;;(format (current-error-port) "include-from-path: ~s [PATH:~s]\n" file path)
33         (core:display-error (string-append "include-from-path: " file " [PATH:" (string-join path ":") "]\n")))
34     (if (null? path) (error "include-from-path: not found: " file)
35         (let ((file (string-append (car path) "/" file)))
36           (if (access? file R_OK) `(load ,file)
37               (loop (cdr path)))))))
38
39 (mes-use-module (mes catch))
40 (mes-use-module (mes posix))
41 (mes-use-module (srfi srfi-16))
42 (mes-use-module (mes display))
43
44 (define (read-string)
45   (define (read-string c)
46     (if (eq? c #\*eof*) '()
47         (cons c (read-string (read-char)))))
48   (let ((string (list->string (read-string (read-char)))))
49     (if (getenv "MES_DEBUG")
50         (core:display-error (string-append "drained: `" string "'\n")))
51     string))
52
53 (define (drain-input port) (read-string))
54
55 (define (make-string n . fill)
56   (list->string (apply make-list n fill)))
57
58 (define (object->string x . rest)
59   (with-output-to-string
60     (lambda () ((if (pair? rest) (car rest) write) x))))
61
62 (define (port-filename p) "<stdin>")
63 (define (port-line p) 0)
64
65 (define (with-input-from-string string thunk)
66   (define save-peek-char peek-char)
67   (define save-read-char read-char)
68   (define save-unread-char unread-char)
69   (if (getenv "MES_DEBUG")
70       (core:display-error (string-append "with-input-from-string: `" string "'\n")))
71   (let ((tell 0)
72         (end (string-length string)))
73     (set! peek-char
74           (lambda () (if (= tell end) (integer->char -1)
75                          (string-ref string (- tell 1)))))
76     (set! read-char
77           (lambda () (if (= tell end) (integer->char -1)
78                          (begin
79                            (set! tell (1+ tell))
80                            (string-ref string (- tell 1))))))
81     (set! unread-char
82           (lambda (c) (set! tell (1- tell)) c)))
83   (let ((r (thunk)))
84     (set! peek-char save-peek-char)
85     (set! read-char save-read-char)
86     (set! unread-char save-unread-char)
87     r))
88
89 (define (with-input-from-file file thunk)
90   (let ((port (open-input-file file)))
91     (if (= port -1)
92         (error 'no-such-file file)
93         (let* ((save (current-input-port))
94                (foo (set-current-input-port port))
95                (r (thunk)))
96           (set-current-input-port save)
97           r))))
98
99 (define (with-output-to-file file thunk)
100   (let ((port (open-output-file file)))
101     (if (= port -1)
102         (error 'cannot-open file)
103         (let* ((save (current-output-port))
104                (foo (set-current-output-port port))
105                (r (thunk)))
106           (set-current-output-port save)
107           r))))
108
109 (define (with-output-to-port port thunk)
110   (let* ((save (current-output-port))
111          (foo (set-current-output-port port))
112          (r (thunk)))
113     (set-current-output-port save)
114     r))
115
116 (define open-input-string
117   (let ((save-set-current-input-port #f)
118         (string-port #f))
119     (lambda (string)
120       (if (getenv "MES_DEBUG")
121           (core:display-error (string-append "open-input-string: `" string "'\n")))
122       (set! save-set-current-input-port set-current-input-port)
123       (set! string-port (cons '*string-port* (gensym)))
124       (set! set-current-input-port
125             (let ((save-peek-char peek-char)
126                   (save-read-char read-char)
127                   (save-unread-char unread-char)
128                   (tell 0)
129                   (end (string-length string)))
130               (lambda (port)
131                 (if (not (equal? port string-port)) (save-set-current-input-port port)
132                     (begin
133                       (set! peek-char
134                             (lambda () (if (= tell end) (integer->char -1)
135                                            (string-ref string (- tell 1)))))
136                       (set! read-char
137                             (lambda () (if (= tell end) (integer->char -1)
138                                            (begin
139                                              (set! tell (1+ tell))
140                                              (string-ref string (- tell 1))))))
141                       (set! unread-char
142                             (lambda (c) (set! tell (1- tell)) c))
143                       (set! set-current-input-port
144                             (lambda (port)
145                               (save-set-current-input-port port)
146                               (set! peek-char save-peek-char)
147                               (set! read-char save-read-char)
148                               (set! unread-char save-unread-char)
149                               (set! set-current-input-port save-set-current-input-port)
150                               string-port)))))))
151       string-port)))