Sha256: 044ed055dc1248c51e582e91d31daeb7425fbfb5d34e8d025a51c52cfaeeedd3

Contents?: true

Size: 1.42 KB

Versions: 4

Compression:

Stored size: 1.42 KB

Contents

#!/usr/bin/env ruby
# frozen_string_literal: true

require "readline"
require "rubasteme"

def usage
  puts <<HELP
usage:
    sicp_scheme [option]
option:
    -v, --version : print version
    -h, --help    : show this message
HELP
end

module SicpScheme
  require_relative "sicp_scheme/error"
  require_relative "sicp_scheme/environment"
  require_relative "sicp_scheme/primitives"
  require_relative "sicp_scheme/evaluator"
  require_relative "sicp_scheme/printer"

  TOPLEVEL_ENV = Environment.empty_environment

  def self.repl(prompt)
    env = TOPLEVEL_ENV
    parser = Rubasteme::Parser.new
    evaluator = Evaluator.new
    printer = Printer.new

    msg = loop {
      source = Readline::readline(prompt, true)
      break "Bye!" if source.nil?

      case source
      when /\(load\s+"(.*)"\)/, /\(load-scm\s+"(.*)"\)/
        file = Regexp.last_match[1]
        source = File.readlines(file, chomp: true).join(" ")
      when /\(version\)/
        puts evaluator.version
        puts "(Rubasteme :version #{Rubasteme::VERSION} :release #{Rubasteme::RELEASE})"
        puts "(Rbscmlex :version #{Rbscmlex::VERSION} :release #{Rbscmlex::RELEASE})"
        next
      end

      lexer = Rbscmlex::Lexer.new(source, form: :token)
      exp = parser.parse(lexer).to_a

      result = evaluator.eval(exp, env)

      printer.print(result)
    }

    msg
  end
end

prompt = "SICP Scheme> "
msg = SicpScheme.repl(prompt)

puts msg unless msg.nil?

Version data entries

4 entries across 4 versions & 1 rubygems

Version Path
rubasteme-0.1.4 examples/mini_sicp_scheme
rubasteme-0.1.3 examples/mini_sicp_scheme
rubasteme-0.1.2 examples/mini_sicp_scheme
rubasteme-0.1.1 examples/mini_sicp_scheme