rpl 0.6.0 → 0.7.2

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: 473327f669ed4e0484a32f534efa52bcbfbb8521ebcad7fa4d38de35f6576972
4
- data.tar.gz: cd6d921d8f40edcd95a32d4af529d7435962c65f621fa7903cbee4a1fabcf07f
3
+ metadata.gz: 14743c6b30b8c1cccd4d1147b75062f239f6bde4e90704f3e3e12f7040997165
4
+ data.tar.gz: 7081e6d58e3066f148379b4e091e0de9e955f6c821a47857d28e466f56bfb782
5
5
  SHA512:
6
- metadata.gz: 4db7ebbce26e2eb92cc4baaa0a35954f3de5e8129b28c348bd78d420109300ec988dc4d8ed27464e7455ba8103c6141ed084d6c63526651b982c712a52cd9413
7
- data.tar.gz: fbc27ef9008a261401d02bb69a86c4eff00861df9018d2af4a029aa69fbf21475436a67aa8066d23c4eb6ac01455944e2a567c4f18b36f121059b06c351ef903
6
+ metadata.gz: d315a8b60972828ed69369f1ac17150357430e5066629ec88c3c16bc97e8c9d2cffaf3323f9526c86ea32a8a052b53887e61ca328a178dee19bf0eec88e8cd0b
7
+ data.tar.gz: 631502e4025f34fbcd7355922e2c6b2d77af8b326b4b2900c8cb12a2ac9824e44a5c7bc52ceff8f1b2130e82220864d76ecc90110dc02a942f9795a19466a35d
@@ -18,7 +18,7 @@ class Interpreter
18
18
  attr_accessor :precision
19
19
 
20
20
  def initialize( stack = [], dictionary = Rpl::Lang::Dictionary.new )
21
- @version = 0.6
21
+ @version = 0.72
22
22
 
23
23
  @dictionary = dictionary
24
24
  @stack = stack
data/lib/rpl/parser.rb CHANGED
@@ -70,17 +70,17 @@ class Parser
70
70
  # 2. parse
71
71
  regrouped_input.map do |element|
72
72
  if RplBoolean.can_parse?( element )
73
- RplBoolean.new( element )
73
+ Types.new_object( RplBoolean, element )
74
74
  elsif RplNumeric.can_parse?( element )
75
- RplNumeric.new( element )
75
+ Types.new_object( RplNumeric, element )
76
76
  elsif RplList.can_parse?( element )
77
- RplList.new( element )
77
+ Types.new_object( RplList, element )
78
78
  elsif RplString.can_parse?( element )
79
- RplString.new( element )
79
+ Types.new_object( RplString, element )
80
80
  elsif RplProgram.can_parse?( element )
81
- RplProgram.new( element )
81
+ Types.new_object( RplProgram, element )
82
82
  elsif RplName.can_parse?( element )
83
- RplName.new( element )
83
+ Types.new_object( RplName, element )
84
84
  end
85
85
  end
86
86
  end
@@ -37,30 +37,29 @@ module Types
37
37
  when Float
38
38
  @value = BigDecimal( value, @@precision )
39
39
  when String
40
- case value
41
- when '∞'
42
- @value = BigDecimal('+Infinity')
43
- when '-∞'
44
- @value = BigDecimal('-Infinity')
45
- else
46
- underscore_position = value.index('_')
47
-
48
- if value[0] == '0' && ( %w[b o x].include?( value[1] ) || !underscore_position.nil? )
49
- if value[1] == 'x'
50
- @base = 16
51
- elsif value[1] == 'b'
52
- @base = 2
53
- elsif value[1] == 'o'
54
- @base = 8
55
- value = value[2..-1]
56
- elsif !underscore_position.nil?
57
- @base = value[1..(underscore_position - 1)].to_i
58
- value = value[(underscore_position + 1)..-1]
59
- end
60
- end
61
-
62
- value = value.to_i( @base ) unless @base == 10
40
+ begin
63
41
  @value = BigDecimal( value, @@precision )
