From e109c255ad28591a40b994d1d38c6816443e4aa4 Mon Sep 17 00:00:00 2001 From: Peter McGoron Date: Sun, 22 Sep 2024 00:00:26 -0400 Subject: [PATCH] read: vectors --- read.scm | 38 +++++++++++++++++++++++++++++++++++++- 1 file changed, 37 insertions(+), 1 deletion(-) diff --git a/read.scm b/read.scm index 004bd9e..d9ea7f7 100644 --- a/read.scm +++ b/read.scm @@ -139,6 +139,11 @@ (map:val node)))) (action table char acc port))))) +;;; Run the action in TABLE with the next character from PORT. +(define readtable:next + (lambda (table acc port) + (readtable:act table (port 'read) acc port))) + ;;; Return a new readtable where CHAR is bound to ACTION. (define readtable:update (lambda (table char action) @@ -196,6 +201,13 @@ (lambda (oldtable char acc port) (readtable:act newtable char acc port)))) +;;; Jump to a new readtable, reading the new character, with the old +;;; readtable as ACC. +(define readtable:next/old-as-acc + (lambda (newtable) + (lambda (oldtable __ _ port) + (readtable:next newtable oldtable port)))) + ;;; ;;;;;;;;;;;;;;;;; ;;; Identifier reader ;;; ;;;;;;;;;;;;;;;;; @@ -339,7 +351,29 @@ readtable:read-improper-cdr) port))) +(define readtable:read-proper-list + (lambda (table port) + (readtable:read-list-loop (readtable:table-for-list + table + (readtable:error "expected proper list")) + port))) + +;;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;;; Reader for datum that start with "#" +;;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + +(define readtable:vector + (lambda (_ __ toplevel port) + (list 'vector (readtable:read-proper-list toplevel port)))) + +(define readtable:hash + (readtable:process + (readtable:empty/default (readtable:error "unimplemented")) + (list readtable:update %bol readtable:vector))) + +;;; ;;;;;;;;;;;;;;;; ;;; Toplevel reader. +;;; ;;;;;;;;;;;;;;;; ;;; This is defined as a function so that it dynamically loads each ;;; sub-readtable. (define readtable:top @@ -350,6 +384,8 @@ (list readtable:update #f (readtable:return 'eof)) (list readtable:update %bol readtable:read-list) (list readtable:update %eol (readtable:error "unbalanced list")) + (list readtable:update #\# (readtable:next/old-as-acc + readtable:hash)) (list readtable:update #\; (readtable:jump-discard readtable:read-to-newline))))) @@ -387,4 +423,4 @@ (read-all "(a b c def (ghi j) k )") (read-all "( a . b )") (read-all "( a .b . c)") - +(read-all "#( a b y)")