No matching definitions.

tur/r7rs/read

stdlib/r7rs/read.tur

(scheme read): read, the datum reader over a textual port.

An on-demand R7RS library (see stdlib/r7rs/time.tur): the load expander splices this file in when a Scheme file imports (scheme read). It reads the R7RS external representation (7.1.2) from a port's bytes, which is enough because every delimiter is ASCII -- the bytes of a UTF-8 character ride through tokens and strings untouched, and a #\ character is decoded.

Covered: lists, dotted pairs and [...]; vectors #(...) and bytevectors #u8(...); strings with every R7RS escape and the line continuation; |...| symbols; #\ characters by glyph, name or #\xHH; #t/#true/#f/#false; numbers with #e #i #x #b #o #d prefixes; ' ` , ,@; ; line comments, nested #| |# and #; datum comments; #!fold-case / #!no-fold-case; and datum labels #n= / #n#, including cycles. A malformed datum raises an error object that read-error? recognizes. At end of input read returns the eof object.

Since: r7rs-lang-plan R8

defstruct

R7rsRd

(defstruct R7rsRd :heap [port :any labels :any])

one read call's state: the port (whose fold-case flag the #! directives set) and the datum labels seen so far, as a list of (n . R7rsLabelRef).

defstruct

R7rsLabelRef

(defstruct R7rsLabelRef :heap [n :int done :bool value :any])

label n: a placeholder until its datum is complete.

defn

r7rs-rd-port__

(r7rs-rd-port__ [st :R7rsRd] :any)
defn

r7rs-rd-fold?__

(r7rs-rd-fold?__ [st] :bool)
defn

r7rs-rd-set-fold__

(r7rs-rd-set-fold__ [st v :bool] :nil)
defn

r7rs-rd-labels__

(r7rs-rd-labels__ [st :R7rsRd] :any)
defn

r7rs-rd-set-labels__

(r7rs-rd-set-labels__ [st :R7rsRd v] :nil)
defn

r7rs-label-ref?__

(r7rs-label-ref?__ [x] :bool)
defn

r7rs-label-n__

(r7rs-label-n__ [r :R7rsLabelRef] :int)
defn

r7rs-label-done?__

(r7rs-label-done?__ [r :R7rsLabelRef] :bool)
defn

r7rs-label-value__

(r7rs-label-value__ [r :R7rsLabelRef] :any)
defn

r7rs-label-finish__

(r7rs-label-finish__ [r :R7rsLabelRef v] :nil)
defn

r7rs-rd-fail__

(r7rs-rd-fail__ [msg :cstr] :any)

raise a read error.

defn

r7rs-rd-space?__

(r7rs-rd-space?__ [b :int] :bool)
defn

r7rs-rd-bracket?__

(r7rs-rd-bracket?__ [b :int] :bool)

whitespace, a bracket, ", ;, |, or the end.

defn

r7rs-rd-delim?__

(r7rs-rd-delim?__ [b :int] :bool)
defn

r7rs-rd-token-go__

(r7rs-rd-token-go__ [io :R7rsIo out :R7rsIo] :nil)

the bytes up to the next delimiter.

defn

r7rs-rd-token__

(r7rs-rd-token__ [io :R7rsIo] :cstr)
defn

r7rs-rd-line-comment__

(r7rs-rd-line-comment__ [io :R7rsIo] :nil)

---- atmosphere: whitespace and comments --------------------------------

defn

r7rs-rd-block-comment__

(r7rs-rd-block-comment__ [io :R7rsIo depth :int] :nil)

after #|: to the matching |#, nesting.

defn

r7rs-rd-skip__

(r7rs-rd-skip__ [io :R7rsIo st] :nil)

whitespace, comments and directives before a datum.

defn

r7rs-rd-hex-go__

(r7rs-rd-hex-go__ [io :R7rsIo acc :int] :int)

---- strings, symbols, characters ----------------------------------------

defn

r7rs-rd-intraline__

(r7rs-rd-intraline__ [io :R7rsIo] :nil)
defn

r7rs-rd-escape__

(r7rs-rd-escape__ [io :R7rsIo out :R7rsIo] :nil)

after \ in a string or |symbol|.

defn

r7rs-rd-delimited-go__

(r7rs-rd-delimited-go__ [io :R7rsIo out :R7rsIo close :int] :nil)

