;;; -*-scheme-*- ;;; Mes --- Maxwell Equations of Software ;;; Copyright © 2016,2017 Jan Nieuwenhuizen ;;; ;;; This file is part of Mes. ;;; ;;; Mes is free software; you can redistribute it and/or modify it ;;; under the terms of the GNU General Public License as published by ;;; the Free Software Foundation; either version 3 of the License, or (at ;;; your option) any later version. ;;; ;;; Mes is distributed in the hope that it will be useful, but ;;; WITHOUT ANY WARRANTY; without even the implied warranty of ;;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ;;; GNU General Public License for more details. ;;; ;;; You should have received a copy of the GNU General Public License ;;; along with Mes. If not, see . ;;; Commentary: ;;; Code: (define-macro (define-module module . rest) #t) (define-macro (use-modules . rest) #t) (define-macro (cond-expand-provide . rest) #t) (define-macro (include-from-path file) (let loop ((path (cons %moduledir (string-split (or (getenv "GUILE_LOAD_PATH") "") #\:)))) (if (getenv "MES_DEBUG") (format (current-error-port) "include-from-path: ~s [PATH:~s]\n" file path)) (if (null? path) (error "include-from-path: not found: " file) (let ((file (string-append (car path) "/" file))) (if (access? file R_OK) `(load ,file) (loop (cdr path))))))) (mes-use-module (srfi srfi-16)) (define (drain-input port) (list->string (let loop ((c (read-char))) (if (eq? c #\*eof*) '() (cons c (loop (read-char))))))) (define (make-string n . fill) (list->string (apply make-list n fill))) (define (object->string x . rest) (with-output-to-string (lambda () ((if (pair? rest) (car rest) write) x)))) (define (port-filename p) "") (define (port-line p) 0) (define (simple-format port format . rest) (map (lambda (x) (display x port)) rest)) (define (with-input-from-string string thunk) (define save-peek-char peek-char) (define save-read-char read-char) (define save-unread-char unread-char) (let ((tell 0) (end (string-length string))) (set! peek-char (lambda () (if (= tell end) (integer->char -1) (string-ref string (- tell 1))))) (set! read-char (lambda () (if (= tell end) (integer->char -1) (begin (set! tell (1+ tell)) (string-ref string (- tell 1)))))) (set! unread-char (lambda (c) (set! tell (1- tell)) c))) (let ((r (thunk))) (set! peek-char save-peek-char) (set! read-char save-read-char) (set! unread-char save-unread-char) r)) (define (with-input-from-file file thunk) (let ((port (open-input-file file))) (if (= port -1) (error 'no-such-file file) (let* ((save (current-input-port)) (foo (set-current-input-port port)) (r (thunk))) (set-current-input-port save) r)))) (define (with-output-to-file file thunk) (let ((port (open-output-file file))) (if (= port -1) (error 'cannot-open file) (let* ((save (current-output-port)) (foo (set-current-output-port port)) (r (thunk))) (set-current-output-port save) r)))) (define (with-output-to-port port thunk) (let* ((save (current-output-port)) (foo (set-current-output-port port)) (r (thunk))) (set-current-output-port save) r)) (define open-input-string (let ((save-set-current-input-port #f) (string-port #f)) (lambda (string) (set! save-set-current-input-port set-current-input-port) (set! string-port (cons '*string-port* (gensym))) (set! set-current-input-port (let ((save-peek-char peek-char) (save-read-char read-char) (save-unread-char unread-char) (tell 0) (end (string-length string))) (lambda (port) (if (not (equal? port string-port)) (save-set-current-input-port port) (begin (set! peek-char (lambda () (if (= tell end) (integer->char -1) (string-ref string (- tell 1))))) (set! read-char (lambda () (if (= tell end) (integer->char -1) (begin (set! tell (1+ tell)) (string-ref string (- tell 1)))))) (set! unread-char (lambda (c) (set! tell (1- tell)) c)) (set! set-current-input-port (lambda (port) (save-set-current-input-port port) (set! peek-char save-peek-char) (set! read-char save-read-char) (set! unread-char save-unread-char) (set! set-current-input-port save-set-current-input-port) string-port))))))) string-port))) (define (read-string) (define (read-string c p s) (if (eq? c #\*eof*) s (read-string (read-char) (peek-char) (cons c s)))) (list->string (reverse (read-string (read-char) (peek-char) (list)))))