class SXP::Reader::Scheme
A Scheme
R4RS S-expressions parser.
Constants
- CHARACTERS
Escape characters, used in the form `#newline`. Case is treated insensitively @see people.csail.mit.edu/jaffer/r4rs_9.html#SEC65
- DECIMAL
- INTEGER_BASE_10
- INTEGER_BASE_16
- INTEGER_BASE_2
- INTEGER_BASE_8
- RATIONAL
Public Class Methods
new(input, version: :r4rs, **options, &block)
click to toggle source
Initializes the reader.
@param [IO, StringIO, String] input @param [Hash{Symbol => Object}] options @option options [Symbol] :version (:r4rs)
Calls superclass method
SXP::Reader::new
# File lib/sxp/reader/scheme.rb, line 28 def initialize(input, version: :r4rs, **options, &block) super(input, version: version, **options, &block) end
Public Instance Methods
read_atom()
click to toggle source
@return [Object]
# File lib/sxp/reader/scheme.rb, line 43 def read_atom case buffer = read_literal when '.' then buffer.to_sym when RATIONAL then Rational($1.to_i, $2.to_i) when DECIMAL then Float(buffer) when INTEGER_BASE_10 then Integer(buffer) else buffer.to_sym end end
read_character()
click to toggle source
Read characters sequences like `#space`. Otherwise, reads a single character. Requires the ability to put eroneously read characters back in the input stream
@return [String] @see people.csail.mit.edu/jaffer/r4rs_9.html#SEC65
# File lib/sxp/reader/scheme.rb, line 79 def read_character lit = read_literal return " " if lit.empty? && peek_char == " " CHARACTERS.fetch(lit.downcase) do # Return just the first character unread(lit[1..-1]) lit[0,1] end end
read_sharp()
click to toggle source
@return [Object]
# File lib/sxp/reader/scheme.rb, line 55 def read_sharp skip_char # '#' case char = read_char when ?n, ?N then nil # not in Scheme per se when ?f, ?F then false when ?t, ?T then true when ?b, ?B then read_integer(2) when ?o, ?O then read_integer(8) when ?d, ?D then read_integer(10) when ?x, ?X then read_integer(16) when ?\\ then read_character when ?; then skip; read when ?! then skip_line; read # shebang else raise Error, "invalid sharp-sign read syntax: ##{char.chr}" end end
read_token()
click to toggle source
@return [Object]
Calls superclass method
SXP::Reader::Extended#read_token
# File lib/sxp/reader/scheme.rb, line 34 def read_token case peek_char when ?# then [:atom, read_sharp] else super end end