rpl 0.3.0 → 0.4.0

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: 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