conflisp 1.0.0 → 2.0.1

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 34e85b7514e76a0fb5709c69c5cafaa87cdd42be254f708acf48564e30ea4712
4
- data.tar.gz: 6d39a6a091b1e2e8de18f875efcdea4b14d19c686ea2c626bb1f67a032f0824c
3
+ metadata.gz: 056bd19a95cced5e8b4fc1f9882d97ec0a12f20fd4b5b05aa7d680d6df0cf09d
4
+ data.tar.gz: ff8005b66d0dc7701842ca5dfb72a23ff358a5b5e7dd053b1dc6dad959cb178a
5
5
  SHA512:
6
- metadata.gz: 3bdaf8b254d7c0deeb2ba60e5e81bcc9718f5382e726bc4396655378fddfe38f5ba674549dcc3d54fcade64bef81acc4ef634f983ee648e00c93219026225bd3
7
- data.tar.gz: 9faf45a09a04e50e634e5ba5ce2556931c82ea5487d43e530ad8fec0d3fc317540411dfbc8dbcdc3e2e669e2c223ddd420ad90c1d7c18adf86757785a6ed91f4
6
+ metadata.gz: 4958bd0617bd80857338d23857c22dbd70e1f645f24c1113ccd2b0f21a2bdba43290dbf8b08f98b94283a17af581de8afc3dbbfb3ecf534f522cc7fb9df390fa
7
+ data.tar.gz: d94f1fc1146db37e505eb1e08ec51ba51d8d4f4a575422fafb19857125e221980bba656707b44f903b410594cd25e7a28dc9fec10d9b401634f7c2de368caf2f
@@ -1,5 +1,24 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module Conflisp
4
- ConflispError = Class.new(StandardError)
4
+ # Base class for ConflispError
5
+ class ConflispError < StandardError
6
+ attr_reader :conflisp_stack
7
+
8
+ def initialize(*args)
9
+ super
10
+
11
+ @conflisp_stack = []
12
+ end
13
+
14
+ def to_s
15
+ ret = super
16
+
17
+ conflisp_stack.each do |expression|
18
+ ret += "\n in expression #{expression}"
19
+ end
20
+
21
+ ret
22
+ end
23
+ end
5
24
  end
@@ -1,6 +1,7 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  require 'conflisp/method_missing'
4
+ require 'conflisp/runtime_error'
4
5
 
5
6
  module Conflisp
6
7
  # Evaluator takes s-expressions and resolves them into Ruby values
@@ -16,17 +17,13 @@ module Conflisp
16
17
  case expression
17
18
  when Array
18
19
  # In Lisp, Arrays are function calls
19
- fn, *raw_args = expression
20
- fn = fn.to_s
20
+ fn_name, *raw_args = expression
21
+ fn_name = fn_name.to_s
21
22
  args = raw_args.map { |arg| resolve(arg) }
22
- if fn == 'global'
23
+ if fn_name == 'global'
23
24
  globals.dig(*args)
24
- elsif fn_defined?(fn)
25
- apply(fn, *args)
26
25
  else
27
- # TODO: It would be nice to get error messages with a stacktrace or at
28
- # least some context about the parent expressions
29
- raise MethodMissing, "Unknown fn #{fn} in expression #{expression}"
26
+ apply(fn_name, *args)
30
27
  end
31
28
  when Hash
32
29
  expression.transform_values do |value|
@@ -35,14 +32,20 @@ module Conflisp
35
32
  else
36
33
  expression
37
34
  end
38
- end
39
-
40
- def fn_defined?(fn_name)
41
- registry.key?(fn_name)
35
+ rescue Conflisp::ConflispError => e
36
+ e.conflisp_stack << expression
37
+ raise e
42
38
  end
43
39
 
44
40
  def apply(fn_name, *args)
45
- instance_exec(*args, &registry[fn_name])
41
+ method = registry[fn_name]
42
+ raise Conflisp::MethodMissing, fn_name unless method
43
+
44
+ begin
45
+ instance_exec(*args, &method)
46
+ rescue StandardError => e
47
+ raise Conflisp::RuntimeError.new(e, [fn_name, *args])
48
+ end
46
49
  end
47
50
  end
48
51
  end
