guile-commits
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[Guile-commits] 01/01: Add initial implementation of R7RS modules


From: Andy Wingo
Subject: [Guile-commits] 01/01: Add initial implementation of R7RS modules
Date: Sun, 13 Oct 2019 14:50:00 -0400 (EDT)

wingo pushed a commit to branch wip-r7rs
in repository guile.

commit 392785186d87e7c542f4b9a6f64079758e3d0dd5
Author: Andy Wingo <address@hidden>
Date:   Sat Oct 5 21:30:33 2019 +0200

    Add initial implementation of R7RS modules
    
    * module/Makefile.am (SOURCES): Add new files.
    * module/scheme/base.scm:
    * module/scheme/case-lambda.scm:
    * module/scheme/char.scm:
    * module/scheme/complex.scm:
    * module/scheme/cxr.scm:
    * module/scheme/eval.scm:
    * module/scheme/file.scm:
    * module/scheme/inexact.scm:
    * module/scheme/lazy.scm:
    * module/scheme/load.scm:
    * module/scheme/process-context.scm:
    * module/scheme/r5rs.scm:
    * module/scheme/read.scm:
    * module/scheme/repl.scm:
    * module/scheme/time.scm:
    * module/scheme/write.scm: New files.  Thanks to Göran Weinholt for
      akku-scm and OKUMURA Yuki for yuni, off of which some of these files
      were based.
---
 module/Makefile.am                |  17 ++
 module/scheme/base.scm            | 400 ++++++++++++++++++++++++++++++++++++++
 module/scheme/case-lambda.scm     |  19 ++
 module/scheme/char.scm            |  81 ++++++++
 module/scheme/complex.scm         |  22 +++
 module/scheme/cxr.scm             |  42 ++++
 module/scheme/eval.scm            |  31 +++
 module/scheme/file.scm            |  24 +++
 module/scheme/inexact.scm         |  56 ++++++
 module/scheme/lazy.scm            |  24 +++
 module/scheme/load.scm            |  25 +++
 module/scheme/process-context.scm |  58 ++++++
 module/scheme/r5rs.scm            | 134 +++++++++++++
 module/scheme/read.scm            |  19 ++
 module/scheme/repl.scm            |  19 ++
 module/scheme/time.scm            |  31 +++
 module/scheme/write.scm           |  23 +++
 17 files changed, 1025 insertions(+)

diff --git a/module/Makefile.am b/module/Makefile.am
index fe31675..2bccfba 100644
--- a/module/Makefile.am
+++ b/module/Makefile.am
@@ -236,6 +236,23 @@ SOURCES =                                  \
   oop/goops/accessors.scm                      \
   oop/goops/simple.scm                         \
                                                \
+  scheme/base.scm                              \
+  scheme/case-lambda.scm                       \
+  scheme/char.scm                              \
+  scheme/complex.scm                           \
+  scheme/cxr.scm                               \
+  scheme/eval.scm                              \
+  scheme/file.scm                              \
+  scheme/inexact.scm                           \
+  scheme/lazy.scm                              \
+  scheme/load.scm                              \
+  scheme/process-context.scm                   \
+  scheme/r5rs.scm                              \
+  scheme/read.scm                              \
+  scheme/repl.scm                              \
+  scheme/time.scm                              \
+  scheme/write.scm                             \
+                                               \
   scripts/compile.scm                          \
   scripts/disassemble.scm                      \
   scripts/display-commentary.scm               \
