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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: a65e89fbe8025750a006c6c098017b1f65242fd6
4
- data.tar.gz: 555c606c9d3ed1367a41c6c82c569e4afc4a25c8
3
+ metadata.gz: e42cb76ae181c2c05ab42aa889adbdacf005a035
4
+ data.tar.gz: c2cd98fddb347ba1cf6d4a0fee387bec7b07f253
5
5
  SHA512:
6
- metadata.gz: c1e32ed761f22a0dab7fd5d4072e4457650fc4ff4efeb98628e172b63fcd7363cc4395decfd99bcaab9fef6f028b76e8b2de06ab380002fb23542aa30e2233bf
7
- data.tar.gz: 60ea067619421cb4d173b9ef99ef725a16c03c43a5643fcf6e25771878cdd012ccf65d1c6c2f6081a1d959558fac5ad401ca67c1b773c516660c7dc264b8eb53
6
+ metadata.gz: 70baacf442ee6d7ab3642ca52924ba49786facddd316a4c67c435fbe9f8977c5b8e9ef8876f24ffcdc2dbdcc0ce272f57dff9753faecd4985d84f105d8df4ed4
7
+ data.tar.gz: b90ca4a20c0c1161acd606270455153d89af7c00df3fed5f9911f64d91f7f3b5386e859d27a4a7ec42c505998684941e8f3eef714c916bef80f8cf6403ff85e1
data/Gemfile CHANGED
@@ -1,6 +1,6 @@
1
- source "https://rubygems.org"
2
-
3
- git_source(:github) {|repo_name| "https://github.com/zaki1993/Ruby-Project/lisp-interpreter" }
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
@@ -96,7 +96,7 @@ strings:
96
96
 
97
97
  list and pairs:
98
98
 
99
- (null? \'()); #t
99
+ (null? '()); #t
100
100
 
101
101
  (cons 1 2); (1 . 2)
102
102
 
data/Rakefile CHANGED
@@ -1,6 +1,6 @@
1
- require "bundler/gem_tasks"
2
- require "rspec/core/rake_task"
1
+ require 'bundler/gem_tasks'
2
+ require 'rspec/core/rake_task'
3
3
 
4
4
  RSpec::Core::RakeTask.new(:spec)
5
5
 
6
- task default: :spec
6
+ task default: :spec
@@ -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 car_cdr_infinite_helper(value, fn)
107
- fn.reverse[1..-2].each_char do |t|
108
- value = t == 'a' ? (car [value]) : (cdr [value])
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
- value
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
- raise 'Incorrect number of arguments' unless values.size == 1
181
- car_cdr_infinite_helper values[0], fn
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
- return '<list>' if list?
45
- return '<pair>' if pair?
46
- return '<string>' if string?
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) || res.to_s.match(/c[ad]{2,}r/)
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
@@ -1,5 +1,5 @@
1
1
  module Lisp
2
2
  module Interpreter
3
- VERSION = '0.4.4'.freeze
3
+ VERSION = '0.5.0'.freeze
4
4
  end
5
5
  end
@@ -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 = %q{Lisp interpreter gem}
13
- spec.homepage = ""
14
- spec.license = "MIT"
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'] = "https://rubygems.org"
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 = `git ls-files -z`.split("\x0").reject do |f|
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 = ["lib"]
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.4
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-08 00:00:00.000000000 Z
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