rubic 0.1.1 → 0.1.2
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 +4 -4
- data/.travis.yml +2 -1
- data/README.md +4 -0
- data/Rakefile +1 -1
- data/bin/rubic +8 -1
- data/lib/rubic.rb +1 -0
- data/lib/rubic/inspector.rb +25 -0
- data/lib/rubic/interpreter.rb +14 -0
- data/lib/rubic/version.rb +1 -1
- data/rubic.gemspec +5 -1
- metadata +36 -7
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 51da002edc71251bec55d378b94e41dc2ffe3282
|
4
|
+
data.tar.gz: 3c9ca15aebeebf042e077838498437772c31ac65
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: dcbf36feedcd3b82fd8ba5d80e5adda3c7d9e8857714bdc2c5fd25f9dab2d786a8a67fc049474cb52afdc3bb8f211fc1822df8e14a7c94df34afb59af709f65b
|
7
|
+
data.tar.gz: b6519390237eef8156b89ba255af847d62c2edf9eddb2778d0df24503bc43c39f94d25a1c24bbd35ced3ff823f82b23840c147d312c96cee0f635a56afb7f397
|
data/.travis.yml
CHANGED
data/README.md
CHANGED
@@ -1,5 +1,9 @@
|
|
1
1
|
# Rubic - A tiny Scheme interpreter
|
2
2
|
|
3
|
+
[](http://badge.fury.io/rb/rubic)
|
4
|
+
[](https://travis-ci.org/notozeki/rubic)
|
5
|
+
[](https://coveralls.io/r/notozeki/rubic)
|
6
|
+
|
3
7
|
**Rubic** is a very simple Scheme interpreter written in Ruby.
|
4
8
|
|
5
9
|
NOTE: This is my hobby project. You may find it is good for nothing in practical uses :wink:
|
data/Rakefile
CHANGED
data/bin/rubic
CHANGED
@@ -1,8 +1,11 @@
|
|
1
1
|
#!/usr/bin/env ruby
|
2
2
|
|
3
3
|
require 'rubic'
|
4
|
+
require 'rubic/inspector'
|
4
5
|
require 'readline'
|
5
6
|
|
7
|
+
using Rubic::Inspector
|
8
|
+
|
6
9
|
# TODO: read the code from file when argument passed
|
7
10
|
|
8
11
|
puts "Welcome to interactive Rubic (v#{Rubic::VERSION})"
|
@@ -12,9 +15,13 @@ rubic = Rubic::Interpreter.new
|
|
12
15
|
|
13
16
|
while input = Readline.readline(">> ", true)
|
14
17
|
next if input.empty?
|
18
|
+
while input.count('(') > input.count(')')
|
19
|
+
input << Readline.readline(' | ', true)
|
20
|
+
end
|
21
|
+
|
15
22
|
begin
|
16
23
|
puts '=> ' + rubic.evaluate(input).inspect
|
17
24
|
rescue Rubic::RubicError => e
|
18
|
-
puts "
|
25
|
+
puts "\e[31mError: #{e.message}\e[0m"
|
19
26
|
end
|
20
27
|
end
|
data/lib/rubic.rb
CHANGED
@@ -0,0 +1,25 @@
|
|
1
|
+
module Rubic
|
2
|
+
module Inspector
|
3
|
+
refine Array do
|
4
|
+
def inspect
|
5
|
+
"(#{inspect_rec})"
|
6
|
+
end
|
7
|
+
|
8
|
+
def inspect_rec
|
9
|
+
if empty?
|
10
|
+
''
|
11
|
+
elsif last.is_a?(Array)
|
12
|
+
[first.inspect, last.inspect_rec].join(' ').strip
|
13
|
+
else
|
14
|
+
"#{first.inspect} . #{last.inspect}"
|
15
|
+
end
|
16
|
+
end
|
17
|
+
end
|
18
|
+
|
19
|
+
refine Proc do
|
20
|
+
def inspect
|
21
|
+
"#<lambda:#{object_id}>"
|
22
|
+
end
|
23
|
+
end
|
24
|
+
end
|
25
|
+
end
|
data/lib/rubic/interpreter.rb
CHANGED
@@ -12,6 +12,13 @@ module Rubic
|
|
12
12
|
'>' => -> (a, b) { a > b },
|
13
13
|
'=' => -> (a, b) { a == b },
|
14
14
|
'not' => -> (a) { !a },
|
15
|
+
'cons' => -> (a, b) { [a, b] },
|
16
|
+
'car' => -> (l) { l.first },
|
17
|
+
'cdr' => -> (l) { l.last },
|
18
|
+
'nil' => [],
|
19
|
+
'list' => -> (*args) { args.reverse.reduce([]) {|res, e| [e, res] } },
|
20
|
+
'null?' => -> (l) { l.is_a?(Array) ? l.empty? : false },
|
21
|
+
'pair?' => -> (l) { l.is_a?(Array) ? l.any? : false },
|
15
22
|
}
|
16
23
|
|
17
24
|
def initialize
|
@@ -40,6 +47,10 @@ module Rubic
|
|
40
47
|
return atom if atom
|
41
48
|
|
42
49
|
list = list_or_atom
|
50
|
+
|
51
|
+
# Empty list
|
52
|
+
return nil if list.empty?
|
53
|
+
|
43
54
|
# Special Forms
|
44
55
|
case list.first
|
45
56
|
when :define
|
@@ -95,6 +106,9 @@ module Rubic
|
|
95
106
|
|
96
107
|
# Procedure call
|
97
108
|
op, *args = list.map {|e| execute(e, env) }
|
109
|
+
unless op.respond_to? :call
|
110
|
+
raise Rubic::RuntimeError, "`#{op}' is not a procedure"
|
111
|
+
end
|
98
112
|
op.call(*args)
|
99
113
|
end
|
100
114
|
|
data/lib/rubic/version.rb
CHANGED
data/rubic.gemspec
CHANGED
@@ -18,9 +18,13 @@ Gem::Specification.new do |spec|
|
|
18
18
|
spec.require_paths = ["lib"]
|
19
19
|
spec.executables = ['rubic']
|
20
20
|
|
21
|
-
spec.
|
21
|
+
spec.required_ruby_version = '>= 2.1' # for Refinements
|
22
|
+
|
23
|
+
spec.add_development_dependency "bundler"
|
22
24
|
spec.add_development_dependency "rake", "~> 10.0"
|
23
25
|
spec.add_development_dependency "minitest", "~> 5.5"
|
26
|
+
spec.add_development_dependency 'travis', '~> 1.7'
|
27
|
+
spec.add_development_dependency 'coveralls', '~> 0.8'
|
24
28
|
|
25
29
|
spec.add_dependency "racc", "~> 1.4"
|
26
30
|
end
|
metadata
CHANGED
@@ -1,29 +1,29 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: rubic
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.1.
|
4
|
+
version: 0.1.2
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- notozeki
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2015-04-
|
11
|
+
date: 2015-04-15 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: bundler
|
15
15
|
requirement: !ruby/object:Gem::Requirement
|
16
16
|
requirements:
|
17
|
-
- - "
|
17
|
+
- - ">="
|
18
18
|
- !ruby/object:Gem::Version
|
19
|
-
version: '
|
19
|
+
version: '0'
|
20
20
|
type: :development
|
21
21
|
prerelease: false
|
22
22
|
version_requirements: !ruby/object:Gem::Requirement
|
23
23
|
requirements:
|
24
|
-
- - "
|
24
|
+
- - ">="
|
25
25
|
- !ruby/object:Gem::Version
|
26
|
-
version: '
|
26
|
+
version: '0'
|
27
27
|
- !ruby/object:Gem::Dependency
|
28
28
|
name: rake
|
29
29
|
requirement: !ruby/object:Gem::Requirement
|
@@ -52,6 +52,34 @@ dependencies:
|
|
52
52
|
- - "~>"
|
53
53
|
- !ruby/object:Gem::Version
|
54
54
|
version: '5.5'
|
55
|
+
- !ruby/object:Gem::Dependency
|
56
|
+
name: travis
|
57
|
+
requirement: !ruby/object:Gem::Requirement
|
58
|
+
requirements:
|
59
|
+
- - "~>"
|
60
|
+
- !ruby/object:Gem::Version
|
61
|
+
version: '1.7'
|
62
|
+
type: :development
|
63
|
+
prerelease: false
|
64
|
+
version_requirements: !ruby/object:Gem::Requirement
|
65
|
+
requirements:
|
66
|
+
- - "~>"
|
67
|
+
- !ruby/object:Gem::Version
|
68
|
+
version: '1.7'
|
69
|
+
- !ruby/object:Gem::Dependency
|
70
|
+
name: coveralls
|
71
|
+
requirement: !ruby/object:Gem::Requirement
|
72
|
+
requirements:
|
73
|
+
- - "~>"
|
74
|
+
- !ruby/object:Gem::Version
|
75
|
+
version: '0.8'
|
76
|
+
type: :development
|
77
|
+
prerelease: false
|
78
|
+
version_requirements: !ruby/object:Gem::Requirement
|
79
|
+
requirements:
|
80
|
+
- - "~>"
|
81
|
+
- !ruby/object:Gem::Version
|
82
|
+
version: '0.8'
|
55
83
|
- !ruby/object:Gem::Dependency
|
56
84
|
name: racc
|
57
85
|
requirement: !ruby/object:Gem::Requirement
|
@@ -85,6 +113,7 @@ files:
|
|
85
113
|
- bin/setup
|
86
114
|
- lib/rubic.rb
|
87
115
|
- lib/rubic/environment.rb
|
116
|
+
- lib/rubic/inspector.rb
|
88
117
|
- lib/rubic/interpreter.rb
|
89
118
|
- lib/rubic/parser.rb
|
90
119
|
- lib/rubic/parser.y
|
@@ -102,7 +131,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
102
131
|
requirements:
|
103
132
|
- - ">="
|
104
133
|
- !ruby/object:Gem::Version
|
105
|
-
version: '
|
134
|
+
version: '2.1'
|
106
135
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
107
136
|
requirements:
|
108
137
|
- - ">="
|