rbsiev 0.1.0

Sign up to get free protection for your applications and to get access to all the features.
@@ -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: []