rpl 0.3.0 → 0.4.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
  SHA256:
3
- metadata.gz: 8f26f2f32e0e42c05a0ed59c2f21bb31433a5c2be29454cc17e7c5e1ee9bc2b1
4
- data.tar.gz: ddb9ad1384954af38402126f5425654e1534b684f57271736bd64eace4cc987a
3
+ metadata.gz: fabbce316a5c08423208383985c44621b20e0032499072ada99fe46aa24b7f9a
4
+ data.tar.gz: d1861c145f2647640cf5192fd376177a2565915e979a15cb46a34a7e340d6171
5
5
  SHA512:
6
- metadata.gz: 1d3ebfc6baa238fc2ad342f71c871399cbb37d4e8a87bbbbaf0173573947592ebeb62a2686a4a99ba07bf8860e97abb0615abce86450ffa328915cace9523658
7
- data.tar.gz: ee1d985c2f136ef8eedd496b3c5a1c051f19f46aef118c2e308f2b5dbbe2cc5191555e714fc398c0c518c13e388e48d30db4d81751160bf0e8f6e1374dc17eae
6
+ metadata.gz: 2150ec4f68a633e83e1e17ce6508ad706e8e3a5cfe9e3683322f9e257d59ac6d37303d2ea87072f4479fe2b42189231748e3d294028a2fdfa6952ad8ae528aa3
7
+ data.tar.gz: 9e4b5766997db3b9825bd9d713e90a0494d3a007f3f4882bfe7f5eb5aed2e5b47281ee9d077e96915697f884e4a362aed3f652ce647e71b92cee1c4689e4212e
@@ -12,7 +12,7 @@ module RplLang
12
12
  proc do
13
13
  args = stack_extract( [:any] )
14
14
 
15
- if %i[list string numeric boolean].include?( args[0][:type] )
15
+ if %i[list numeric boolean].include?( args[0][:type] )
16
16
  @stack << args[0] # these types evaluate to themselves
17
17
  else
18
18
  run( args[0][:value].to_s )
@@ -1,6 +1,8 @@
1
1
  # frozen_string_literal: true
2
2
 
3
+ require 'bigdecimal'
3
4
  require 'bigdecimal/math'
5
+ require 'bigdecimal/util'
4
6
 
5
7
  require 'rpl/dictionary'
6
8
 
@@ -41,6 +43,23 @@ class Interpreter
41
43
  end
42
44
  end
43
45
 
46
+ unless input.index("\n").nil?
47
+ input = input
48
+ .split("\n")
49
+ .map do |line|
50
+ comment_begin_index = line.index('#')
51
+
52
+ if comment_begin_index.nil?
53
+ line
54
+ elsif comment_begin_index == 0
55
+ ''
56
+ else
57
+ line[0..(comment_begin_index - 1)]
58
+ end
59
+ end
60
+ .join(' ')
61
+ end
62
+
44
63
  splitted_input = input.split(' ')
45
64
 
46
65
  # 2-passes:
@@ -112,20 +131,30 @@ class Interpreter
112
131
 
113
132
  if %I[string name].include?( parsed_entry[:type] )
114
133
  parsed_entry[:value] = parsed_entry[:value][1..-2]
115
- elsif parsed_entry[:type] == :program
134
+ elsif %I[program].include?( parsed_entry[:type] )
116
135
  parsed_entry[:value] = parsed_entry[:value][2..-3]
117
- elsif parsed_entry[:type] == :list
136
+ elsif %I[list].include?( parsed_entry[:type] )
118
137
  parsed_entry[:value] = parse( parsed_entry[:value][2..-3] )
119
- elsif parsed_entry[:type] == :numeric
120
- parsed_entry[:base] = 10 # TODO: parse others possible bases 0x...
121
-
122
- begin
123
- parsed_entry[:value] = Float( parsed_entry[:value] )
124
- parsed_entry[:value] = parsed_entry[:value].to_i if (parsed_entry[:value] % 1).zero? && elt.index('.').nil?
125
- rescue ArgumentError
126
- parsed_entry[:value] = Integer( parsed_entry[:value] )
138
+ elsif %I[numeric].include?( parsed_entry[:type] )
139
+ underscore_position = parsed_entry[:value].index('_')
140
+
141
+ if parsed_entry[:value][0] == '0' && ( ['b', 'o', 'x'].include?( parsed_entry[:value][1] ) || !underscore_position.nil? )
142
+ if parsed_entry[:value][1] == 'x'
143
+ parsed_entry[:base] = 16
144
+ elsif parsed_entry[:value][1] == 'b'
145
+ parsed_entry[:base] = 2
146
+ elsif parsed_entry[:value][1] == 'o'
147
+ parsed_entry[:base] = 8
148
+ parsed_entry[:value] = parsed_entry[:value][2..]
149
+ elsif !underscore_position.nil?
150
+ parsed_entry[:base] = parsed_entry[:value][1..(underscore_position - 1)].to_i
151
+ parsed_entry[:value] = parsed_entry[:value][(underscore_position + 1)..]
152
+ end
153
+ else
154
+ parsed_entry[:base] = 10
127
155
  end
128
156
 
157
+ parsed_entry[:value] = parsed_entry[:value].to_i( parsed_entry[:base] ) unless parsed_entry[:base] == 10
129
158
  parsed_entry[:value] = BigDecimal( parsed_entry[:value], @precision )
130
159
  end
131
160
 
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: rpl
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.3.0
4
+ version: 0.4.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Gwenhael Le Moine
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2022-02-17 00:00:00.000000000 Z
11
+ date: 2022-02-22 00:00:00.000000000 Z
12
12
  dependencies: []
13
13
  description: A language inspired by HP's RPL and https://github.com/louisrubet/rpn/
14
14
  email: gwenhael@le-moine.org