-
Notifications
You must be signed in to change notification settings - Fork 0
/
sire.rb
131 lines (109 loc) · 2.9 KB
/
sire.rb
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
# coding: utf-8
# A Simple Interactive Ruby Environment
require 'mini_readline'
require 'pp'
if ARGV[0] == 'local'
require_relative 'lib/fOOrth'
puts "\nOption(local) Loaded fOOrth from the local code folder."
elsif defined?(XfOOrth)
puts "The fOOrth system is already loaded."
else
begin
require 'fOOrth'
puts "\nLoaded fOOrth from the system gem."
rescue LoadError
require_relative 'lib/fOOrth'
puts "\nLoaded fOOrth from the local code folder."
end
end
puts "fOOrth version = #{XfOOrth::VERSION}"
puts
class Object
#Generate the class lineage of the object.
def classes
begin
result = ""
klass = self.instance_of?(Class) ? self : self.class
begin
result << klass.to_s
klass = klass.superclass
result << " < " if klass
end while klass
result
end
end
end
class SIRE
#Set up the interactive session.
def initialize
@_done = false
@_edit = MiniReadline::Readline.new(history: true,
auto_complete: true,
auto_source: MiniReadline::QuotedFileFolderSource,
eoi_detect: true)
puts "Welcome to a Simple Interactive Ruby Environment\n"
puts
puts "Local commands:"
puts " q - quit SIRE."
puts " r - run fOOrth."
puts " v - version manifest"
puts "obj classes - show the obj's class heritage."
puts
end
#Quit the interactive session.
def q
@_done = true
puts
"Bye bye for now!"
end
def r
ARGV.clear
XfOOrth::main.data_stack
end
def v
puts "Version Manifest"
mods = ObjectSpace.each_object(Module).select{|c| c.const_defined?("VERSION")}
width = (mods.max_by{|m| m.to_s.length}).to_s.length
list = mods.map {|m| "#{m.to_s.ljust(width)} #{m.const_get(:VERSION)}" }
list.sort
end
#Load and run a file
def l(file_name)
@_break = false
lines = IO.readlines(file_name)
lines.each do |line|
exec_line(line)
return if @_break
end
"End of file '#{file_name}'."
end
#Execute a single line.
def exec_line(line)
result = eval line
pp result unless line.length == 0
rescue Interrupt => e
@_break = true
puts "\nExecution Interrupted!"
puts "\n#{e.class} detected: #{e}\n"
puts e.backtrace
puts "\n"
rescue Exception => e
@_break = true
puts "\n#{e.class} detected: #{e}\n"
puts e.backtrace
puts
end
#Run the interactive session.
def run_sire
until @_done
@_break = false
exec_line(@_edit.readline(prompt: 'SIRE>'))
end
puts "\n\n"
rescue MiniReadlineEOI, Interrupt => e
puts "\nInterrupted! Program Terminating."
end
end
if __FILE__ == $0
SIRE.new.run_sire
end