diff --git a/module/scheme/base.scm b/module/scheme/base.scm
new file mode 100644
index 0000000..3f5dace
--- /dev/null
+++ b/module/scheme/base.scm
@@ -0,0 +1,400 @@
+;;; R7RS compatibility libraries
+;;; Copyright (C) 2019 Free Software Foundation, Inc.
+;;;
+;;; This library is free software: you can redistribute it and/or modify
+;;; it under the terms of the GNU Lesser General Public License as
+;;; published by the Free Software Foundation, either version 3 of the
+;;; License, or (at your option) any later version.
+;;;
+;;; This library 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
+;;; Lesser General Public License for more details.
+;;;
+;;; You should have received a copy of the GNU Lesser General Public
+;;; License along with this program.  If not, see
+;;; <http://www.gnu.org/licenses/>.
+
+;;; Based on code from https://gitlab.com/akku/akku-scm, written
+;;; 2018-2019 by Göran Weinholt <address@hidden>, as well as
+;;; https://github.com/okuoku/yuni, written 2014-2018 by OKUMURA Yuki
+;;; <address@hidden>.  This code was originally released under the
+;;; following terms:
+;;;
+;;;     To the extent possible under law, the author(s) have dedicated
+;;;     all copyright and related and neighboring rights to this
+;;;     software to the public domain worldwide. This software is
+;;;     distributed without any warranty.
+;;;
+;;;     See <http://creativecommons.org/publicdomain/zero/1.0/>, for a
+;;;     copy of the CC0 Public Domain Dedication.
+
+(define-module (scheme base)
+  #:use-module (srfi srfi-9)
+  #:use-module (srfi srfi-11)
+  #:use-module (rnrs conditions)
+  #:use-module (rnrs exceptions)
+  #:use-module (srfi srfi-43)
+  #:use-module (ice-9 textual-ports)
+  #:use-module (ice-9 binary-ports)
+  #:use-module (rnrs bytevectors)
+  #:export (error-object?
+            error-object-message error-object-irritants
+            file-error? read-error?
+            (r7:error . error)
+            (r7:cond-expand . cond-expand)
+            (r7:include . include)
+            (r7:include-ci . include-ci)
+            (r7:let-syntax . let-syntax)
+            binary-port? textual-port?
+            open-input-bytevector
+            open-output-bytevector get-output-bytevector
+            peek-u8 read-u8 read-bytevector read-bytevector!
+            read-string read-line
+            write-u8 write-bytevector write-string flush-output-port
+            (r7:string-map . string-map)
+            bytevector bytevector-append
+            string->vector
+            (r7:string->utf8 . string->utf8)
+            (r7:vector-copy . vector-copy)
+            (r7:vector->list . vector->list)
+            vector->string
+            (r7:bytevector-copy . bytevector-copy)
+            (r7:bytevector-copy! . bytevector-copy!)
+            (r7:utf8->string . utf8->string)
+            square
+            (r7:expt . expt)
+            boolean=? symbol=?
+            call-with-port
+            features
+            input-port-open? output-port-open?)
+  #:re-export
+  (_
+   ... => else
+   * + - / < <= = > >= abs and append apply assoc assq assv begin
+   boolean?
+   bytevector-length
+   bytevector-u8-ref bytevector-u8-set! bytevector? caar cadr
+   call-with-current-continuation call-with-values
+   call/cc car case cdar cddr cdr ceiling char->integer char-ready?
+   char<=? char<? char=? char>=? char>? char? close-input-port
+   close-output-port close-port complex? cond cons
+   current-error-port current-input-port current-output-port define
+   define-record-type define-syntax define-values denominator do
+   dynamic-wind eof-object eof-object? eq? equal? eqv?
+   even?
+   (inexact->exact . exact)
+   (exact->inexact . inexact)
+   exact-integer-sqrt exact-integer? exact?
+   floor floor-quotient floor-remainder floor/
+   for-each gcd
+   get-output-string guard if inexact?
+   input-port? integer->char integer? lambda lcm
+   length let let* let*-values let-values letrec letrec*
+   letrec-syntax list list->string list->vector list-copy list-ref
+   list-set! list-tail list? make-bytevector make-list make-parameter
+   make-string make-vector map max member memq memv min modulo
+   negative? newline not null? number->string number? numerator odd?
+   open-input-string
+   open-output-string or output-port? pair?
+   parameterize peek-char port? positive? procedure?
+   quasiquote quote quotient raise raise-continuable rational?
+   rationalize read-char
+   real? remainder reverse round set!
+   set-car! set-cdr! string string->list string->number
+   string->symbol string-append
+   string-copy string-copy! string-fill! string-for-each
+   string-length string-ref string-set! string<=? string<?
+   string=? string>=? string>? string? substring symbol->string
+   symbol? syntax-error syntax-rules truncate
+   truncate-quotient truncate-remainder truncate/
+   (char-ready? . u8-ready?)
+   unless
+   unquote unquote-splicing values vector
+   vector-append vector-copy! vector-fill!
+   vector-for-each vector-length vector-map vector-ref vector-set!
+   vector? when with-exception-handler write-char
+   zero?))
+
+(define-condition-type &irritants-condition &message
+  irritants-condition?
+  (irritants condition-irritants))
+
+(define error-object? irritants-condition?)
+(define (file-error? x) #f)
+(define (read-error? x) #f)
+
+(define (error-object-message obj)
+  (and (message-condition? obj)
+       (condition-message obj)))
+
+(define (error-object-irritants obj)
+  (and (irritants-condition? obj)
+       (condition-irritants obj)))
+
+(define (r7:error message . irritants)
+  (raise (condition
+          (&irritants (message message)
+                      (irritants irritants)))))
+
+(define-syntax r7:cond-expand
+  (lambda (x)
+    (define (has-req? req)
+      (syntax-case req (and or not library)
+        ((and req ...)
+         (and-map has-req? #'(req ...)))
+        ((or req ...)
+         (or-map has-req? #'(req ...)))
+        ((not req)
+         (not (has-req? #'req)))
+        ((library lib-name)
+         (->bool (resolve-interface (syntax->datum #'lib-name))))
+        (id
+         (identifier? #'id)
+         (memq (syntax->datum #'id) (features)))))
+    (syntax-case x (else)
+      ((_)
+       (syntax-violation 'cond-expand "Unfulfilled cond-expand" x))
+      ((_ (else body ...))
+       #'(begin body ...))
+      ((_ (req body ...) more-clauses ...)
+       (if (has-req? #'req)
+           #'(begin body ...)
+           #'(r7:cond-expand more-clauses ...))))))
+
+(define-syntax-rule (r7:include k fn* ...)
+  (begin (include k fn*) ...))
+
+;; FIXME
+(define-syntax-rule (r7:include-ci k fn* ...)
+  (r7:include k fn* ...))
+
+(define-syntax-rule (r7:let-syntax ((vars trans) ...) . expr)
+  (let-syntax ((vars trans) ...)
+    (let () . expr)))
+
+(define (boolean=? x y . y*)
+  (unless (boolean? x) (error "not a boolean" x))
+  (unless (boolean? y) (error "not a boolean" y))
+  (and (eq? x y)
+       (or (null? y*)
+           (apply boolean=? x y*))))
+
+(define (symbol=? x y . y*)
+  (unless (symbol? x) (error "not a symbol" x))
+  (unless (symbol? y) (error "not a symbol" y))
+  (and (symbol? x)
+       (eq? x y)
+       (or (null? y*)
+           (apply symbol=? x y*))))
+
+(define (binary-port? p) (port? p))
+(define (textual-port? p) (port? p))
+
+(define (open-input-bytevector bv) (open-bytevector-input-port bv))
+
+(define (open-output-bytevector)
+  (let-values (((p extract) (open-bytevector-output-port)))
+    (define pos 0)
+    (define buf #vu8())
+    (define (read! target target-start count)
+      (when (zero? (- (bytevector-length buf) pos))
+        (set! buf (bytevector-append buf (extract))))  ;resets p
+      (let ((count (min count (- (bytevector-length buf) pos))))
+        (bytevector-copy! buf pos
+                          target target-start count)
+        (set! pos (+ pos count))
+        count))
+    (define (write! bv start count)
+      (put-bytevector p bv start count)
+      (set! pos (+ pos count))
+      count)
+    (define (get-position)
+      pos)
+    (define (set-position! new-pos)
+      (set! pos new-pos))
+    (define (close)
+      (close-port p))
+    ;; It's actually an input/output port, but only
+    ;; get-output-bytevector should ever read from it. If it was just
+    ;; an output port then there would be no good way for
+    ;; get-output-bytevector to read the data. -weinholt
+    (make-custom-binary-input/output-port
+     "bytevector" read! write! get-position set-position! close)))
+
+(define (get-output-bytevector port)
+  ;; R7RS says "It is an error if port was not created with
+  ;; open-output-bytevector.", so we can safely assume that the port
+  ;; was created by open-output-bytevector. -weinholt
+  (seek port 0 SEEK_SET)
+  (let ((bv (get-bytevector-all port)))
+    (if (eof-object? bv)
+        #vu8()
+        bv)))
+
+(define* (peek-u8 #:optional (port (current-input-port)))
+  (lookahead-u8 port))
+
+(define* (read-u8 #:optional (port (current-output-port)))
+  (get-u8 port))
+
+(define* (read-bytevector len #:optional (port (current-input-port)))
+  (get-bytevector-n port len))
+
+(define* (read-string len #:optional (port (current-input-port)))
+  (get-string-n port len))
+
+(define* (read-bytevector! bv #:optional (port (current-input-port))
+                           (start 0) (end (bytevector-length bv)))
+  (get-bytevector-n! port bv start (- end start)))
+
+(define* (read-line #:optional (port (current-input-port)))
+  (get-line port))
+
+(define* (write-u8 obj #:optional (port (current-output-port)))
+  (put-u8 port obj))
+
+(define* (write-bytevector bv #:optional (port (current-output-port))
+                           (start 0) (end (bytevector-length bv)))
+  (put-bytevector port bv start (- end start)))
+
+(define* (write-string str #:optional (port (current-output-port))
+                       (start 0) (end (string-length str)))
+  (put-string port str start (- end start)))
+
+(define* (flush-output-port #:optional (port (current-output-port)))
+  (force-output port))
+
+(define (r7:string-map proc s . s*)
+  (if (null? s*)
+      (string-map proc s)
+      (list->string (apply map proc s (map string->list s*)))))
+
+(define (bytevector . lis)
+  (u8-list->bytevector lis))
+
+(define (call-with-bytevector-output-port proc)
+  (call-with-values (lambda () (open-output-bytevector))
+    (lambda (port get)
+      (proc port)
+      (get))))
+
+(define (bytevector-append . bvs)
+  (call-with-bytevector-output-port
+    (lambda (p)
+      (for-each (lambda (bv) (put-bytevector p bv)) bvs))))
+
+(define string->vector
+  (case-lambda
+    ((str) (list->vector (string->list str)))
+    ((str start) (string->vector (substring str start)))
+    ((str start end) (string->vector (substring str start end)))))
+
+(define r7:string->utf8
+  (case-lambda
+    ((str) (string->utf8 str))
+    ((str start) (string->utf8 (substring str start)))
+    ((str start end) (string->utf8 (substring str start end)))))
+
+;;; vector
+
+(define (%subvector v start end)
+  (define mlen (- end start))
+  (define out (make-vector (- end start)))
+  (define (itr r)
+    (if (= r mlen)
+      out
+      (begin
+        (vector-set! out r (vector-ref v (+ start r)))
+        (itr (+ r 1)))))
+  (itr 0))
+
+(define r7:vector-copy
+  (case-lambda*
+    ((v) (vector-copy v))
+    ((v start #:optional (end (vector-length v)))
+     (%subvector v start end))))
+
+(define r7:vector->list
+  (case-lambda*
+    ((v) (vector->list v))
+    ((v start #:optional (end (vector-length v)))
+     (vector->list (%subvector v start end)))))
+
+(define vector->string
+  (case-lambda*
+    ((v) (list->string (vector->list v)))
+    ((v start #:optional (end (vector-length v)))
+     (vector->string (%subvector v start end)))))
+
+(define r7:vector-fill!
+  (case-lambda*
+    ((vec fill) (vector-fill! vec fill))
+    ((vec fill start #:optional (end (vector-length vec)))
+     (let lp ((r start))
+       (unless (= r end)
+         (vector-set! vec r fill)
+         (lp (+ r 1)))))))
+
+(define (%subbytevector bv start end)
+  (define mlen (- end start))
+  (define out (make-bytevector mlen))
+  (bytevector-copy! bv start out 0 mlen)
+  out)
+
+(define (%subbytevector1 bv start)
+  (%subbytevector bv start (bytevector-length bv)))
+
+(define r7:bytevector-copy!
+  (case-lambda*
+   ((to at from #:optional
+        (start 0)
+        (end (+ start
+                (min (- (bytevector-length from) start)
+                     (- (bytevector-length to) at)))))
+    (bytevector-copy! from start to at (- end start)))))
+
+(define r7:bytevector-copy
+  (case-lambda*
+    ((bv) (bytevector-copy bv))
+    ((bv start #:optional (end (bytevector-length bv)))
+     (%subbytevector bv start end))))
+
+(define r7:utf8->string
+  (case-lambda*
+    ((bv) (utf8->string bv))
+    ((bv start #:optional (end (bytevector-length bv)))
+     (utf8->string (%subbytevector bv start end)))))
+
+(define (square x) (* x x))
+
+(define (r7:expt x y)
+  (if (eqv? x 0.0)
+      (exact->inexact (expt x y))
+      (expt x y)))
+
+(define (call-with-port port proc)
+  "Call @var{proc}, passing it @var{port} and closing @var{port} upon exit of
+@var{proc}.  Return the return values of @var{proc}."
+  (call-with-values
+      (lambda () (proc port))
+    (lambda vals
+      (close-port port)
+      (apply values vals))))
+
+(define (features)
+  (append
+   %cond-expand-features
+   (case (native-endianness)
+     ((big) '(big-endian))
+     ((little) '(little-endian))
+     (else '()))
+   '(r6rs
+     syntax-case
+     r7rs exact-closed ieee-float full-unicode ratios)))
+
+(define (input-port-open? port)
+  (and (not (port-closed? port)) (input-port? port)))
+
+(define (output-port-open? port)
+  (and (not (port-closed? port)) (output-port? port)))
diff --git a/module/scheme/case-lambda.scm b/module/scheme/case-lambda.scm
new file mode 100644
index 0000000..992d768
--- /dev/null
+++ b/module/scheme/case-lambda.scm
@@ -0,0 +1,19 @@
+;;; R7RS compatibility libraries
+;;; Copyright (C) 2019 Free Software Foundation, Inc.
+;;;
+;;; This library is free software: you can redistribute it and/or modify
+;;; it under the terms of the GNU Lesser General Public License as
+;;; published by the Free Software Foundation, either version 3 of the
+;;; License, or (at your option) any later version.
+;;;
+;;; This library 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
+;;; Lesser General Public License for more details.
+;;;
+;;; You should have received a copy of the GNU Lesser General Public
+;;; License along with this program.  If not, see
+;;; <http://www.gnu.org/licenses/>.
+
+(define-module (scheme case-lambda)
+  #:re-export (case-lambda))
diff --git a/module/scheme/char.scm b/module/scheme/char.scm
new file mode 100644
index 0000000..98a20f8
--- /dev/null
+++ b/module/scheme/char.scm
@@ -0,0 +1,81 @@
+;;; R7RS compatibility libraries
+;;; Copyright (C) 2019 Free Software Foundation, Inc.
+;;;
+;;; This library is free software: you can redistribute it and/or modify
+;;; it under the terms of the GNU Lesser General Public License as
+;;; published by the Free Software Foundation, either version 3 of the
+;;; License, or (at your option) any later version.
+;;;
+;;; This library 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
+;;; Lesser General Public License for more details.
+;;;
+;;; You should have received a copy of the GNU Lesser General Public
+;;; License along with this program.  If not, see
+;;; <http://www.gnu.org/licenses/>.
+
+;;; Based on code from https://gitlab.com/akku/akku-scm, written
+;;; 2018-2019 by Göran Weinholt <address@hidden>, as well as
+;;; https://github.com/okuoku/yuni, written 2014-2018 by OKUMURA Yuki
+;;; <address@hidden>.  This code was originally released under the
+;;; following terms:
+;;;
+;;;     To the extent possible under law, the author(s) have dedicated
+;;;     all copyright and related and neighboring rights to this
+;;;     software to the public domain worldwide. This software is
+;;;     distributed without any warranty.
+;;;
+;;;     See <http://creativecommons.org/publicdomain/zero/1.0/>, for a
+;;;     copy of the CC0 Public Domain Dedication.
+
+(define-module (scheme char)
+  #:use-module ((srfi srfi-43) #:select (vector-binary-search))
+  #:export (char-foldcase
+            string-foldcase
+            digit-value)
+  #:re-export (char-alphabetic?
+               char-ci<=? char-ci<? char-ci=? char-ci>=?
+               char-ci>? char-downcase char-lower-case?
+               char-numeric? char-upcase char-upper-case? char-whitespace?
+               string-ci<=? string-ci<? string-ci=?
+               string-ci>=? string-ci>? string-downcase
+               string-upcase))
+
+(define (char-foldcase char)
+    (if (or (eqv? char #\460) (eqv? char #\461))
+       char (char-downcase (char-upcase char))))
+
+(define (string-foldcase str) (string-downcase (string-upcase str)))
+
+;; The table can be extracted with:
+;; awk -F ';' '/ZERO;Nd/ {print "#x"$1}' UnicodeData.txt
+;; Up to date with Unicode 11.0.0
+
+(define *decimal-zeroes* '#(#x0030 #x0660 #x06F0 #x07C0 #x0966 #x09E6
+  #x0A66 #x0AE6 #x0B66 #x0BE6 #x0C66 #x0CE6 #x0D66 #x0DE6 #x0E50
+  #x0ED0 #x0F20 #x1040 #x1090 #x17E0 #x1810 #x1946 #x19D0 #x1A80
+  #x1A90 #x1B50 #x1BB0 #x1C40 #x1C50 #xA620 #xA8D0 #xA900 #xA9D0
+  #xA9F0 #xAA50 #xABF0 #xFF10 #x104A0 #x10D30 #x11066 #x110F0 #x11136
+  #x111D0 #x112F0 #x11450 #x114D0 #x11650 #x116C0 #x11730 #x118E0
+  #x11C50 #x11D50 #x11DA0 #x16A60 #x16B50 #x1D7CE #x1D7D8 #x1D7E2
+  #x1D7EC #x1D7F6 #x1E950))
+
+(define (digit-value char)
+  (define (cmp zero ch)
+    (if (integer? ch)
+        (- (cmp zero ch))
+        (let ((i (char->integer ch)))
+          (cond ((< i zero) 1)
+                ((> i (+ zero 9)) -1)
+                (else 0)))))
+  (unless (char? char)
+    (error "Expected a char" char))
+  (cond
+    ((char<=? #\0 char #\9)             ;fast case
+     (- (char->integer char) (char->integer #\0)))
+    ((vector-binary-search *decimal-zeroes* char cmp)
+     => (lambda (zero)
+          (- (char->integer char)
+             (vector-ref *decimal-zeroes* zero))))
+    (else #f)))
diff --git a/module/scheme/complex.scm b/module/scheme/complex.scm
new file mode 100644
index 0000000..c7403bc
--- /dev/null
+++ b/module/scheme/complex.scm
@@ -0,0 +1,22 @@
+;;; R7RS compatibility libraries
+;;; Copyright (C) 2019 Free Software Foundation, Inc.
+;;;
+;;; This library is free software: you can redistribute it and/or modify
+;;; it under the terms of the GNU Lesser General Public License as
+;;; published by the Free Software Foundation, either version 3 of the
+;;; License, or (at your option) any later version.
+;;;
+;;; This library 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
+;;; Lesser General Public License for more details.
+;;;
+;;; You should have received a copy of the GNU Lesser General Public
+;;; License along with this program.  If not, see
+;;; <http://www.gnu.org/licenses/>.
+
+(define-module (scheme complex)
+  #:re-export (make-polar
+               magnitude angle
+               make-rectangular
+               imag-part real-part))
diff --git a/module/scheme/cxr.scm b/module/scheme/cxr.scm
new file mode 100644
index 0000000..97856f2
--- /dev/null
+++ b/module/scheme/cxr.scm
@@ -0,0 +1,42 @@
+;;; R7RS compatibility libraries
+;;; Copyright (C) 2019 Free Software Foundation, Inc.
+;;;
+;;; This library is free software: you can redistribute it and/or modify
+;;; it under the terms of the GNU Lesser General Public License as
+;;; published by the Free Software Foundation, either version 3 of the
+;;; License, or (at your option) any later version.
+;;;
+;;; This library 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
+;;; Lesser General Public License for more details.
+;;;
+;;; You should have received a copy of the GNU Lesser General Public
+;;; License along with this program.  If not, see
+;;; <http://www.gnu.org/licenses/>.
+
+(define-module (scheme cxr)
+  #:re-export (caaaar
+               caaadr
+               caaar
+               caadar
+               caaddr
+               caadr
+               cadaar
+               cadadr
+               cadar
+               caddar
+               cadddr
+               caddr
+               cdaaar
+               cdaadr
+               cdaar
+               cdadar
+               cdaddr
+               cdadr
+               cddaar
+               cddadr
+               cddar
+               cdddar
+               cddddr
+               cdddr))
diff --git a/module/scheme/eval.scm b/module/scheme/eval.scm
new file mode 100644
index 0000000..12aaa50
--- /dev/null
+++ b/module/scheme/eval.scm
@@ -0,0 +1,31 @@
+;;; R7RS compatibility libraries
+;;; Copyright (C) 2019 Free Software Foundation, Inc.
+;;;
+;;; This library is free software: you can redistribute it and/or modify
+;;; it under the terms of the GNU Lesser General Public License as
+;;; published by the Free Software Foundation, either version 3 of the
+;;; License, or (at your option) any later version.
+;;;
+;;; This library 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
+;;; Lesser General Public License for more details.
+;;;
+;;; You should have received a copy of the GNU Lesser General Public
+;;; License along with this program.  If not, see
+;;; <http://www.gnu.org/licenses/>.
+
+(define-module (scheme eval)
+  #:use-module (ice-9 match)
+  #:export (environment)
+  #:re-export (eval))
+
+(define (environment . import-specs)
+  (let ((module (make-module)))
+    (beautify-user-module! module)
+    (for-each (lambda (import-spec)
+                (eval (list 'import import-spec) module))
+             import-specs)
+    (unless (member '(guile) import-specs)
+      (purify-module! module))
+    module))
diff --git a/module/scheme/file.scm b/module/scheme/file.scm
new file mode 100644
index 0000000..b92849a
--- /dev/null
+++ b/module/scheme/file.scm
@@ -0,0 +1,24 @@
+;;; R7RS compatibility libraries
+;;; Copyright (C) 2019 Free Software Foundation, Inc.
+;;;
+;;; This library is free software: you can redistribute it and/or modify
+;;; it under the terms of the GNU Lesser General Public License as
+;;; published by the Free Software Foundation, either version 3 of the
+;;; License, or (at your option) any later version.
+;;;
+;;; This library 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
+;;; Lesser General Public License for more details.
+;;;
+;;; You should have received a copy of the GNU Lesser General Public
+;;; License along with this program.  If not, see
+;;; <http://www.gnu.org/licenses/>.
+
+(define-module (scheme file)
+  #:re-export ((open-input-file . open-binary-input-file)
+               (open-output-file . open-binary-output-file)
+               call-with-input-file call-with-output-file
+               delete-file file-exists?
+               open-input-file open-output-file with-input-from-file
+               with-output-to-file))
diff --git a/module/scheme/inexact.scm b/module/scheme/inexact.scm
new file mode 100644
index 0000000..9d1e6db
--- /dev/null
+++ b/module/scheme/inexact.scm
@@ -0,0 +1,56 @@
+;;; R7RS compatibility libraries
+;;; Copyright (C) 2019 Free Software Foundation, Inc.
+;;;
+;;; This library is free software: you can redistribute it and/or modify
+;;; it under the terms of the GNU Lesser General Public License as
+;;; published by the Free Software Foundation, either version 3 of the
+;;; License, or (at your option) any later version.
+;;;
+;;; This library 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
+;;; Lesser General Public License for more details.
+;;;
+;;; You should have received a copy of the GNU Lesser General Public
+;;; License along with this program.  If not, see
+;;; <http://www.gnu.org/licenses/>.
+
+;;; Based on code from https://gitlab.com/akku/akku-scm, written
+;;; 2018-2019 by Göran Weinholt <address@hidden>, as well as
+;;; https://github.com/okuoku/yuni, written 2014-2018 by OKUMURA Yuki
+;;; <address@hidden>.  This code was originally released under the
+;;; following terms:
+;;;
+;;;     To the extent possible under law, the author(s) have dedicated
+;;;     all copyright and related and neighboring rights to this
+;;;     software to the public domain worldwide. This software is
+;;;     distributed without any warranty.
+;;;
+;;;     See <http://creativecommons.org/publicdomain/zero/1.0/>, for a
+;;;     copy of the CC0 Public Domain Dedication.
+
+(define-module (scheme inexact)
+  #:re-export ((exact->inexact . inexact)
+               (inexact->exact . exact)
+               acos asin atan cos exp log sin sqrt tan)
+  #:export ((r7:finite? . finite?)
+            (r7:infinite? . infinite?)
+            (r7:nan? . nan?)))
+
+(define (r7:finite? z)
+  (if (complex? z)
+      (and (finite? (real-part z))
+           (finite? (imag-part z)))
+      (finite? z)))
+
+(define (r7:infinite? z)
+  (if (complex? z)
+      (or (inf? (real-part z))
+          (inf? (imag-part z)))
+      (inf? z)))
+
+(define (r7:nan? z)
+  (if (complex? z)
+      (or (nan? (real-part z))
+          (nan? (imag-part z)))
+      (nan? z)))
diff --git a/module/scheme/lazy.scm b/module/scheme/lazy.scm
new file mode 100644
index 0000000..c8cf8e1
--- /dev/null
+++ b/module/scheme/lazy.scm
@@ -0,0 +1,24 @@
+;;; R7RS compatibility libraries
+;;; Copyright (C) 2019 Free Software Foundation, Inc.
+;;;
+;;; This library is free software: you can redistribute it and/or modify
+;;; it under the terms of the GNU Lesser General Public License as
+;;; published by the Free Software Foundation, either version 3 of the
+;;; License, or (at your option) any later version.
+;;;
+;;; This library 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
+;;; Lesser General Public License for more details.
+;;;
+;;; You should have received a copy of the GNU Lesser General Public
+;;; License along with this program.  If not, see
+;;; <http://www.gnu.org/licenses/>.
+
+(define-module (scheme lazy)
+  #:use-module (srfi srfi-45)
+  #:re-export ((eager . make-promise)
+               (lazy . delay-force)
+               delay
+               force
+               promise?))
diff --git a/module/scheme/load.scm b/module/scheme/load.scm
new file mode 100644
index 0000000..0be8d4b
--- /dev/null
+++ b/module/scheme/load.scm
@@ -0,0 +1,25 @@
+;;; R7RS compatibility libraries
+;;; Copyright (C) 2019 Free Software Foundation, Inc.
+;;;
+;;; This library is free software: you can redistribute it and/or modify
+;;; it under the terms of the GNU Lesser General Public License as
+;;; published by the Free Software Foundation, either version 3 of the
+;;; License, or (at your option) any later version.
+;;;
+;;; This library 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
+;;; Lesser General Public License for more details.
+;;;
+;;; You should have received a copy of the GNU Lesser General Public
+;;; License along with this program.  If not, see
+;;; <http://www.gnu.org/licenses/>.
+
+(define-module (scheme load)
+  #:export ((r7:load . load)))
+
+(define* (r7:load fn #:optional (env (current-module)))
+  (save-module-excursion
+   (lambda ()
+     (set-current-module env)
+     (load fn))))
diff --git a/module/scheme/process-context.scm 
b/module/scheme/process-context.scm
new file mode 100644
index 0000000..5119cf0
--- /dev/null
+++ b/module/scheme/process-context.scm
@@ -0,0 +1,58 @@
+;;; R7RS compatibility libraries
+;;; Copyright (C) 2019 Free Software Foundation, Inc.
+;;;
+;;; This library is free software: you can redistribute it and/or modify
+;;; it under the terms of the GNU Lesser General Public License as
+;;; published by the Free Software Foundation, either version 3 of the
+;;; License, or (at your option) any later version.
+;;;
+;;; This library 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
+;;; Lesser General Public License for more details.
+;;;
+;;; You should have received a copy of the GNU Lesser General Public
+;;; License along with this program.  If not, see
+;;; <http://www.gnu.org/licenses/>.
+
+;;; Based on code from https://gitlab.com/akku/akku-scm, written
+;;; 2018-2019 by Göran Weinholt <address@hidden>, as well as
+;;; https://github.com/okuoku/yuni, written 2014-2018 by OKUMURA Yuki
+;;; <address@hidden>.  This code was originally released under the
+;;; following terms:
+;;;
+;;;     To the extent possible under law, the author(s) have dedicated
+;;;     all copyright and related and neighboring rights to this
+;;;     software to the public domain worldwide. This software is
+;;;     distributed without any warranty.
+;;;
+;;;     See <http://creativecommons.org/publicdomain/zero/1.0/>, for a
+;;;     copy of the CC0 Public Domain Dedication.
+
+(define-module (scheme process-context)
+  #:use-module (srfi srfi-98)
+  #:re-export (command-line
+               get-environment-variable
+               get-environment-variables)
+  #:export (emergency-exit
+            (r7:exit . exit)))
+
+(define (translate-status status)
+  (case status
+    ((#t) 0)
+    ((#f) 1)
+    (else status)))
+
+(define r7:exit
+  (case-lambda
+    (()
+     (exit))
+    ((status)
+     (exit (translate-status status)))))
+
+(define emergency-exit
+  (case-lambda
+    (()
+     (primitive-_exit))
+    ((status)
+     (primitive-_exit (translate-status status)))))
diff --git a/module/scheme/r5rs.scm b/module/scheme/r5rs.scm
new file mode 100644
index 0000000..6ccf511
--- /dev/null
+++ b/module/scheme/r5rs.scm
@@ -0,0 +1,134 @@
+;;; R7RS compatibility libraries
+;;; Copyright (C) 2019 Free Software Foundation, Inc.
+;;;
+;;; This library is free software: you can redistribute it and/or modify
+;;; it under the terms of the GNU Lesser General Public License as
+;;; published by the Free Software Foundation, either version 3 of the
+;;; License, or (at your option) any later version.
+;;;
+;;; This library 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
+;;; Lesser General Public License for more details.
+;;;
+;;; You should have received a copy of the GNU Lesser General Public
+;;; License along with this program.  If not, see
+;;; <http://www.gnu.org/licenses/>.
+
+(define-module (scheme r5rs)
+  #:use-module ((ice-9 safe-r5rs) #:select (null-environment))
+  #:use-module ((ice-9 r5rs) #:select (scheme-report-environment
+                                       interaction-environment))
+  #:re-export (quote
+               quasiquote
+               unquote unquote-splicing
+               define-syntax let-syntax letrec-syntax
+               define lambda let let* letrec begin do
+               if set! delay and or
+               syntax-rules _ ... else =>
+
+               eqv? eq? equal?
+               number? complex? real? rational? integer?
+               exact? inexact?
+               = < > <= >=
+               zero? positive? negative? odd? even?
+               max min
+               + * - /
+               abs
+               quotient remainder modulo
+               gcd lcm
+               numerator denominator
+               rationalize
+               floor ceiling truncate round
+               exp log sin cos tan asin acos atan
+               sqrt
+               expt
+               make-rectangular make-polar real-part imag-part magnitude angle
+               exact->inexact inexact->exact
+
+               number->string string->number
+
+               boolean?
+               not
+
+               pair?
+               cons car cdr
+               set-car! set-cdr!
+               caar cadr cdar cddr
+               caaar caadr cadar caddr cdaar cdadr cddar cdddr
+               caaaar caaadr caadar caaddr cadaar cadadr caddar cadddr
+               cdaaar cdaadr cdadar cdaddr cddaar cddadr cdddar cddddr
+               null?
+               list?
+               list
+               length
+               append
+               reverse
+               list-tail list-ref
+               memq memv member
+               assq assv assoc
+
+               symbol?
+               symbol->string string->symbol
+
+               char?
+               char=? char<? char>? char<=? char>=?
+               char-ci=? char-ci<? char-ci>? char-ci<=? char-ci>=?
+               char-alphabetic? char-numeric? char-whitespace?
+               char-upper-case? char-lower-case?
+               char->integer integer->char
+               char-upcase
+               char-downcase
+
+               string?
+               make-string
+               string
+               string-length
+               string-ref string-set!
+               string=? string-ci=?
+               string<? string>? string<=? string>=?
+               string-ci<? string-ci>? string-ci<=? string-ci>=?
+               substring
+               string-length
+               string-append
+               string->list list->string
+               string-copy string-fill!
+
+               vector?
+               make-vector
+               vector
+               vector-length
+               vector-ref vector-set!
+               vector->list list->vector
+               vector-fill!
+
+               procedure?
+               apply
+               map
+               for-each
+               force
+
+               call-with-current-continuation
+
+               values
+               call-with-values
+               dynamic-wind
+
+               eval
+
+               input-port? output-port?
+               current-input-port current-output-port
+
+               read
+               read-char
+               peek-char
+               eof-object?
+               char-ready?
+
+               write
+               display
+               newline
+               write-char
+
+               null-environment
+               scheme-report-environment interaction-environment))
diff --git a/module/scheme/read.scm b/module/scheme/read.scm
new file mode 100644
index 0000000..89f3a1b
--- /dev/null
+++ b/module/scheme/read.scm
@@ -0,0 +1,19 @@
+;;; R7RS compatibility libraries
+;;; Copyright (C) 2019 Free Software Foundation, Inc.
+;;;
+;;; This library is free software: you can redistribute it and/or modify
+;;; it under the terms of the GNU Lesser General Public License as
+;;; published by the Free Software Foundation, either version 3 of the
+;;; License, or (at your option) any later version.
+;;;
+;;; This library 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
+;;; Lesser General Public License for more details.
+;;;
+;;; You should have received a copy of the GNU Lesser General Public
+;;; License along with this program.  If not, see
+;;; <http://www.gnu.org/licenses/>.
+
+(define-module (scheme read)
+  #:re-export (read))
diff --git a/module/scheme/repl.scm b/module/scheme/repl.scm
new file mode 100644
index 0000000..b25efd8
--- /dev/null
+++ b/module/scheme/repl.scm
@@ -0,0 +1,19 @@
+;;; R7RS compatibility libraries
+;;; Copyright (C) 2019 Free Software Foundation, Inc.
+;;;
+;;; This library is free software: you can redistribute it and/or modify
+;;; it under the terms of the GNU Lesser General Public License as
+;;; published by the Free Software Foundation, either version 3 of the
+;;; License, or (at your option) any later version.
+;;;
+;;; This library 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
+;;; Lesser General Public License for more details.
+;;;
+;;; You should have received a copy of the GNU Lesser General Public
+;;; License along with this program.  If not, see
+;;; <http://www.gnu.org/licenses/>.
+
+(define-module (scheme repl)
+  #:re-export (interaction-environment))
diff --git a/module/scheme/time.scm b/module/scheme/time.scm
new file mode 100644
index 0000000..a5d43df
--- /dev/null
+++ b/module/scheme/time.scm
@@ -0,0 +1,31 @@
+;;; R7RS compatibility libraries
+;;; Copyright (C) 2019 Free Software Foundation, Inc.
+;;;
+;;; This library is free software: you can redistribute it and/or modify
+;;; it under the terms of the GNU Lesser General Public License as
+;;; published by the Free Software Foundation, either version 3 of the
+;;; License, or (at your option) any later version.
+;;;
+;;; This library 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
+;;; Lesser General Public License for more details.
+;;;
+;;; You should have received a copy of the GNU Lesser General Public
+;;; License along with this program.  If not, see
+;;; <http://www.gnu.org/licenses/>.
+
+(define-module (scheme time)
+  #:use-module (srfi srfi-19)
+  #:export (current-jiffy current-second jiffies-per-second))
+
+(define (jiffies-per-second)
+  internal-time-units-per-second)
+
+(define (current-jiffy)
+  (get-internal-real-time))
+
+(define (current-second)
+  (let ((t (current-time time-tai)))
+    (+ (time-second t)
+       (* 1e-9 (time-nanosecond t)))))
diff --git a/module/scheme/write.scm b/module/scheme/write.scm
new file mode 100644
index 0000000..945827b
--- /dev/null
+++ b/module/scheme/write.scm
@@ -0,0 +1,23 @@
+;;; R7RS compatibility libraries
+;;; Copyright (C) 2019 Free Software Foundation, Inc.
+;;;
+;;; This library is free software: you can redistribute it and/or modify
+;;; it under the terms of the GNU Lesser General Public License as
+;;; published by the Free Software Foundation, either version 3 of the
+;;; License, or (at your option) any later version.
+;;;
+;;; This library 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
+;;; Lesser General Public License for more details.
+;;;
+;;; You should have received a copy of the GNU Lesser General Public
+;;; License along with this program.  If not, see
+;;; <http://www.gnu.org/licenses/>.
+
+(define-module (scheme write)
+  #:use-module (srfi srfi-38)
+  #:re-export (display
+               write
+               (write-with-shared-structure . write-shared)
+               (write . write-simple)))



reply via email to

[Prev in Thread] Current Thread [Next in Thread]