Read-in-scheme replaces boot "read" definition
authorAndy Wingo <wingo@pobox.com>
Tue, 2 Mar 2021 20:54:42 +0000 (21:54 +0100)
committerAndy Wingo <wingo@pobox.com>
Wed, 3 Mar 2021 16:08:55 +0000 (17:08 +0100)
Instead of defining a separate module, given that "read" calls are quite
all over the place, we're just going to replace the boot "read" binding
with read.scm.  This way, we'll be able to remove support for reader
options in the boot reader, as it will only ever be used for a finite
set of files.

* NEWS: Update.
* module/Makefile.am (ice-9/boot-9.go): Depend on read.scm.
(SOURCES):
* am/bootstrap.am (SOURCES): Don't build a ice-9/read.go, as we include
it.
* module/ice-9/boot-9.scm (read-syntax): Define here, as "include" now
uses it.
(read-hash-procedures, read-hash-procedure, read-hash-extend): New
procedures.  Will replace C variants.
(read, read-syntax): Include read.scm to define these.
* module/ice-9/psyntax-pp.scm (include): Regenerate.
* module/ice-9/psyntax.scm (include): Use read-syntax, so we get better
source information.
* module/ice-9/read.scm (let*-values): New local definition, to avoid
loading srfi-11.
(%read): Use list->typed-array instead of u8-list->bytevector.
* module/language/scheme/spec.scm: Remove (ice-9 read) import;
read-syntax is there in the boot environment

NEWS
am/bootstrap.am
module/Makefile.am
module/ice-9/boot-9.scm
module/ice-9/psyntax-pp.scm
module/ice-9/psyntax.scm
module/ice-9/read.scm
module/language/scheme/spec.scm
test-suite/tests/bytevectors.test
test-suite/tests/chars.test
test-suite/tests/reader.test

diff --git a/NEWS b/NEWS
index c42896a838f404eee6e4e75beb8327955dee0adc..54cee9af849bb9d6fa1aea107d048978a27d0559 100644 (file)
--- a/NEWS
+++ b/NEWS
@@ -109,7 +109,7 @@ See the newly reorganized "Foreign Function Interface", for details.
 These new interfaces replace `dynamic-link', `dynamic-pointer' and
 similar, which will eventually be deprecated.
 
-** `read-syntax' and the `(ice-9 read)' module
+** `read-syntax'
 ** `syntax-sourcev'
 ** `quote-syntax'
 
index 2f5804fe1ae182bb779dd696ccad07e940b944a6..acc00c7626ad23689757bee90f45a36c9f8e56b5 100644 (file)
@@ -102,7 +102,6 @@ SOURCES =                                   \
   ice-9/match.scm                              \
   ice-9/networking.scm                         \
   ice-9/posix.scm                              \
-  ice-9/read.scm                               \
   ice-9/rdelim.scm                             \
   ice-9/receive.scm                            \
   ice-9/regex.scm                              \
index 516fb3a3eed7ea624025c68daee48517e35141bc..b836812ac70942ee234cdc4b8bb89598bff1e519 100644 (file)
@@ -27,7 +27,7 @@ modpath =
 VM_TARGETS := system/vm/assembler.go system/vm/disassembler.go
 $(VM_TARGETS): $(top_builddir)/libguile/vm-operations.h
 
-ice-9/boot-9.go: ice-9/boot-9.scm ice-9/quasisyntax.scm ice-9/r6rs-libraries.scm ice-9/r7rs-libraries.scm
+ice-9/boot-9.go: ice-9/boot-9.scm ice-9/quasisyntax.scm ice-9/r6rs-libraries.scm ice-9/r7rs-libraries.scm ice-9/read.scm
 ice-9/match.go: ice-9/match.scm ice-9/match.upstream.scm
 srfi/srfi-64.go: srfi/srfi-64.scm srfi/srfi-64/testing.scm
 $(nobase_ccache_DATA): ../bootstrap/ice-9/eval.go
@@ -146,7 +146,6 @@ SOURCES =                                   \
   ice-9/q.scm                                  \
   ice-9/r5rs.scm                               \
   ice-9/rdelim.scm                             \
-  ice-9/read.scm                               \
   ice-9/receive.scm                            \
   ice-9/regex.scm                              \
   ice-9/runq.scm                               \
index f49516d6c1a4367330b66b04fe58df36e08c9e35..126459d167fc15a051cde5ef1cca952e66c303af 100644 (file)
@@ -375,6 +375,13 @@ If returning early, return the return value of F."
 (define (resolve-module . args)
   #f)
 
+;; The definition of "include" needs read-syntax.  Replaced later.
+(define (read-syntax port)
+  (let ((datum (read port)))
+    (if (eof-object? datum)
+        datum
+        (datum->syntax #f datum))))
+
 ;; API provided by psyntax
 (define syntax-violation #f)
 (define datum->syntax #f)
@@ -2216,6 +2223,19 @@ name extensions listed in %load-extensions."
 ;;; Reader code for various "#c" forms.
 ;;;
 
+(define read-hash-procedures
+  (fluid->parameter %read-hash-procedures))
+
+(define (read-hash-procedure ch)
+  (assq-ref (read-hash-procedures) ch))
+
+(define (read-hash-extend ch proc)
+  (let ((alist (read-hash-procedures)))
+    (read-hash-procedures
+     (if proc
+         (assq-set! alist ch proc)
+         (assq-remove! alist ch)))))
+
 (define read-eval? (make-fluid #f))
 (read-hash-extend #\.
                   (lambda (c port)
@@ -4621,6 +4641,19 @@ R7RS."
 
 \f
 
+;;; {`read' implementation in Scheme.}
+;;;
+;;;
+
+(call-with-values (lambda ()
+                    (include-from-path "ice-9/read.scm")
+                    (values read read-syntax))
+  (lambda (read* read-syntax*)
+    (set! read read*)
+    (set! read-syntax read-syntax*)))
+
+\f
+
 ;;; {Threads}
 ;;;
 