42
+ rescue ArgumentError
43
+ case value
44
+ when /^0x[0-9a-f]+$/
45
+ @base = 16
46
+ @value = BigDecimal( /^0x(?<value>[0-9a-f]+)$/.match( value )['value'].to_i( @base ), @@precision )
47
+ when /^0o[0-7]+$/
48
+ @base = 8
49
+ @value = BigDecimal( /^0o(?<value>[0-7]+)$/.match( value )['value'].to_i( @base ), @@precision )
50
+ when /^0b[0-1]+$/
51
+ @base = 2
52
+ @value = BigDecimal( /^0b(?<value>[0-1]+)$/.match( value )['value'].to_i( @base ), @@precision )
53
+ when '∞'
54
+ @value = BigDecimal('+Infinity')
55
+ when '-∞'
56
+ @value = BigDecimal('-Infinity')
57
+ else
58
+ matches = /(?<base>[0-9]+)b(?<value>[0-9a-z]+)/.match( value )
59
+
60
+ @base = matches['base'].to_i
61
+ @value = BigDecimal( matches['value'].to_i( @base ), @@precision )
62
+ end
64
63
  end
65
64
  end
66
65
  end
@@ -76,21 +75,20 @@ module Types
76
75
  when 16
77
76
  '0x'
78
77
  else
79
- "0#{@base}_"
78
+ "#{@base}b"
80
79
  end
81
80
 
82
- if @value.infinite?
83
- suffix = @value.infinite?.positive? ? '∞' : '-∞'
84
- elsif @value.nan?
85
- suffix = '<NaN>'
86
- else
87
- suffix = if @value.to_i == @value
88
- @value.to_i
89
- else
90
- @value.to_s('F')
91
- end
92
- suffix = @value.to_s( @base ) unless @base == 10
93
- end
81
+ suffix = if @value.infinite?
82
+ @value.infinite?.positive? ? '∞' : '-∞'
83
+ elsif @value.nan?
84
+ '<NaN>'
85
+ elsif @base != 10
86
+ @value.to_i.to_s( @base )
87
+ elsif @value.frac.zero?
88
+ @value.to_i
89
+ else
90
+ @value.to_s( 'F' )
91
+ end
94
92
 
95
93
  "#{prefix}#{suffix}"
96
94
  end
@@ -102,7 +100,7 @@ module Types
102
100
  value.match?(/^0b[0-1]+$/) or
103
101
  value.match?(/^0o[0-7]+$/) or
104
102
  value.match?(/^0x[0-9a-f]+$/) or
105
- ( value.match?(/^0[0-9]+_[0-9a-z]+$/) and
103
+ ( value.match?(/^[0-9]+b[0-9a-z]+$/) and
106
104
  value.split('_').first.to_i <= 36 ) ) )
107
105
  end
108
106
 
data/lib/rpl/types.rb CHANGED
@@ -6,3 +6,14 @@ require 'rpl/types/list'
6
6
  require 'rpl/types/string'
7
7
  require 'rpl/types/program'
8
8
  require 'rpl/types/numeric'
9
+
10
+ module Types
11
+ module_function
12
+ def new_object( type_class, value )
13
+ if type_class.can_parse?( value )
14
+ type_class.new( value )
15
+ else
16
+ RplString.new( "\"Error: cannot create #{type_class} with value #{value}\"" )
17
+ end
18
+ end
19
+ end
@@ -11,7 +11,7 @@ module RplLang
11
11
  @dictionary.add_word( ['ift'],
12
12
  'Branch',
13
13
  '( t pt -- … ) eval pt or not based on the value of boolean t',
14
- RplProgram.new( '« « nop » ifte »' ) )
14
+ Types.new_object( RplProgram, '« « nop » ifte »' ) )
15
15
 
