rpl 0.6.0 → 0.7.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: 473327f669ed4e0484a32f534efa52bcbfbb8521ebcad7fa4d38de35f6576972
4
- data.tar.gz: cd6d921d8f40edcd95a32d4af529d7435962c65f621fa7903cbee4a1fabcf07f
3
+ metadata.gz: 2cde98587c0d2ec81f1a6a6d9918b8f7b3ffa40c26959a58d97e7f6e6aef6ef3
4
+ data.tar.gz: a8aef5c02a2956265a862b3a2530cd972639c60055387adb2dd74c3785a71dc5
5
5
  SHA512:
6
- metadata.gz: 4db7ebbce26e2eb92cc4baaa0a35954f3de5e8129b28c348bd78d420109300ec988dc4d8ed27464e7455ba8103c6141ed084d6c63526651b982c712a52cd9413
7
- data.tar.gz: fbc27ef9008a261401d02bb69a86c4eff00861df9018d2af4a029aa69fbf21475436a67aa8066d23c4eb6ac01455944e2a567c4f18b36f121059b06c351ef903
6
+ metadata.gz: 4fc702e52d8c6d8089bb45cc251964056be1758aea579f3a798afcf404468a7ac754de90f2bb5eacc67c5d1f0489c65b3eb6ca0b3d38c3c0f0f8be54961ad44f
7
+ data.tar.gz: 83346cce2d900ca261932ceed751e268abc4cab1c5d37da2b198709a1823647d8fefd375f55adbc67b92ee2b3ed3d7c4e28c4fde30c9b8e1f213f275bfdffb7f
@@ -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.7
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,28 @@ 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
40
+ begin
41
+ @value = BigDecimal( value )
42
+ rescue ArgumentError
43
+ case value
44
+ when /^0x[0-9a-f]+$/
45
+ @base = 16
46
+ @value = /^0x(?<value>[0-9a-f]+)$/.match( value )['value'].to_i( @base )
47
+ when /^0o[0-7]+$/
48
+ @base = 8
49
+ @value = /^0o(?<value>[0-7]+)$/.match( value )['value'].to_i( @base )
50
+ when /^0b[0-1]+$/
51
+ @base = 2
52
+ @value = /^0b(?<value>[0-1]+)$/.match( value )['value'].to_i( @base )
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
+ @base = matches['base'].to_i
60
+ @value = matches['value'].to_i( @base )
60
61
  end
61
-
62
- value = value.to_i( @base ) unless @base == 10
63
- @value = BigDecimal( value, @@precision )
64
62
  end
65
63
  end
66
64
  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, "\"#{Time.now}\"" )
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}\"" )
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.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-26 00:00:00.000000000 Z
11
+ date: 2022-03-02 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