index 1e30a980355113ef705617968cecfd02e031dbc6..554ae0e2870263d1f4e290b70b4ad137498d2f34 100644 (file)
                          (lambda (p)
                            (cons (make-syntax 'begin '((top)) '(hygiene guile))
                                  (let lp ()
-                                   (let ((x (read p)))
+                                   (let ((x (read-syntax p)))
                                      (if (eof-object? x) '() (cons (datum->syntax filename x) (lp)))))))))
                      tmp)
               (syntax-violation
index 57ac6a68095ac388bdaa53f1e9eb73a149c68343..b52bb397e2e89da63ff26fb2faf516a03f7dc68d 100644 (file)
@@ -3267,7 +3267,7 @@ names."
           ;; In Guile, (cons #'a #'b) is the same as #'(a . b).
           (cons #'begin
                 (let lp ()
-                  (let ((x (read p)))
+                  (let ((x (read-syntax p)))
                     (if (eof-object? x)
                         #'()
                         (cons (datum->syntax #'filename x) (lp))))))))))))
index 7ce4b416a82d1fcc9dfa70bc0ba719ee11783b69..7f79bf9f948de989e28eaf94dc61fb625d5949c0 100644 (file)
 ;; #@-(1 2 3) => #(1 2 3)
 ;; (#*10101010102) => (#*1010101010 2)
 
-(define-module (ice-9 read)
-  #:use-module (srfi srfi-11)
-  #:use-module (rnrs bytevectors)
-  #:replace (read)
-  #:export (read-syntax))
-
-(define read-hash-procedures
-  (fluid->parameter %read-hash-procedures))
-
-(define (read-hash-procedure ch)
-  (assq-ref (read-hash-procedures) ch))
-
-(define (read-hash-extend ch proc)
-  (let ((alist (read-hash-procedures)))
-    (read-hash-procedures
-     (if proc
-         (assq-set! alist ch proc)
-         (assq-remove! alist ch)))))
+(define-syntax let*-values
+  (syntax-rules ()
+    ((_ () . body) (let () . body))
+    ((_ ((vars expr) . binds) . body)
+     (call-with-values (lambda () expr)
+       (lambda vars (let*-values binds . body))))))
 
 (define bitfield:record-positions? 0)
 (define bitfield:case-insensitive? 2)
     (expect #\u)
     (expect #\8)
     (expect #\()
-    (u8-list->bytevector (map strip-annotation (read-parenthesized #\)))))
+    (list->typed-array 'vu8 1
+                       (map strip-annotation (read-parenthesized #\)))))
 
   ;; FIXME: We should require a terminating delimiter.
   (define (read-bitvector)
         (and (not (eof-object? ch))
              (let ((digit (- (char->integer ch) (char->integer #\0))))
                (and (<= 0 digit 9) digit))))
-      (let-values (((sign ch) (if (eqv? ch #\-)
-                                  (values -1 (next))
-                                  (values 1 ch))))
+      (let*-values (((sign ch) (if (eqv? ch #\-)
+                                   (values -1 (next))
+                                   (values 1 ch))))
         (let lp ((ch ch) (res #f))
           (cond
            ((decimal-digit ch)
            (else
             (values ch (if res (* res sign) alt)))))))
     (define (read-rank ch)
-      (let-values (((ch rank) (read-decimal-integer ch 1)))
+      (let*-values (((ch rank) (read-decimal-integer ch 1)))
         (when (< rank 0)
           (error "array rank must be non-negative"))
         (when (eof-object? ch)
index b15005372b8ee5d37533ff992a32f53b90aa931f..18af552ef2d98e536d47990984a14b315296b2d2 100644 (file)
@@ -1,6 +1,6 @@
 ;;; Guile Scheme specification
 
-;; Copyright (C) 2001, 2009, 2010, 2011, 2012 Free Software Foundation, Inc.
+;; Copyright (C) 2001, 2009, 2010, 2011, 2012, 2021 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
@@ -21,7 +21,6 @@
 (define-module (language scheme spec)
   #:use-module (system base compile)
   #:use-module (system base language)
-  #:use-module (ice-9 read)
   #:use-module (language scheme compile-tree-il)
   #:use-module (language scheme decompile-tree-il)
   #:export (scheme))
index 5d4568d82550f52d6cd509095337f7b2d555dba3..9ae040f1e4bdb07cd622cd701de447f02c784507 100644 (file)
@@ -1,6 +1,6 @@
 ;;;; bytevectors.test --- R6RS bytevectors. -*- mode: scheme; coding: utf-8; -*-
 ;;;;
-;;;; Copyright (C) 2009-2015, 2018 Free Software Foundation, Inc.
+;;;; Copyright (C) 2009-2015, 2018, 2021 Free Software Foundation, Inc.
 ;;;;
 ;;;; Ludovic Courtès
 ;;;;
     (with-input-from-string "#vu8 (1 2 3)" read))
 
   (pass-if-exception "negative integers"
-    exception:wrong-type-arg
+    exception:out-of-range
     (with-input-from-string "#vu8(-1 -2 -3)" read))
 
   (pass-if-exception "out-of-range integers"
-    exception:wrong-type-arg
+    exception:out-of-range
     (with-input-from-string "#vu8(0 256)" read)))
 
 \f
index 55cfead2319e43b6a7844f7cd17c5fd5e93a7279..0a3b314915d4694c1c591ca690f5c626d4fb917f 100644 (file)
@@ -1,7 +1,7 @@
 ;;;; chars.test --- Characters.       -*- coding: utf-8; mode: scheme; -*-
 ;;;; Greg J. Badros <gjb@cs.washington.edu>
 ;;;;
-;;;; Copyright (C) 2000, 2006, 2009, 2010, 2013 Free Software Foundation, Inc.
+;;;; Copyright (C) 2000, 2006, 2009, 2010, 2013, 2021 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
@@ -25,9 +25,6 @@
 (define exception:unknown-character-name
   (cons #t "unknown character"))
 
-(define exception:out-of-range-octal
-  (cons #t "out-of-range"))
-
 
 (with-test-prefix "basic char handling"
 
       (integer->char #x110000))
 
     (pass-if-exception "octal out of range, surrrogate" 
-                       exception:out-of-range-octal
+                       exception:out-of-range
       (with-input-from-string "#\\154000" read))
 
     (pass-if-exception "octal out of range, too big" 
-                       exception:out-of-range-octal
+                       exception:out-of-range
       (with-input-from-string "#\\4200000" read)))
 
   (with-test-prefix "case"
index ef11a4abdf6a8d3043ab1df402c94a88ec0a294b..203d40645344153e0739468ebcf4ce735c5c69b1 100644 (file)
@@ -1,6 +1,6 @@
 ;;;; reader.test --- Reader test.    -*- coding: iso-8859-1; mode: scheme -*-
 ;;;;
-;;;; Copyright (C) 1999, 2001-2003, 2007-2011, 2013-2015, 2020
+;;;; Copyright (C) 1999,2001-2003,2007-2011,2013-2015,2020,2021
 ;;;;   Free Software Foundation, Inc.
 ;;;;
 ;;;; Jim Blandy <jimb@red-bean.com>
@@ -25,7 +25,7 @@
 
 
 (define exception:eof
-  (cons 'read-error "end of file$"))
+  (cons 'read-error "unexpected end of input"))
 (define exception:unexpected-rparen
   (cons 'read-error "unexpected \")\"$"))
 (define exception:unexpected-rsqbracket
@@ -37,9 +37,9 @@
 (define exception:unknown-sharp-object
   (cons 'read-error "Unknown # object: .*$"))
 (define exception:eof-in-string
-  (cons 'read-error "end of file in string constant$"))
+  (cons 'read-error "end of input while reading string$"))
 (define exception:eof-in-symbol
-  (cons 'read-error "end of file while reading symbol$"))
+  (cons 'read-error "end of input while reading symbol$"))
 (define exception:invalid-escape
   (cons 'read-error "invalid character in escape sequence: .*$"))
 (define exception:missing-expression
   (pass-if "square brackets are parens"
     (equal? '() (read-string "[]")))
 
-  (pass-if-exception "paren mismatch" exception:unexpected-rparen
+  (pass-if-exception "paren mismatch" exception:mismatched-paren
                      (read-string "'[)"))
 
-  (pass-if-exception "paren mismatch (2)" exception:unexpected-rsqbracket
+  (pass-if-exception "paren mismatch (2)" exception:mismatched-paren
                      (read-string "'(]"))
 
   (pass-if-exception "paren mismatch (3)" exception:mismatched-paren