16
16
  @dictionary.add_word( ['ifte'],
17
17
  'Branch',
@@ -29,7 +29,7 @@ module RplLang
29
29
  args = stack_extract( [[RplNumeric], :any] )
30
30
 
31
31
  args[0].value.to_i.times do |counter|
32
- @stack << RplNumeric.new( counter )
32
+ @stack << Types.new_object( RplNumeric, counter )
33
33
 
34
34
  run( args[1].value )
35
35
  end
@@ -42,7 +42,7 @@ module RplLang
42
42
  args = stack_extract( [[RplNumeric], [RplNumeric], :any] )
43
43
 
44
44
  ((args[1].value.to_i)..(args[0].value.to_i)).each do |counter|
45
- @stack << RplNumeric.new( counter )
45
+ @stack << Types.new_object( RplNumeric, counter )
46
46
 
47
47
  run( args[2].value )
48
48
  end
@@ -16,13 +16,13 @@ module RplLang
16
16
 
17
17
  path = File.absolute_path( args[0].value )
18
18
 
19
- @stack << RplString.new( "\"#{File.read( path )}\"" )
19
+ @stack << Types.new_object( RplString, "\"#{File.read( path )}\"" )
20
20
  end )
21
21
 
22
22
  @dictionary.add_word( ['feval'],
23
23
  'Filesystem',
24
24
  '( filename -- … ) read and run file',
25
- RplProgram.new( '« fread eval »' ) )
25
+ Types.new_object( RplProgram, '« fread eval »' ) )
26
26
 
27
27
  @dictionary.add_word( ['fwrite'],
28
28
  'Filesystem',
@@ -1,5 +1,7 @@
1
1
  # frozen_string_literal: true
2
2
 
3
+ require 'tempfile'
4
+
3
5
  module RplLang
4
6
  module Words
5
7
  module General
@@ -21,7 +23,7 @@ module RplLang
21
23
 
22
24
  word = @dictionary.words[ args[0].value ]
23
25
 
24
- @stack << RplString.new( "\"#{args[0].value}: #{word.nil? ? 'not a core word' : word[:help]}\"" )
26
+ @stack << Types.new_object( RplString, "\"#{args[0].value}: #{word.nil? ? 'not a core word' : word[:help]}\"" )
25
27
  end )
26
28
 
27
29
  @dictionary.add_word( ['words'],
@@ -33,7 +35,7 @@ module RplLang
33
35
  .group_by { |word| word.last[:category] }
34
36
  .each do |cat, words|
35
37
  puts cat
36
- puts " #{words.map { |word| word.first }.join(', ')}"
38
+ puts " #{words.map(&:first).join(', ')}"
37
39
  end
38
40
  end )
39
41
 
@@ -46,14 +48,14 @@ module RplLang
46
48
  'General',
47
49
  '( -- n ) Pop the interpreter\'s version number',
48
50
  proc do
49
- @stack += Parser.parse( @version.to_s )
51
+ @stack << Types.new_object( RplString, "\"#{@version}\"" )
50
52
  end )
51
53
 
52
54
  @dictionary.add_word( ['uname'],
53
55
  'General',
54
56
  '( -- s ) Pop the interpreter\'s complete indentification string',
55
57
  proc do
56
- @stack += Parser.parse( "\"Rpl Interpreter version #{@version}\"" )
58
+ @stack << Types.new_object( RplString, "\"Rpl Interpreter version #{@version}\"" )
57
59
  end )
58
60
 
59
61
  @dictionary.add_word( ['history'],
@@ -61,6 +63,30 @@ module RplLang
61
63
  '',
62
64
  proc {} )
63
65
 
66
+ @dictionary.add_word( ['edit'],
67
+ 'General',
68
+ '( -- s ) Pop the interpreter\'s complete indentification string',
69
+ proc do
70
+ args = stack_extract( [:any] )
71
+
72
+ value = args[0].to_s
73
+ tempfile = Tempfile.new('rpl')
74
+
75
+ begin
76
+ tempfile.write( value )
77
+ tempfile.rewind
78
+
79
+ `$EDITOR #{tempfile.path}`
80
+
81
+ edited_value = tempfile.read
82
+ ensure
83
+ tempfile.close
84
+ tempfile.unlink
85
+ end
86
+
87
+ @stack << Types.new_object( args[0].class, edited_value )
88
+ end )
89
+
64
90
  @dictionary.add_word( ['.s'],
65
91
  'REPL',
66
92
  'DEBUG',
@@ -12,7 +12,7 @@ module RplLang
12
12
  'Logs on reals and complexes',
13
13
  '( … -- ℇ ) push ℇ',
14
14
  proc do
15
- @stack << RplNumeric.new( BigMath.E( RplNumeric.precision ) )
15
+ @stack << Types.new_object( RplNumeric, BigMath.E( RplNumeric.precision ) )
16
16
  end )