a string (") or a |symbol|, after the opener.

defn

r7rs-rd-delimited__

(r7rs-rd-delimited__ [io :R7rsIo close :int] :cstr)
defn

r7rs-rd-char-name__

(r7rs-rd-char-name__ [s :cstr] :any)

the character a multi-letter #\name spells.

defn

r7rs-rd-char__

(r7rs-rd-char__ [io :R7rsIo st] :any)

after #\: one character, then any name letters.

defn

r7rs-rd-number__

(r7rs-rd-number__ [s :cstr none] :any)

T0: a number token through the one R7RS number parser (stdlib/r7rs/numsyntax.tur; the source reader's too), so 1/2 and 1+2i are one token (T6: 1+2i a complex number). A number the tower cannot hold is a read error naming the reason, never a symbol and never a different number. none is what a token that is not number syntax at all reads as.

defn

r7rs-rd-hash-token__

(r7rs-rd-hash-token__ [s :cstr] :any)

a # token that is not a bracket or a char.

defn

r7rs-rd-atom__

(r7rs-rd-atom__ [s :cstr st] :any)

a token: a number if it reads as one, else a symbol.

defn

r7rs-rd-label-find__

(r7rs-rd-label-find__ [l n :int] :any)

---- datum labels ------------------------------------------------------------

defn

r7rs-rd-is__

(r7rs-rd-is__ [x ref] :bool)

replace the placeholder ref by val inside x, once per pair or vector (the value may already be cyclic through an earlier label, so the walk keeps a visited table).

defn

r7rs-rd-patch-vec__

(r7rs-rd-patch-vec__ [v :(Vec any) i :int ref val seen :R7rsIdTab] :nil)
defn

r7rs-rd-patch__

(r7rs-rd-patch__ [x ref val seen :R7rsIdTab] :nil)
defn

r7rs-rd-label__

(r7rs-rd-label__ [io :R7rsIo st] :any)

after #, digits then = (define) or # (refer).

defn

r7rs-rd-label-digits__

(r7rs-rd-label-digits__ [io :R7rsIo out :R7rsIo] :cstr)
defn

r7rs-rd-close?__

(r7rs-rd-close?__ [b :int] :bool)

---- lists and the datum ------------------------------------------------------

defn

r7rs-rd-dot?__

(r7rs-rd-dot?__ [io :R7rsIo] :bool)

a lone . (the dotted-pair marker, not ...).

defn

r7rs-rd-reverse-onto__

(r7rs-rd-reverse-onto__ [acc tail] :any)
defn

r7rs-rd-list__

(r7rs-rd-list__ [io :R7rsIo st acc] :any)

after ( or [: the elements, a dotted tail, the close.

defn

r7rs-rd-bytes__

(r7rs-rd-bytes__ [l v :(Vec int)] :(Vec int))
defn

r7rs-rd-quoted__

(r7rs-rd-quoted__ [io :R7rsIo st name :cstr] :any)
defn

r7rs-rd-datum__

(r7rs-rd-datum__ [io :R7rsIo st] :any)

one datum, or the eof object at the end of input.

defn

r7rs-rd-hash__

(r7rs-rd-hash__ [io :R7rsIo st] :any)

a datum that starts with #.

defn

r7rs-rd-datum-req__

(r7rs-rd-datum-req__ [io :R7rsIo st] :any)

a datum that must be there (inside a list, after a quote or a label).

defn

r7rs-read

(r7rs-read [& r :any] :any)

(read [port]): the next datum, or the eof object.

defn

r7rs-bridge-write__

(r7rs-bridge-write__ [x] :cstr)

internal (r7rs-lang-plan T4): x as write text, the form a datum crosses to or from the embedded evaluator in.

defn

r7rs-bridge-read__

(r7rs-bridge-read__ [text :cstr] :any)

internal (T4): the datum text writes.

defn

r7rs-bridge-value__

(r7rs-bridge-value__ [x] :any)

internal (T4): an evaluated expression's value as an any. A top-level expression's value is its elaborated type's representation (a let yielding a vector is the bare Vec), which write cannot read as a Scheme value; passing it through an any parameter widens it the way a procedure's result is.

defstruct

R7rsBridgeRaised

(defstruct R7rsBridgeRaised :heap [obj :any])

internal (T4): an object raised on one side of the eval bridge, caught there to be raised again on the other.

defn

r7rs-bridge-raised__

(r7rs-bridge-raised__ [obj] :any)
defn

r7rs-bridge-raised?__

(r7rs-bridge-raised?__ [x] :bool)
defn

r7rs-bridge-raised-obj__

(r7rs-bridge-raised-obj__ [x :R7rsBridgeRaised] :any)
defn

r7rs-bridge-catch__

(r7rs-bridge-catch__ [thunk] :any)

internal (T4): (thunk)'s value, or the object it raised, as an R7rsBridgeRaised.

defn

r7rs-bridge-catch-apply__

(r7rs-bridge-catch-apply__ [f l] :any)

internal (T4): (apply f l), caught.

defn

r7rs-bridge-condition__

(r7rs-bridge-condition__ [r] :cstr)

internal (T4): a caught object as text: an error object is (#t kind message . irritants), anything else (#f . obj).

defn

r7rs-bridge-reraise__

(r7rs-bridge-reraise__ [text :cstr] :any)

internal (T4): raise what a condition text names.

defn

r7rs-bridge-reraise-error__

(r7rs-bridge-reraise-error__ [c] :any)
defn

r7rs-bridge-host-wrap__

(r7rs-bridge-host-wrap__ [native] :any)

internal (T4): the procedure evaluated code sees for a program procedure: it calls the registered native and raises again what the program procedure raised.

defn

r7rs-bridge-host-result__

(r7rs-bridge-host-result__ [r] :any)