lisp-interpreter 0.4.4 → 0.5.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 +4 -4
- data/Gemfile +3 -3
- data/README.md +1 -1
- data/Rakefile +3 -3
- data/lib/lisp/interpreter/checker.rb +44 -0
- data/lib/lisp/interpreter/core/list.rb +19 -17
- data/lib/lisp/interpreter/core/object.rb +3 -7
- data/lib/lisp/interpreter/helpers/value_finder.rb +3 -1
- data/lib/lisp/interpreter/parser.rb +1 -1
- data/lib/lisp/interpreter/version.rb +1 -1
- data/lisp-interpreter.gemspec +7 -8
- metadata +3 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: e42cb76ae181c2c05ab42aa889adbdacf005a035
|
4
|
+
data.tar.gz: c2cd98fddb347ba1cf6d4a0fee387bec7b07f253
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 70baacf442ee6d7ab3642ca52924ba49786facddd316a4c67c435fbe9f8977c5b8e9ef8876f24ffcdc2dbdcc0ce272f57dff9753faecd4985d84f105d8df4ed4
|
7
|
+
data.tar.gz: b90ca4a20c0c1161acd606270455153d89af7c00df3fed5f9911f64d91f7f3b5386e859d27a4a7ec42c505998684941e8f3eef714c916bef80f8cf6403ff85e1
|
data/Gemfile
CHANGED
@@ -1,6 +1,6 @@
|
|
1
|
-
source
|
2
|
-
|
3
|
-
git_source(:github) {|
|
1
|
+
source 'https://rubygems.org'
|
2
|
+
r_name = 'https://github.com/zaki1993/Ruby-Project/lisp-interpreter'
|
3
|
+
git_source(:github) { |_repo_name| r_name }
|
4
4
|
|
5
5
|
# Specify your gem's dependencies in lisp-interpreter.gemspec
|
6
6
|
gemspec
|
data/README.md
CHANGED
data/Rakefile
CHANGED
@@ -0,0 +1,44 @@
|
|
1
|
+
# Check if variable is specific type
|
2
|
+
module SchemeChecker
|
3
|
+
def check_for_bool(token)
|
4
|
+
return true if token.boolean?
|
5
|
+
is_instance_var = check_instance_var token
|
6
|
+
return (check_for_bool get_var token) if is_instance_var
|
7
|
+
false
|
8
|
+
end
|
9
|
+
|
10
|
+
def check_for_string(token)
|
11
|
+
return true if token.string?
|
12
|
+
is_instance_var = check_instance_var token
|
13
|
+
return (check_for_string get_var token) if is_instance_var
|
14
|
+
false
|
15
|
+
end
|
16
|
+
|
17
|
+
def check_for_num(token)
|
18
|
+
return true if token.to_s.number?
|
19
|
+
is_instance_var = check_instance_var token
|
20
|
+
return (check_for_num get_var token) if is_instance_var
|
21
|
+
false
|
22
|
+
end
|
23
|
+
|
24
|
+
def check_for_quote(token)
|
25
|
+
return true if token[0].quote?
|
26
|
+
is_instance_var = check_instance_var token
|
27
|
+
return (check_for_num get_var token) if is_instance_var
|
28
|
+
false
|
29
|
+
end
|
30
|
+
|
31
|
+
def check_for_symbol(var)
|
32
|
+
var = var.join('') if var.is_a? Array
|
33
|
+
return true if var.character?
|
34
|
+
is_instance_var = check_instance_var var
|
35
|
+
return (check_for_character get_var var) if is_instance_var
|
36
|
+
false
|
37
|
+
end
|
38
|
+
|
39
|
+
def check_instance_var(var)
|
40
|
+
return false if var.is_a? Proc
|
41
|
+
return false unless valid_var_name var
|
42
|
+
@procs.key? var.to_s
|
43
|
+
end
|
44
|
+
end
|
@@ -14,17 +14,6 @@ module SchemeListsHelper
|
|
14
14
|
result
|
15
15
|
end
|
16
16
|
|
17
|
-
def find_to_evaluate_or_not(tokens, no_quotes = false)
|
18
|
-
if tokens[0..1].join == '(list'
|
19
|
-
evaluate_list tokens[2..-2], no_quotes
|
20
|
-
elsif tokens[0..1].join == '(cons'
|
21
|
-
result = cons tokens[2..-2]
|
22
|
-
result[2..-2].split(' ')
|
23
|
-
else
|
24
|
-
no_eval_list tokens[2..-2], no_quotes
|
25
|
-
end
|
26
|
-
end
|
27
|
-
|
28
17
|
def find_idx_for_list(tokens)
|
29
18
|
if tokens[0] == '('
|
30
19
|
find_bracket_idx tokens, 0
|
@@ -103,11 +92,23 @@ module SchemeListsHelper
|
|
103
92
|
[func, other]
|
104
93
|
end
|
105
94
|
|
106
|
-
def
|
107
|
-
|
108
|
-
|
95
|
+
def build_function_car_cdr(fn)
|
96
|
+
prepare_call = ['(', fn, 'x', ')']
|
97
|
+
fn[1..-2].each_char do |t|
|
98
|
+
prepare_call += (t == 'a' ? ['(', 'car'] : ['(', 'cdr'])
|
109
99
|
end
|
110
|
-
|
100
|
+
prepare_call << 'x'
|
101
|
+
(fn.size - 2).times { prepare_call << ')' }
|
102
|
+
prepare_call
|
103
|
+
end
|
104
|
+
|
105
|
+
def generate_infinite_car_cdr(fn)
|
106
|
+
prepare_call = build_function_car_cdr fn
|
107
|
+
define_function prepare_call
|
108
|
+
end
|
109
|
+
|
110
|
+
def call_car_cdr_infinite(fn, values)
|
111
|
+
@procs[fn.to_s].call values
|
111
112
|
end
|
112
113
|
end
|
113
114
|
|
@@ -177,7 +178,8 @@ module SchemeLists
|
|
177
178
|
def car_cdr_infinite(other)
|
178
179
|
fn = other[1]
|
179
180
|
values = find_all_values other[2..-2]
|
180
|
-
|
181
|
-
|
181
|
+
return call_car_cdr_infinite fn, values if @procs.key? fn.to_s
|
182
|
+
raise arg_err_build 1, values.size unless values.size == 1
|
183
|
+
(generate_infinite_car_cdr fn).call values[0]
|
182
184
|
end
|
183
185
|
end
|
@@ -41,13 +41,9 @@ class Object
|
|
41
41
|
end
|
42
42
|
|
43
43
|
def type
|
44
|
-
|
45
|
-
|
46
|
-
|
47
|
-
return '<number>' if number?
|
48
|
-
return '<character>' if character?
|
49
|
-
return '<boolean>' if boolean?
|
50
|
-
'<quote>'
|
44
|
+
fns = %w[list pair string number character boolean quote]
|
45
|
+
res = fns.reject { |t| fns.index(t) unless send t + '?' }
|
46
|
+
'<' + res[0] + '>'
|
51
47
|
end
|
52
48
|
|
53
49
|
private
|
@@ -55,6 +55,8 @@ module ValueFinder
|
|
55
55
|
|
56
56
|
def find_next_value(other)
|
57
57
|
return [other[0], other[1..-1]] if other[0].is_a? Proc
|
58
|
+
match_inf = other[0].to_s.match(/c[ad]{2,}r/)
|
59
|
+
return [(generate_infinite_car_cdr other[0]), other[1..-1]] if match_inf
|
58
60
|
find_value_helper other
|
59
61
|
end
|
60
62
|
|
@@ -80,7 +82,7 @@ module ValueFinder
|
|
80
82
|
else
|
81
83
|
return if token.empty?
|
82
84
|
token = token.join('') if token.is_a? Array
|
83
|
-
return token if token =~ /c[ad]{2,}r/
|
85
|
+
return (generate_infinite_car_cdr token) if token =~ /c[ad]{2,}r/
|
84
86
|
get_var token.to_s
|
85
87
|
end
|
86
88
|
end
|
@@ -111,7 +111,7 @@ class Parser
|
|
111
111
|
|
112
112
|
def find_result_type(res, methods)
|
113
113
|
return '#<Closure>' if res.is_a? Proc
|
114
|
-
is_func = (methods.key? res.to_s)
|
114
|
+
is_func = (methods.key? res.to_s)
|
115
115
|
return '#<Function ' + res.to_s + '>' if is_func
|
116
116
|
res.to_s
|
117
117
|
end
|
data/lisp-interpreter.gemspec
CHANGED
@@ -1,4 +1,5 @@
|
|
1
1
|
# coding: utf-8
|
2
|
+
|
2
3
|
lib = File.expand_path('../lib', __FILE__)
|
3
4
|
$LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
|
4
5
|
require 'lisp/interpreter/version'
|
@@ -9,25 +10,23 @@ Gem::Specification.new do |spec|
|
|
9
10
|
spec.authors = ['Zaki Petrov']
|
10
11
|
spec.email = ['zaki1993@abv.bg\n']
|
11
12
|
|
12
|
-
spec.summary =
|
13
|
-
spec.homepage =
|
14
|
-
spec.license =
|
13
|
+
spec.summary = 'Lisp interpreter gem'
|
14
|
+
spec.homepage = ''
|
15
|
+
spec.license = 'MIT'
|
15
16
|
|
16
|
-
# Prevent pushing this gem to RubyGems.org. To allow pushes either set the 'allowed_push_host'
|
17
|
-
# to allow pushing to a single host or delete this section to allow pushing to any host.
|
18
17
|
if spec.respond_to?(:metadata)
|
19
|
-
spec.metadata['allowed_push_host'] =
|
18
|
+
spec.metadata['allowed_push_host'] = 'https://rubygems.org'
|
20
19
|
else
|
21
20
|
raise 'RubyGems 2.0 or newer is required to protect against " \
|
22
21
|
"public gem pushes.'
|
23
22
|
end
|
24
23
|
|
25
|
-
spec.files
|
24
|
+
spec.files = `git ls-files -z`.split("\x0").reject do |f|
|
26
25
|
f.match(%r{^(test)/})
|
27
26
|
end
|
28
27
|
spec.bindir = 'exe'
|
29
28
|
spec.executables = spec.files.grep(%r{^exe/}) { |f| File.basename(f) }
|
30
|
-
spec.require_paths = [
|
29
|
+
spec.require_paths = ['lib']
|
31
30
|
|
32
31
|
spec.add_development_dependency 'bundler', '~> 1.15'
|
33
32
|
spec.add_development_dependency 'rake', '~> 10.0'
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: lisp-interpreter
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.5.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Zaki Petrov
|
8
8
|
autorequire:
|
9
9
|
bindir: exe
|
10
10
|
cert_chain: []
|
11
|
-
date: 2017-08-
|
11
|
+
date: 2017-08-09 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: bundler
|
@@ -71,6 +71,7 @@ files:
|
|
71
71
|
- bin/start.rb
|
72
72
|
- bin/zakichan.bat
|
73
73
|
- lib/lisp/interpreter.rb
|
74
|
+
- lib/lisp/interpreter/checker.rb
|
74
75
|
- lib/lisp/interpreter/core/boolean.rb
|
75
76
|
- lib/lisp/interpreter/core/errors.rb
|
76
77
|
- lib/lisp/interpreter/core/functional.rb
|