17
17
 
18
18
  # @dictionary.add_word( ['ln'],
@@ -28,7 +28,7 @@ module RplLang
28
28
  proc do
29
29
  args = stack_extract( [:any] )
30
30
 
31
- @stack << RplString.new( "\"#{args[0].class.to_s[10..-1]}\"" )
31
+ @stack << Types.new_object( RplString, "\"#{args[0].class.to_s[10..-1]}\"" )
32
32
  end )
33
33
 
34
34
  # @dictionary.add_word( ['std'],
@@ -57,12 +57,12 @@ module RplLang
57
57
  args[0]
58
58
  else
59
59
  if args[1].instance_of?( RplString )
60
- RplString.new( "\"#{args[0].value}#{args[1].value}\"" )
60
+ Types.new_object( RplString, "\"#{args[0].value}#{args[1].value}\"" )
61
61
  elsif args[1].instance_of?( RplNumeric )
62
62
  args[0].value = "#{args[0].value}#{args[1]}"
63
63
  args[0]
64
64
  else
65
- RplString.new( "\"#{args[0]}#{args[1]}\"" )
65
+ Types.new_object( RplString, "\"#{args[0]}#{args[1]}\"" )
66
66
  end
67
67
  end
68
68
 
@@ -307,7 +307,7 @@ module RplLang
307
307
  proc do
308
308
  args = stack_extract( [[RplNumeric]] )
309
309
 
310
- @stack << RplNumeric.new( args[0].value.to_s.split('e').first.to_f.abs )
310
+ @stack << Types.new_object( RplNumeric, args[0].value.to_s.split('e').first.to_f.abs )
311
311
  end )
312
312
 
313
313
  @dictionary.add_word( ['xpon'],
@@ -20,7 +20,7 @@ module RplLang
20
20
  @dictionary.add_word( ['drop'],
21
21
  'Stack',
22
22
  '( a -- ) drop first stack element',
23
- RplProgram.new( '« 1 dropn »' ) )
23
+ Types.new_object( RplProgram, '« 1 dropn »' ) )
24
24
 
25
25
  @dictionary.add_word( ['drop2'],
26
26
  'Stack',
@@ -57,12 +57,12 @@ module RplLang
57
57
  @dictionary.add_word( ['dup'],
58
58
  'Stack',
59
59
  '( a -- a a ) duplicate first stack element',
60
- RplProgram.new( '« 1 dupn »' ) )
60
+ Types.new_object( RplProgram, '« 1 dupn »' ) )
61
61
 
62
62
  @dictionary.add_word( ['dup2'],
63
63
  'Stack',
64
64
  '( a b -- a b a b ) duplicate first two stack elements',
65
- RplProgram.new( '« 2 dupn »' ) )
65
+ Types.new_object( RplProgram, '« 2 dupn »' ) )
66
66
 
67
67
  @dictionary.add_word( ['dupn'],
68
68
  'Stack',
@@ -102,7 +102,7 @@ module RplLang
102
102
  'Stack',
103
103
  '( … -- … n ) push stack depth onto the stack',
104
104
  proc do
105
- @stack << RplNumeric.new( stack.size )
105
+ @stack << Types.new_object( RplNumeric, stack.size )
106
106
  end )
107
107
 
108
108
  @dictionary.add_word( ['roll'],
@@ -142,7 +142,7 @@ module RplLang
142
142
  @dictionary.add_word( ['over'],
143
143
  'Stack',
144
144
  '( a b -- a b a ) push a copy of the element in stack level 2 onto the stack',
145
- RplProgram.new( '« 2 pick »' ) )
145
+ Types.new_object( RplProgram, '« 2 pick »' ) )
146
146
  end
147
147
  end
148
148
  end
@@ -42,7 +42,7 @@ module RplLang
42
42
  'Store',
43
43
  '( -- […] ) list variables',
44
44
  proc do
