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.
- checksums.yaml +7 -0
- data/.github/workflows/main.yml +18 -0
- data/.gitignore +57 -0
- data/CHANGELOG.md +5 -0
- data/Gemfile +10 -0
- data/LICENSE +21 -0
- data/README.md +90 -0
- data/Rakefile +20 -0
- data/bin/console +15 -0
- data/bin/setup +8 -0
- data/exe/rbsiev +51 -0
- data/lib/rbsiev.rb +98 -0
- data/lib/rbsiev/environment.rb +110 -0
- data/lib/rbsiev/error.rb +5 -0
- data/lib/rbsiev/evaluator.rb +330 -0
- data/lib/rbsiev/primitives.rb +88 -0
- data/lib/rbsiev/primitives/arithmetic.rb +54 -0
- data/lib/rbsiev/primitives/comparison.rb +46 -0
- data/lib/rbsiev/primitives/empty_list.rb +15 -0
- data/lib/rbsiev/printer.rb +19 -0
- data/lib/rbsiev/procedure.rb +47 -0
- data/lib/rbsiev/repl.rb +112 -0
- data/lib/rbsiev/version.rb +6 -0
- data/lib/rubasteme/ast/misc.rb +313 -0
- data/lib/scmo/object.rb +117 -0
- data/rbsiev.gemspec +31 -0
- metadata +100 -0
data/lib/scmo/object.rb
ADDED
@@ -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: []
|