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 +4 -4
- data/lib/rpl/interpreter.rb +1 -1
- data/lib/rpl/parser.rb +6 -6
- data/lib/rpl/types/numeric.rb +35 -37
- data/lib/rpl/types.rb +11 -0
- data/lib/rpl/words/branch.rb +3 -3
- data/lib/rpl/words/filesystem.rb +2 -2
- data/lib/rpl/words/general.rb +30 -4
- data/lib/rpl/words/logarithm.rb +1 -1
- data/lib/rpl/words/mode.rb +1 -1
- data/lib/rpl/words/operations.rb +3 -3
- data/lib/rpl/words/stack.rb +5 -5
- data/lib/rpl/words/store.rb +7 -19
- data/lib/rpl/words/string-list.rb +8 -8
- data/lib/rpl/words/test.rb +12 -12
- data/lib/rpl/words/time-date.rb +3 -3
- data/lib/rpl/words/trig.rb +9 -9
- metadata +3 -3
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 14743c6b30b8c1cccd4d1147b75062f239f6bde4e90704f3e3e12f7040997165
|
4
|
+
data.tar.gz: 7081e6d58e3066f148379b4e091e0de9e955f6c821a47857d28e466f56bfb782
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: d315a8b60972828ed69369f1ac17150357430e5066629ec88c3c16bc97e8c9d2cffaf3323f9526c86ea32a8a052b53887e61ca328a178dee19bf0eec88e8cd0b
|
7
|
+
data.tar.gz: 631502e4025f34fbcd7355922e2c6b2d77af8b326b4b2900c8cb12a2ac9824e44a5c7bc52ceff8f1b2130e82220864d76ecc90110dc02a942f9795a19466a35d
|
data/lib/rpl/interpreter.rb
CHANGED
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
|
-
|
73
|
+
Types.new_object( RplBoolean, element )
|
74
74
|
elsif RplNumeric.can_parse?( element )
|
75
|
-
|
75
|
+
Types.new_object( RplNumeric, element )
|
76
76
|
elsif RplList.can_parse?( element )
|
77
|
-
|
77
|
+
Types.new_object( RplList, element )
|
78
78
|
elsif RplString.can_parse?( element )
|
79
|
-
|
79
|
+
Types.new_object( RplString, element )
|
80
80
|
elsif RplProgram.can_parse?( element )
|
81
|
-
|
81
|
+
Types.new_object( RplProgram, element )
|
82
82
|
elsif RplName.can_parse?( element )
|
83
|
-
|
83
|
+
Types.new_object( RplName, element )
|
84
84
|
end
|
85
85
|
end
|
86
86
|
end
|
data/lib/rpl/types/numeric.rb
CHANGED
@@ -37,30 +37,29 @@ module Types
|
|
37
37
|
when Float
|
38
38
|
@value = BigDecimal( value, @@precision )
|
39
39
|
when String
|
40
|
-
|
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
|
-
"
|
78
|
+
"#{@base}b"
|
80
79
|
end
|
81
80
|
|
82
|
-
if @value.infinite?
|
83
|
-
|
84
|
-
|
85
|
-
|
86
|
-
|
87
|
-
|
88
|
-
|
89
|
-
|
90
|
-
|
91
|
-
|
92
|
-
|
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?(/^
|
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
|
data/lib/rpl/words/branch.rb
CHANGED
@@ -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
|
-
|
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 <<
|
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 <<
|
45
|
+
@stack << Types.new_object( RplNumeric, counter )
|
46
46
|
|
47
47
|
run( args[2].value )
|
48
48
|
end
|
data/lib/rpl/words/filesystem.rb
CHANGED
@@ -16,13 +16,13 @@ module RplLang
|
|
16
16
|
|
17
17
|
path = File.absolute_path( args[0].value )
|
18
18
|
|
19
|
-
@stack <<
|
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
|
-
|
25
|
+
Types.new_object( RplProgram, '« fread eval »' ) )
|
26
26
|
|
27
27
|
@dictionary.add_word( ['fwrite'],
|
28
28
|
'Filesystem',
|
data/lib/rpl/words/general.rb
CHANGED
@@ -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 <<
|
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
|
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
|
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
|
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',
|
data/lib/rpl/words/logarithm.rb
CHANGED
@@ -12,7 +12,7 @@ module RplLang
|
|
12
12
|
'Logs on reals and complexes',
|
13
13
|
'( … -- ℇ ) push ℇ',
|
14
14
|
proc do
|
15
|
-
@stack <<
|
15
|
+
@stack << Types.new_object( RplNumeric, BigMath.E( RplNumeric.precision ) )
|
16
16
|
end )
|
17
17
|
|
18
18
|
# @dictionary.add_word( ['ln'],
|
data/lib/rpl/words/mode.rb
CHANGED
data/lib/rpl/words/operations.rb
CHANGED
@@ -57,12 +57,12 @@ module RplLang
|
|
57
57
|
args[0]
|
58
58
|
else
|
59
59
|
if args[1].instance_of?( RplString )
|
60
|
-
|
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
|
-
|
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 <<
|
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'],
|
data/lib/rpl/words/stack.rb
CHANGED
@@ -20,7 +20,7 @@ module RplLang
|
|
20
20
|
@dictionary.add_word( ['drop'],
|
21
21
|
'Stack',
|
22
22
|
'( a -- ) drop first stack element',
|
23
|
-
|
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
|
-
|
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
|
-
|
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 <<
|
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
|
-
|
145
|
+
Types.new_object( RplProgram, '« 2 pick »' ) )
|
146
146
|
end
|
147
147
|
end
|
148
148
|
end
|
data/lib/rpl/words/store.rb
CHANGED
@@ -42,7 +42,7 @@ module RplLang
|
|
42
42
|
'Store',
|
43
43
|
'( -- […] ) list variables',
|
44
44
|
proc do
|
45
|
-
@stack <<
|
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
|
-
|
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
|
-
|
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
|
-
|
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
|
-
|
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
|
-
|
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
|
-
|
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 <<
|
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 <<
|
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 <<
|
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 <<
|
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 <<
|
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 <<
|
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 <<
|
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 <<
|
113
|
+
@stack << Types.new_object( RplString, "\"#{elt}\"" )
|
114
114
|
end
|
115
115
|
end )
|
116
116
|
|
data/lib/rpl/words/test.rb
CHANGED
@@ -14,7 +14,7 @@ module RplLang
|
|
14
14
|
proc do
|
15
15
|
args = stack_extract( %i[any any] )
|
16
16
|
|
17
|
-
@stack <<
|
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 <<
|
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 <<
|
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 <<
|
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 <<
|
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 <<
|
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 <<
|
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 <<
|
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 <<
|
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 <<
|
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 <<
|
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 <<
|
112
|
+
@stack << Types.new_object( RplBoolean, false )
|
113
113
|
end )
|
114
114
|
end
|
115
115
|
end
|
data/lib/rpl/words/time-date.rb
CHANGED
@@ -14,13 +14,13 @@ module RplLang
|
|
14
14
|
'Time and date',
|
15
15
|
'( -- t ) push current time',
|
16
16
|
proc do
|
17
|
-
@stack <<
|
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 <<
|
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 <<
|
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
|
data/lib/rpl/words/trig.rb
CHANGED
@@ -14,7 +14,7 @@ module RplLang
|
|
14
14
|
'Trig on reals and complexes',
|
15
15
|
'( … -- 𝛑 ) push 𝛑',
|
16
16
|
proc do
|
17
|
-
@stack <<
|
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 <<
|
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
|
-
|
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 <<
|
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
|
-
|
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
|
-
|
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 <<
|
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
|
-
|
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
|
-
|
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.
|
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-
|
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.
|
65
|
+
rubygems_version: 3.3.7
|
66
66
|
signing_key:
|
67
67
|
specification_version: 4
|
68
68
|
summary: Functional Stack Language
|