45
- @stack << RplList.new( (@dictionary.vars.keys + @dictionary.local_vars_layers.reduce([]) { |memo, layer| memo + layer.keys }).map { |name| RplName.new( name ) } )
45
+ @stack << Types.new_object( RplList, (@dictionary.vars.keys + @dictionary.local_vars_layers.reduce([]) { |memo, layer| memo + layer.keys }).map { |name| Types.new_object( RplName, name ) } )
46
46
  end )
47
47
 
48
48
  @dictionary.add_word( ['clusr'],
@@ -55,44 +55,32 @@ module RplLang
55
55
  @dictionary.add_word( ['sto+'],
56
56
  'Store',
57
57
  '( a n -- ) add content to variable\'s value',
58
- RplProgram.new( '« dup type "Name" ==
59
- « swap »
60
- ift
61
- over rcl + swap sto »' ) )
58
+ Types.new_object( RplProgram, swap over rcl + swap sto »' ) )
62
59
 
63
60
  @dictionary.add_word( ['sto-'],
64
61
  'Store',
65
62
  '( a n -- ) subtract content to variable\'s value',
66
- RplProgram.new( '« dup type "Name" ==
67
- « swap »
68
- ift
69
- over rcl swap - swap sto »' ) )
63
+ Types.new_object( RplProgram, swap over rcl swap - swap sto »' ) )
70
64
 
71
65
  @dictionary.add_word( ['sto×', 'sto*'],
72
66
  'Store',
73
67
  '( a n -- ) multiply content of variable\'s value',
74
- RplProgram.new( '« dup type "Name" ==
75
- « swap »
76
- ift
77
- over rcl * swap sto »' ) )
68
+ Types.new_object( RplProgram, swap over rcl * swap sto »' ) )
78
69
 
79
70
  @dictionary.add_word( ['sto÷', 'sto/'],
80
71
  'Store',
81
72
  '( a n -- ) divide content of variable\'s value',
82
- RplProgram.new( '« dup type "Name" ==
83
- « swap »
84
- ift
85
- over rcl swap / swap sto »' ) )
73
+ Types.new_object( RplProgram, swap over rcl swap / swap sto »' ) )
86
74
 
87
75
  @dictionary.add_word( ['sneg'],
88
76
  'Store',
89
77
  '( a n -- ) negate content of variable\'s value',
90
- RplProgram.new( '« dup rcl chs swap sto »' ) )
78
+ Types.new_object( RplProgram, '« dup rcl chs swap sto »' ) )
91
79
 
92
80
  @dictionary.add_word( ['sinv'],
93
81
  'Store',
94
82
  '( a n -- ) invert content of variable\'s value',
95
- RplProgram.new( '« dup rcl inv swap sto »' ) )
83
+ Types.new_object( RplProgram, '« dup rcl inv swap sto »' ) )
96
84
 
97
85
  @dictionary.add_word( ['↴', 'lsto'],
98
86
  'Program',
@@ -14,7 +14,7 @@ module RplLang
14
14
  proc do
15
15
  args = stack_extract( [:any] )
16
16
 
17
- @stack << RplString.new( "\"#{args[0]}\"" )
17
+ @stack << Types.new_object( RplString, "\"#{args[0]}\"" )
18
18
  end )
19
19
 
20
20
  @dictionary.add_word( ['str→', 'str->'],
@@ -33,7 +33,7 @@ module RplLang
33
33
  args = stack_extract( [[RplNumeric]] )
34
34
  args = stack_extract( %i[any] * args[0].value )
35
35
 
36
- @stack << RplList.new( args.reverse )
36
+ @stack << Types.new_object( RplList, args.reverse )
37
37
  end )
38
38
 
39
39
  @dictionary.add_word( ['list→', 'list->'],
@@ -53,7 +53,7 @@ module RplLang
53
53
  proc do
54
54
  args = stack_extract( [[RplNumeric]] )
55
55
 
56
- @stack << RplString.new( "\"#{args[0].value.to_i.chr}\"" )
56
+ @stack << Types.new_object( RplString, "\"#{args[0].value.to_i.chr}\"" )
57
57
  end )
58
58
 
59
59
  @dictionary.add_word( ['num'],
@@ -62,7 +62,7 @@ module RplLang
62
62
  proc do
63
63
  args = stack_extract( [[RplString]] )
64
64
 
65
- @stack << RplNumeric.new( args[0].value.ord )
65
+ @stack << Types.new_object( RplNumeric, args[0].value.ord )
66
66
  end )
67
67
 
68
68
  @dictionary.add_word( ['size'],
@@ -71,7 +71,7 @@ module RplLang
71
71
  proc do
72
72
  args = stack_extract( [[RplString, RplList]] )
73
73
 
74
- @stack << RplNumeric.new( args[0].value.length )
74
+ @stack << Types.new_object( RplNumeric, args[0].value.length )
75
75
  end )
76
76
 
77
77
  @dictionary.add_word( ['pos'],
@@ -80,7 +80,7 @@ module RplLang
80
80
  proc do
81
81
  args = stack_extract( [[RplString], [RplString]] )
82
82
 
83
- @stack << RplNumeric.new( args[1].value.index( args[0].value ) )
83
+ @stack << Types.new_object( RplNumeric, args[1].value.index( args[0].value ) )
84
84
  end )
85
85
 
86
86
  @dictionary.add_word( ['sub'],
@@ -89,7 +89,7 @@ module RplLang
89
89
  proc do
90
90
  args = stack_extract( [[RplNumeric], [RplNumeric], [RplString]] )
91
91
 
92
- @stack << RplString.new( "\"#{args[2].value[ (args[1].value - 1)..(args[0].value - 1) ]}\"" )
92
+ @stack << Types.new_object( RplString, "\"#{args[2].value[ (args[1].value - 1)..(args[0].value - 1) ]}\"" )
93
93
  end )
94
94
 
95
95
  @dictionary.add_word( ['rev'],
@@ -110,7 +110,7 @@ module RplLang
110
110
  args = stack_extract( [[RplString], [RplString]] )
111
111
 
112
112
  args[1].value.split( args[0].value ).each do |elt|
113
- @stack << RplString.new( "\"#{elt}\"" )
113
+ @stack << Types.new_object( RplString, "\"#{elt}\"" )
114
114
  end
115
115
  end )
116
116
 
@@ -14,7 +14,7 @@ module RplLang
14
14
  proc do
15
15
  args = stack_extract( %i[any any] )
16
16
 
17
- @stack << RplBoolean.new( args[1].value > args[0].value )
17
+ @stack << Types.new_object( RplBoolean, args[1].value > args[0].value )
18
18
  end )
19
19
 
20
20
  @dictionary.add_word( ['≥', '>='],
@@ -23,7 +23,7 @@ module RplLang
23
23
  proc do
24
24
  args = stack_extract( %i[any any] )
25
25
 
26
- @stack << RplBoolean.new( args[1].value >= args[0].value )
26
+ @stack << Types.new_object( RplBoolean, args[1].value >= args[0].value )
27
27
  end )
28
28
 
29
29
  @dictionary.add_word( ['<'],
@@ -32,7 +32,7 @@ module RplLang
32
32
  proc do
33
33
  args = stack_extract( %i[any any] )
34
34
 
35
- @stack << RplBoolean.new( args[1].value < args[0].value )
35
+ @stack << Types.new_object( RplBoolean, args[1].value < args[0].value )
36
36
  end )
37
37
 
38
38
  @dictionary.add_word( ['≤', '<='],
@@ -41,7 +41,7 @@ module RplLang
41
41
  proc do
42
42
  args = stack_extract( %i[any any] )
43
43
 
44
- @stack << RplBoolean.new( args[1].value <= args[0].value )
44
+ @stack << Types.new_object( RplBoolean, args[1].value <= args[0].value )
45
45
  end )
46
46
 
47
47
  @dictionary.add_word( ['≠', '!='],
@@ -50,7 +50,7 @@ module RplLang
50
50
  proc do
51
51
  args = stack_extract( %i[any any] )
52
52
 
53
- @stack << RplBoolean.new( args[1].value != args[0].value )
53
+ @stack << Types.new_object( RplBoolean, args[1].value != args[0].value )
54
54
  end )
55
55
 
56
56
  @dictionary.add_word( ['==', 'same'],
@@ -59,7 +59,7 @@ module RplLang
59
59
  proc do
60
60
  args = stack_extract( %i[any any] )
61
61
 
62
- @stack << RplBoolean.new( args[1].value == args[0].value )
62
+ @stack << Types.new_object( RplBoolean, args[1].value == args[0].value )
63
63
  end )
64
64
 
65
65
  @dictionary.add_word( ['and'],
@@ -68,7 +68,7 @@ module RplLang
68
68
  proc do
69
69
  args = stack_extract( [[RplBoolean], [RplBoolean]] )
70
70
 
71
- @stack << RplBoolean.new( args[1].value && args[0].value )
71
+ @stack << Types.new_object( RplBoolean, args[1].value && args[0].value )
72
72
  end )
73
73
 
74
74
  @dictionary.add_word( ['or'],
@@ -77,7 +77,7 @@ module RplLang
77
77
  proc do
78
78
  args = stack_extract( [[RplBoolean], [RplBoolean]] )
79
79
 
80
- @stack << RplBoolean.new( args[1].value || args[0].value )
80
+ @stack << Types.new_object( RplBoolean, args[1].value || args[0].value )
81
81
  end )
82
82
 
83
83
  @dictionary.add_word( ['xor'],
@@ -86,7 +86,7 @@ module RplLang
86
86
  proc do
87
87
  args = stack_extract( [[RplBoolean], [RplBoolean]] )
88
88
 
89
- @stack << RplBoolean.new( args[1].value ^ args[0].value )
89
+ @stack << Types.new_object( RplBoolean, args[1].value ^ args[0].value )
90
90
  end )
91
91
 
92
92
  @dictionary.add_word( ['not'],
@@ -95,21 +95,21 @@ module RplLang
95
95
  proc do
96
96
  args = stack_extract( [[RplBoolean]] )
97
97
 
98
- @stack << RplBoolean.new(!args[0].value )
98
+ @stack << Types.new_object( RplBoolean,!args[0].value )
99
99
  end )
100
100
 
101
101
  @dictionary.add_word( ['true'],
102
102
  'Test',
103
103
  '( -- t ) push true onto stack',
104
104
  proc do
105
- @stack << RplBoolean.new( true )
105
+ @stack << Types.new_object( RplBoolean, true )
106
106
  end )
107
107
 
108
108
  @dictionary.add_word( ['false'],
109
109
  'Test',
110
110
  '( -- t ) push false onto stack',
111
111
  proc do
112
- @stack << RplBoolean.new( false )
112
+ @stack << Types.new_object( RplBoolean, false )
113
113
  end )
114
114
  end
115
115
  end
@@ -14,13 +14,13 @@ module RplLang
14
14
  'Time and date',
15
15
  '( -- t ) push current time',
16
16
  proc do
17
- @stack << RplString.new( "\"#{Time.now}\"" )
17
+ @stack << Types.new_object( RplString, "\"#{DateTime.now.iso8601.to_s.split('T').last[0..7]}\"" )
18
18
  end )
19
19
  @dictionary.add_word( ['date'],
20
20
  'Time and date',
21
21
  '( -- d ) push current date',
22
22
  proc do
23
- @stack << RplString.new( "\"#{Date.today}\"" )
23
+ @stack << Types.new_object( RplString, "\"#{Date.today.iso8601}\"" )
24
24
  end )
25
25
  @dictionary.add_word( ['ticks'],
26
26
  'Time and date',
@@ -28,7 +28,7 @@ module RplLang
28
28
  proc do
29
29
  ticks_since_epoch = Time.utc( 1, 1, 1 ).to_i * 10_000_000
30
30
  now = Time.now
31
- @stack << RplNumeric.new( now.to_i * 10_000_000 + now.nsec / 100 - ticks_since_epoch )
31
+ @stack << Types.new_object( RplNumeric, now.to_i * 10_000_000 + now.nsec / 100 - ticks_since_epoch )
32
32
  end )
33
33
  end
34
34
  end
@@ -14,7 +14,7 @@ module RplLang
14
14
  'Trig on reals and complexes',
15
15
  '( … -- 𝛑 ) push 𝛑',
16
16
  proc do
17
- @stack << RplNumeric.new( BigMath.PI( RplNumeric.precision ) )
17
+ @stack << Types.new_object( RplNumeric, BigMath.PI( RplNumeric.precision ) )
18
18
  end )
19
19
 
20
20
  @dictionary.add_word( ['sin'],
@@ -23,13 +23,13 @@ module RplLang
23
23
  proc do
24
24
  args = stack_extract( [[RplNumeric]] )
25
25
 
26
- @stack << RplNumeric.new( BigMath.sin( BigDecimal( args[0].value, RplNumeric.precision ), RplNumeric.precision ) )
26
+ @stack << Types.new_object( RplNumeric, BigMath.sin( BigDecimal( args[0].value, RplNumeric.precision ), RplNumeric.precision ) )
27
27
  end )
28
28
 
29
29
  @dictionary.add_word( ['asin'],
30
30
  'Trig on reals and complexes',
31
31
  '( n -- m ) compute arg-sinus of n',
32
- RplProgram.new( '« dup abs 1 ==
32
+ Types.new_object( RplProgram, '« dup abs 1 ==
33
33
  « 𝛑 2 / * »
34
34
  « dup sq 1 swap - sqrt / atan »
35
35
  ifte »' ) )
@@ -40,12 +40,12 @@ module RplLang
40
40
  proc do
41
41
  args = stack_extract( [[RplNumeric]] )
42
42
 
43
- @stack << RplNumeric.new( BigMath.cos( BigDecimal( args[0].value, RplNumeric.precision ), RplNumeric.precision ) )
43
+ @stack << Types.new_object( RplNumeric, BigMath.cos( BigDecimal( args[0].value, RplNumeric.precision ), RplNumeric.precision ) )
44
44
  end )
45
45
  @dictionary.add_word( ['acos'],
46
46
  'Trig on reals and complexes',
47
47
  '( n -- m ) compute arg-cosinus of n',
48
- RplProgram.new( '« dup 0 ==
48
+ Types.new_object( RplProgram, '« dup 0 ==
49
49
  « drop 𝛑 2 / »
50
50
  «
51
51
  dup sq 1 swap - sqrt / atan
@@ -58,7 +58,7 @@ module RplLang
58
58
  @dictionary.add_word( ['tan'],
59
59
  'Trig on reals and complexes',
60
60
  '( n -- m ) compute tangent of n',
61
- RplProgram.new( '« dup sin swap cos / »' ) )
61
+ Types.new_object( RplProgram, '« dup sin swap cos / »' ) )
62
62
 
63
63
  @dictionary.add_word( ['atan'],
64
64
  'Trig on reals and complexes',
@@ -66,18 +66,18 @@ module RplLang
66
66
  proc do
67
67
  args = stack_extract( [[RplNumeric]] )
68
68
 
69
- @stack << RplNumeric.new( BigMath.atan( BigDecimal( args[0].value, RplNumeric.precision ), RplNumeric.precision ) )
69
+ @stack << Types.new_object( RplNumeric, BigMath.atan( BigDecimal( args[0].value, RplNumeric.precision ), RplNumeric.precision ) )
70
70
  end )
71
71
 
72
72
  @dictionary.add_word( ['d→r', 'd->r'],
73
73
  'Trig on reals and complexes',
74
74
  '( n -- m ) convert degree to radian',
75
- RplProgram.new( '« 180 / 𝛑 * »' ) )
75
+ Types.new_object( RplProgram, '« 180 / 𝛑 * »' ) )
76
76
 
77
77
  @dictionary.add_word( ['r→d', 'r->d'],
78
78
  'Trig on reals and complexes',
79
79
  '( n -- m ) convert radian to degree',
80
- RplProgram.new( '« 𝛑 180 / / »' ) )
80
+ Types.new_object( RplProgram, '« 𝛑 180 / / »' ) )
81
81
  end
82
82
  end
83
83
  end
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.6.0
4
+ version: 0.7.2
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-26 00:00:00.000000000 Z
11
+ date: 2022-03-09 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
@@ -62,7 +62,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
62
62
  - !ruby/object:Gem::Version
63
63
  version: '0'
64
64
  requirements: []
65
- rubygems_version: 3.2.32
65
+ rubygems_version: 3.3.7
66
66
  signing_key:
67
67
  specification_version: 4
68
68
  summary: Functional Stack Language