rbsiev 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1,117 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "singleton"
4
+
5
+ module Scmo
6
+
7
+ class Object
8
+ class << self
9
+ protected :new
10
+ end
11
+
12
+ def boolean?; false; end
13
+ def pair?; false; end
14
+ def symbol?; false; end
15
+ def number?; false; end
16
+ def char?; false; end
17
+ def string?; false; end
18
+ def vector?; false; end
19
+ def port?; false; end
20
+ def procedure?; false; end
21
+ def null?; false; end
22
+ def list?; false; end
23
+
24
+ def to_rb
25
+ true
26
+ end
27
+
28
+ def to_s
29
+ ""
30
+ end
31
+
32
+ class Boolean < Object
33
+ class << self
34
+ protected :new
35
+ end
36
+
37
+ def boolean?; true; end
38
+ end
39
+ end
40
+
41
+ class EmptyList < Object
42
+ include Singleton
43
+
44
+ def null?; true; end
45
+ def list?; true; end
46
+
47
+ def to_rb
48
+ []
49
+ end
50
+
51
+ def to_s
52
+ "()"
53
+ end
54
+ end
55
+
56
+ EMPTY_LIST = EmptyList.instance
57
+
58
+ class UndefValue < Object
59
+ include Singleton
60
+
61
+ def to_rb
62
+ nil
63
+ end
64
+
65
+ def to_s
66
+ "#<undef>"
67
+ end
68
+ end
69
+
70
+ UNDEF = UndefValue.instance
71
+
72
+ class FalseValue < Object::Boolean
73
+ include Singleton
74
+
75
+ def to_rb
76
+ false
77
+ end
78
+
79
+ def to_s
80
+ "#f"
81
+ end
82
+ end
83
+
84
+ class TrueValue < Object::Boolean
85
+ include Singleton
86
+
87
+ def to_rb
88
+ true
89
+ end
90
+
91
+ def to_s
92
+ "#t"
93
+ end
94
+ end
95
+
96
+ FALSE = FalseValue.instance
97
+ TRUE = TrueValue.instance
98
+
99
+ def self.scheme_object?(obj)
100
+ obj.kind_of?(Object)
101
+ end
102
+
103
+ def self.rbo2scmo(rb_obj)
104
+ case rb_obj
105
+ when FalseClass
106
+ FALSE
107
+ when TrueClass
108
+ TRUE
109
+ when NilClass
110
+ EMPTY_LIST
111
+ when Array
112
+ rb_obj.empty? ? EMPTY_LIST : List.list(*rb_obj)
113
+ else
114
+ rb_obj
115
+ end
116
+ end
117
+ end
data/rbsiev.gemspec ADDED
@@ -0,0 +1,31 @@
1
+ # frozen_string_literal: true
2
+
3
+ require_relative "lib/rbsiev/version"
4
+
5
+ Gem::Specification.new do |spec|
6
+ spec.name = "rbsiev"
7
+ spec.version = Rbsiev::VERSION
8
+ spec.authors = ["mnbi"]
9
+ spec.email = ["mnbi@users.noreply.github.com"]
10
+
11
+ spec.summary = "SICP evaluator in Ruby"
12
+ spec.description = "An evaluator of Scheme language written in Ruby, which is implemented in SICP Chater 4."
13
+ spec.homepage = "https://github.com/mnbi/rbsiev"
14
+ spec.required_ruby_version = Gem::Requirement.new(">= 2.7.0")
15
+
16
+ spec.metadata["homepage_uri"] = spec.homepage
17
+ spec.metadata["source_code_uri"] = "https://github.com/mnbi/rbsiev"
18
+ spec.metadata["changelog_uri"] = "https://github.com/mnbi/rbsiev/blob/main/CHANGELOG.md"
19
+
20
+ # Specify which files should be added to the gem when it is released.
21
+ # The `git ls-files -z` loads the files in the RubyGem that have been added into git.
22
+ spec.files = Dir.chdir(File.expand_path(__dir__)) do
23
+ `git ls-files -z`.split("\x0").reject { |f| f.match(%r{\A(?:test|spec|features)/}) }
24
+ end
25
+ spec.bindir = "exe"
26
+ spec.executables = spec.files.grep(%r{\Aexe/}) { |f| File.basename(f) }
27
+ spec.require_paths = ["lib"]
28
+
29
+ spec.add_dependency "rbscmlex", ">= 0.1.3"
30
+ spec.add_dependency "rubasteme", ">= 0.1.4"
31
+ end
metadata ADDED
@@ -0,0 +1,100 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: rbsiev
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.1.0
5
+ platform: ruby
6
+ authors:
7
+ - mnbi
8
+ autorequire:
9
+ bindir: exe
10
+ cert_chain: []
11
+ date: 2021-06-07 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: rbscmlex
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - ">="
18
+ - !ruby/object:Gem::Version
19
+ version: 0.1.3
20
+ type: :runtime
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - ">="
25
+ - !ruby/object:Gem::Version
26
+ version: 0.1.3
27
+ - !ruby/object:Gem::Dependency
28
+ name: rubasteme
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - ">="
32
+ - !ruby/object:Gem::Version
33
+ version: 0.1.4
34
+ type: :runtime
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - ">="
39
+ - !ruby/object:Gem::Version
40
+ version: 0.1.4
41
+ description: An evaluator of Scheme language written in Ruby, which is implemented
42
+ in SICP Chater 4.
43
+ email:
44
+ - mnbi@users.noreply.github.com
45
+ executables:
46
+ - rbsiev
47
+ extensions: []
48
+ extra_rdoc_files: []
49
+ files:
50
+ - ".github/workflows/main.yml"
51
+ - ".gitignore"
52
+ - CHANGELOG.md
53
+ - Gemfile
54
+ - LICENSE
55
+ - README.md
56
+ - Rakefile
57
+ - bin/console
58
+ - bin/setup
59
+ - exe/rbsiev
60
+ - lib/rbsiev.rb
61
+ - lib/rbsiev/environment.rb
62
+ - lib/rbsiev/error.rb
63
+ - lib/rbsiev/evaluator.rb
64
+ - lib/rbsiev/primitives.rb
65
+ - lib/rbsiev/primitives/arithmetic.rb
66
+ - lib/rbsiev/primitives/comparison.rb
67
+ - lib/rbsiev/primitives/empty_list.rb
68
+ - lib/rbsiev/printer.rb
69
+ - lib/rbsiev/procedure.rb
70
+ - lib/rbsiev/repl.rb
71
+ - lib/rbsiev/version.rb
72
+ - lib/rubasteme/ast/misc.rb
73
+ - lib/scmo/object.rb
74
+ - rbsiev.gemspec
75
+ homepage: https://github.com/mnbi/rbsiev
76
+ licenses: []
77
+ metadata:
78
+ homepage_uri: https://github.com/mnbi/rbsiev
79
+ source_code_uri: https://github.com/mnbi/rbsiev
80
+ changelog_uri: https://github.com/mnbi/rbsiev/blob/main/CHANGELOG.md
81
+ post_install_message:
82
+ rdoc_options: []
83
+ require_paths:
84
+ - lib
85
+ required_ruby_version: !ruby/object:Gem::Requirement
86
+ requirements:
87
+ - - ">="
88
+ - !ruby/object:Gem::Version
89
+ version: 2.7.0
90
+ required_rubygems_version: !ruby/object:Gem::Requirement
91
+ requirements:
92
+ - - ">="
93
+ - !ruby/object:Gem::Version
94
+ version: '0'
95
+ requirements: []
96
+ rubygems_version: 3.2.15
97
+ signing_key:
98
+ specification_version: 4
99
+ summary: SICP evaluator in Ruby
100
+ test_files: []