@@ -3,5 +3,11 @@
3
3
  require 'conflisp/conflisp_error'
4
4
 
5
5
  module Conflisp
6
- MethodMissing = Class.new(ConflispError)
6
+ # Error raised when a function is not found
7
+ class MethodMissing < ConflispError
8
+ def initialize(fn_name)
9
+ message = "Unknown fn `#{fn_name}`"
10
+ super(message)
11
+ end
12
+ end
7
13
  end
@@ -0,0 +1,18 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'conflisp/conflisp_error'
4
+
5
+ module Conflisp
6
+ # Error raised when evaluation of a Conflisp expression fails
7
+ class RuntimeError < ConflispError
8
+ attr_reader :original_error
9
+
10
+ def initialize(error, expression)
11
+ message = "#{error.class.name}: #{error.message}"
12
+ message += "\n while evaluating #{expression}"
13
+ super(message)
14
+
15
+ @original_error = error
16
+ end
17
+ end
18
+ end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: conflisp
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.0.0
4
+ version: 2.0.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - Rocky Meza
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2019-06-06 00:00:00.000000000 Z
11
+ date: 2023-02-14 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: rspec
@@ -16,14 +16,14 @@ dependencies:
16
16
  requirements:
17
17
  - - "~>"
18
18
  - !ruby/object:Gem::Version
19
- version: 3.7.0
19
+ version: 3.12.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: 3.7.0
26
+ version: 3.12.0
27
27
  - !ruby/object:Gem::Dependency
28
28
  name: rspec_junit_formatter
29
29
  requirement: !ruby/object:Gem::Requirement
@@ -44,28 +44,42 @@ dependencies:
44
44
  requirements:
45
45
  - - "~>"
46
46
  - !ruby/object:Gem::Version
47
- version: 0.71.0
47
+ version: 0.93.1
48
48
  type: :development
49
49
  prerelease: false
50
50
  version_requirements: !ruby/object:Gem::Requirement
51
51
  requirements:
52
52
  - - "~>"
53
53
  - !ruby/object:Gem::Version
54
- version: 0.71.0
54
+ version: 0.93.1
55
55
  - !ruby/object:Gem::Dependency
56
56
  name: simplecov
57
57
  requirement: !ruby/object:Gem::Requirement
58
58
  requirements:
59
59
  - - "~>"
60
60
  - !ruby/object:Gem::Version
61
- version: 0.16.1
61
+ version: 0.19.0
62
62
  type: :development
63
63
  prerelease: false
64
64
  version_requirements: !ruby/object:Gem::Requirement
65
65
  requirements:
66
66
  - - "~>"
67
67
  - !ruby/object:Gem::Version
68
- version: 0.16.1
68
+ version: 0.19.0
69
+ - !ruby/object:Gem::Dependency
70
+ name: simplecov-lcov
71
+ requirement: !ruby/object:Gem::Requirement
72
+ requirements:
73
+ - - "~>"
74
+ - !ruby/object:Gem::Version
75
+ version: 0.8.0
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.0
69
83
  description:
70
84
  email:
71
85
  - rocky@geteverwise.com
@@ -79,6 +93,7 @@ files:
79
93
  - lib/conflisp/evaluator.rb
80
94
  - lib/conflisp/language.rb
81
95
  - lib/conflisp/method_missing.rb
96
+ - lib/conflisp/runtime_error.rb
82
97
  homepage: https://github.com/everwise/conflisp
83
98
  licenses:
84
99
  - MIT
@@ -91,14 +106,14 @@ required_ruby_version: !ruby/object:Gem::Requirement
91
106
  requirements:
92
107
  - - ">="
93
108
  - !ruby/object:Gem::Version
94
- version: '0'
109
+ version: '2.5'
95
110
  required_rubygems_version: !ruby/object:Gem::Requirement
96
111
  requirements:
97
112
  - - ">="
98
113
  - !ruby/object:Gem::Version
99
114
  version: '0'
100
115
  requirements: []
101
- rubygems_version: 3.0.3
116
+ rubygems_version: 3.0.3.1
102
117
  signing_key:
103
118
  specification_version: 4
104
119
  summary: A tool for building JSON-serializable lisps.