Add support for including Guile files.
[mes.git] / module / mes / guile.mes
1 ;;; -*-scheme-*-
2
3 ;;; Mes --- Maxwell Equations of Software
4 ;;; Copyright © 2016 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
28 (define (port-filename p) "<stdin>")
29 (define (port-line p) 0)
30 (define (simple-format port format . rest) (map (lambda (x) (display x port)) rest))
31
32 (define (with-input-from-string string thunk)
33   (define save-peek-char peek-char)
34   (define save-read-char read-char)
35   (define save-unread-char unread-char)
36   (let ((tell 0)
37         (end (string-length string)))
38     (set! peek-char
39           (lambda () (if (= tell end) (integer->char -1)
40                          (string-ref string (- tell 1)))))
41     (set! read-char
42           (lambda () (if (= tell end) (integer->char -1)
43                          (begin
44                            (set! tell (1+ tell))
45                            (string-ref string (- tell 1))))))
46     (set! unread-char
47           (lambda (c) (set! tell (1- tell)) c)))
48   (let ((r (thunk)))
49     (set! peek-char save-peek-char)
50     (set! read-char save-read-char)
51     (set! unread-char save-unread-char)
52     r))
53
54 (define (with-input-from-file file thunk)
55   (let ((port (open-input-file file)))
56     (if (= port -1)
57         (begin (display "no such file:") (display file) (newline))
58         (let* ((save (current-input-port))
59                (foo (set-current-input-port port))
60                (r (thunk)))
61           (set-current-input-port save)
62           r))))