fOOrth 0.6.6 → 0.6.11
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 +5 -5
- data/CODE_OF_CONDUCT.md +49 -0
- data/README.md +32 -1
- data/fOOrth.gemspec +3 -3
- data/integration/array_lib_tests.rb +10 -0
- data/integration/compile_lib_tests.rb +67 -1
- data/integration/exception_lib_tests.rb +4 -0
- data/integration/hash_lib_tests.rb +9 -0
- data/integration/numeric_lib_tests.rb +326 -321
- data/integration/procedure_lib_tests.rb +16 -0
- data/integration/queue_lib_tests.rb +2 -1
- data/integration/stack_lib_tests.rb +2 -1
- data/integration/stdio_lib_tests.rb +62 -0
- data/integration/string_lib_tests.rb +11 -0
- data/integration/thread_lib_tests.rb +19 -5
- data/lib/fOOrth.rb +0 -2
- data/lib/fOOrth/compiler/context.rb +64 -64
- data/lib/fOOrth/compiler/context/locals.rb +34 -34
- data/lib/fOOrth/compiler/context/map_name.rb +85 -74
- data/lib/fOOrth/compiler/context/tags.rb +60 -48
- data/lib/fOOrth/compiler/process/generate.rb +1 -1
- data/lib/fOOrth/compiler/process/procedure.rb +40 -0
- data/lib/fOOrth/compiler/word_specs.rb +3 -3
- data/lib/fOOrth/core/object.rb +1 -1
- data/lib/fOOrth/library.rb +3 -0
- data/lib/fOOrth/library/alias_library.rb +126 -0
- data/lib/fOOrth/library/array_library.rb +41 -21
- data/lib/fOOrth/library/command_library.rb +1 -1
- data/lib/fOOrth/library/compile_library.rb +266 -264
- data/lib/fOOrth/library/complex_library.rb +82 -80
- data/lib/fOOrth/library/float_library.rb +37 -0
- data/lib/fOOrth/library/formatting/array.rb +90 -0
- data/lib/fOOrth/library/formatting/bullets.rb +15 -79
- data/lib/fOOrth/library/formatting/columns.rb +20 -42
- data/lib/fOOrth/library/formatting/hash.rb +29 -0
- data/lib/fOOrth/library/formatting/nil.rb +13 -0
- data/lib/fOOrth/library/formatting/object.rb +18 -0
- data/lib/fOOrth/library/formatting/string.rb +46 -0
- data/lib/fOOrth/library/hash_library.rb +14 -6
- data/lib/fOOrth/library/introspection/class.rb +20 -18
- data/lib/fOOrth/library/introspection/context.rb +3 -2
- data/lib/fOOrth/library/introspection/object.rb +42 -20
- data/lib/fOOrth/library/introspection/string.rb +21 -5
- data/lib/fOOrth/library/introspection/vm.rb +17 -29
- data/lib/fOOrth/library/mutex_library.rb +8 -1
- data/lib/fOOrth/library/numeric_library.rb +359 -380
- data/lib/fOOrth/library/procedure_library.rb +69 -65
- data/lib/fOOrth/library/queue_library.rb +6 -1
- data/lib/fOOrth/library/rational_library.rb +89 -89
- data/lib/fOOrth/library/stack_library.rb +6 -1
- data/lib/fOOrth/library/stdio_library.rb +11 -8
- data/lib/fOOrth/library/string_library.rb +21 -6
- data/lib/fOOrth/library/stubs_library.rb +49 -0
- data/lib/fOOrth/monkey_patch/exceptions.rb +2 -6
- data/lib/fOOrth/monkey_patch/object.rb +7 -0
- data/lib/fOOrth/version.rb +1 -1
- data/reek.txt +1 -59
- data/sire.rb +0 -1
- data/tests/compiler/context_tests.rb +188 -177
- data/tests/compiler/file_source_tests.rb +130 -130
- data/tests/compiler/parser_tests.rb +4 -4
- data/tests/compiler/string_source_tests.rb +4 -4
- data/tests/core_tests.rb +138 -138
- data/tests/monkey_patch/complex_test.rb +24 -24
- data/tests/monkey_patch/object_test.rb +49 -49
- data/tests/monkey_patch/string_test.rb +61 -61
- metadata +20 -13
@@ -1,65 +1,69 @@
|
|
1
|
-
# coding: utf-8
|
2
|
-
|
3
|
-
#* library/procedure_library.rb - Proc support for the fOOrth library.
|
4
|
-
module XfOOrth
|
5
|
-
|
6
|
-
#Connect the Proc class to the fOOrth class system.
|
7
|
-
Proc.create_foorth_proxy('Procedure')
|
8
|
-
|
9
|
-
# A no operation place holder for procedure literals
|
10
|
-
|
11
|
-
|
12
|
-
#
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
# [
|
17
|
-
Proc.create_shared_method('.
|
18
|
-
&lambda {|vm|
|
19
|
-
|
20
|
-
# [
|
21
|
-
Proc.create_shared_method('.
|
22
|
-
&lambda {|vm|
|
23
|
-
|
24
|
-
# [
|
25
|
-
Proc.create_shared_method('.
|
26
|
-
&lambda {|vm|
|
27
|
-
|
28
|
-
# [
|
29
|
-
Proc.create_shared_method('.
|
30
|
-
&lambda {|vm|
|
31
|
-
|
32
|
-
# [procedure] .
|
33
|
-
Proc.create_shared_method('.
|
34
|
-
vm.
|
35
|
-
|
36
|
-
|
37
|
-
|
38
|
-
|
39
|
-
|
40
|
-
|
41
|
-
|
42
|
-
|
43
|
-
|
44
|
-
|
45
|
-
|
46
|
-
|
47
|
-
|
48
|
-
|
49
|
-
|
50
|
-
|
51
|
-
|
52
|
-
|
53
|
-
|
54
|
-
|
55
|
-
|
56
|
-
|
57
|
-
|
58
|
-
|
59
|
-
|
60
|
-
|
61
|
-
|
62
|
-
|
63
|
-
|
64
|
-
|
65
|
-
|
1
|
+
# coding: utf-8
|
2
|
+
|
3
|
+
#* library/procedure_library.rb - Proc support for the fOOrth library.
|
4
|
+
module XfOOrth
|
5
|
+
|
6
|
+
#Connect the Proc class to the fOOrth class system.
|
7
|
+
Proc.create_foorth_proxy('Procedure')
|
8
|
+
|
9
|
+
# A no operation place holder for procedure literals. This may seem odd but
|
10
|
+
# works because any word ending in '{{' is assumed to have a procedure literal
|
11
|
+
# attached to it. This is handled in compiler/process/procedure.rb. This code
|
12
|
+
# handles compiling the procedure and pushing a reference to it on the stack.
|
13
|
+
# Once this is done, this word need do nothing further so is a no-op.
|
14
|
+
VirtualMachine.create_shared_method('{{', MacroSpec, [:macro, " "])
|
15
|
+
|
16
|
+
# [procedure] .call [unspecified]
|
17
|
+
Proc.create_shared_method('.call', TosSpec, [],
|
18
|
+
&lambda {|vm| self.call(vm); })
|
19
|
+
|
20
|
+
# [owner procedure] .call_with [unspecified]
|
21
|
+
Proc.create_shared_method('.call_with', TosSpec, [],
|
22
|
+
&lambda {|vm| vm.pop.instance_exec(vm, &self); })
|
23
|
+
|
24
|
+
# [v procedure] .call_v [unspecified]
|
25
|
+
Proc.create_shared_method('.call_v', TosSpec, [],
|
26
|
+
&lambda {|vm| value = vm.pop; self.call(vm, value); })
|
27
|
+
|
28
|
+
# [x procedure] .call_x [unspecified]
|
29
|
+
Proc.create_shared_method('.call_x', TosSpec, [],
|
30
|
+
&lambda {|vm| index = vm.pop; self.call(vm, nil, index); })
|
31
|
+
|
32
|
+
# [v x procedure] .call_vx [unspecified]
|
33
|
+
Proc.create_shared_method('.call_vx', TosSpec, [],
|
34
|
+
&lambda {|vm| value, index = vm.popm(2); self.call(vm, value, index); })
|
35
|
+
|
36
|
+
# [procedure] .start [a_thread]
|
37
|
+
Proc.create_shared_method('.start', TosSpec, [], &lambda {|vm|
|
38
|
+
vm.push(self.do_thread_start(vm, '-'))
|
39
|
+
})
|
40
|
+
|
41
|
+
# [name procedure] .start_named [a_thread]
|
42
|
+
Proc.create_shared_method('.start_named', TosSpec, [], &lambda {|vm|
|
43
|
+
vm.push(self.do_thread_start(vm, vm.pop.to_s.freeze))
|
44
|
+
})
|
45
|
+
|
46
|
+
end
|
47
|
+
|
48
|
+
#A helper method in the Proc class for fOOrth threads.
|
49
|
+
class Proc
|
50
|
+
#Do the mechanics of starting a thread.
|
51
|
+
def do_thread_start(vm, vm_name)
|
52
|
+
block, interlock = self, Queue.new
|
53
|
+
|
54
|
+
result = Thread.new(vm.foorth_copy(vm_name)) do |vm_copy|
|
55
|
+
|
56
|
+
begin
|
57
|
+
self.foorth_init(vm_copy.compiler_reset.connect_vm_to_thread)
|
58
|
+
ensure
|
59
|
+
interlock.push(:ready)
|
60
|
+
end
|
61
|
+
|
62
|
+
vm_copy.instance_exec(vm_copy, &block)
|
63
|
+
end
|
64
|
+
|
65
|
+
interlock.pop
|
66
|
+
result
|
67
|
+
end
|
68
|
+
end
|
69
|
+
|
@@ -34,13 +34,18 @@ module XfOOrth
|
|
34
34
|
vm.push(self.empty?)
|
35
35
|
})
|
36
36
|
|
37
|
+
# [queue] .present? [a_boolean]
|
38
|
+
Queue.create_shared_method('.present?', TosSpec, [], &lambda {|vm|
|
39
|
+
vm.push(!self.empty?)
|
40
|
+
})
|
41
|
+
|
37
42
|
# [queue] .length [an_integer]
|
38
43
|
Queue.create_shared_method('.length', TosSpec, [], &lambda {|vm|
|
39
44
|
vm.push(self.length)
|
40
45
|
})
|
41
46
|
|
42
47
|
# [queue] .clear []
|
43
|
-
Queue.create_shared_method('.clear', TosSpec, [], &lambda {|vm|
|
48
|
+
Queue.create_shared_method('.clear!', TosSpec, [], &lambda {|vm|
|
44
49
|
self.clear
|
45
50
|
})
|
46
51
|
|
@@ -1,90 +1,90 @@
|
|
1
|
-
# coding: utf-8
|
2
|
-
|
3
|
-
#* library/rational_library.rb - Numeric support for the fOOrth library.
|
4
|
-
module XfOOrth
|
5
|
-
|
6
|
-
#Connect the Rational class to the fOOrth class system.
|
7
|
-
Rational.create_foorth_proxy
|
8
|
-
|
9
|
-
# Some conversion words.
|
10
|
-
# [n d] rational [n/d]
|
11
|
-
VirtualMachine.create_shared_method('rational', VmSpec, [], &lambda {|vm|
|
12
|
-
num,den = popm(2)
|
13
|
-
|
14
|
-
begin
|
15
|
-
push(Rational(num.to_foorth_r, den.to_foorth_r))
|
16
|
-
rescue
|
17
|
-
push(nil)
|
18
|
-
end
|
19
|
-
})
|
20
|
-
|
21
|
-
# Some conversion words.
|
22
|
-
# [n d] rational! [n/d]
|
23
|
-
VirtualMachine.create_shared_method('rational!', VmSpec, [], &lambda {|vm|
|
24
|
-
num,den = popm(2)
|
25
|
-
|
26
|
-
begin
|
27
|
-
push(Rational(num.to_foorth_r, den.to_foorth_r))
|
28
|
-
rescue
|
29
|
-
error "F40: Cannot coerce a #{num.foorth_name}, #{den.foorth_name} to a Rational"
|
30
|
-
end
|
31
|
-
})
|
32
|
-
|
33
|
-
# [err_limit float] .rationalize_to [rational]
|
34
|
-
Numeric.create_shared_method('.rationalize_to', TosSpec, [], &lambda {|vm|
|
35
|
-
err_limit = Float.foorth_coerce(vm.pop)
|
36
|
-
|
37
|
-
vm.push(self.rationalize(err_limit))
|
38
|
-
})
|
39
|
-
|
40
|
-
Complex.create_shared_method('.rationalize_to', TosSpec, [:stub])
|
41
|
-
|
42
|
-
# [rational] .split [numerator, denominator]
|
43
|
-
Rational.create_shared_method('.split', TosSpec, [],
|
44
|
-
&lambda {|vm| vm.push(self.numerator); vm.push(self.denominator); })
|
45
|
-
|
46
|
-
# [a] .to_r [n/d]
|
47
|
-
Object.create_shared_method('.to_r', TosSpec, [], &lambda {|vm|
|
48
|
-
begin
|
49
|
-
vm.push(Rational(self))
|
50
|
-
rescue
|
51
|
-
vm.push(nil)
|
52
|
-
end
|
53
|
-
})
|
54
|
-
|
55
|
-
# [a] .to_r! [n/d]
|
56
|
-
Object.create_shared_method('.to_r!', TosSpec, [], &lambda {|vm|
|
57
|
-
begin
|
58
|
-
vm.push(Rational(self))
|
59
|
-
rescue
|
60
|
-
error "F40: Cannot convert a #{self.foorth_name} to a Rational instance"
|
61
|
-
end
|
62
|
-
})
|
63
|
-
|
64
|
-
# [a_float] .to_r [n/d]
|
65
|
-
Float.create_shared_method('.to_r', TosSpec, [], &lambda {|vm|
|
66
|
-
begin
|
67
|
-
vm.push(self.rationalize)
|
68
|
-
rescue
|
69
|
-
vm.push(nil)
|
70
|
-
end
|
71
|
-
})
|
72
|
-
|
73
|
-
# [a_float] .to_r! [n/d]
|
74
|
-
Float.create_shared_method('.to_r!', TosSpec, [], &lambda {|vm|
|
75
|
-
begin
|
76
|
-
vm.push(self.rationalize)
|
77
|
-
rescue
|
78
|
-
error "F40: Cannot convert a #{self.foorth_name} to a Rational instance"
|
79
|
-
end
|
80
|
-
})
|
81
|
-
|
82
|
-
# [n/d] .numerator [n]
|
83
|
-
Numeric.create_shared_method('.numerator', TosSpec, [],
|
84
|
-
&lambda {|vm| vm.push(self.numerator); })
|
85
|
-
|
86
|
-
# [n/d] .denominator [d]
|
87
|
-
Numeric.create_shared_method('.denominator', TosSpec, [],
|
88
|
-
&lambda {|vm| vm.push(self.denominator); })
|
89
|
-
|
1
|
+
# coding: utf-8
|
2
|
+
|
3
|
+
#* library/rational_library.rb - Numeric support for the fOOrth library.
|
4
|
+
module XfOOrth
|
5
|
+
|
6
|
+
#Connect the Rational class to the fOOrth class system.
|
7
|
+
Rational.create_foorth_proxy
|
8
|
+
|
9
|
+
# Some conversion words.
|
10
|
+
# [n d] rational [n/d]
|
11
|
+
VirtualMachine.create_shared_method('rational', VmSpec, [], &lambda {|vm|
|
12
|
+
num,den = popm(2)
|
13
|
+
|
14
|
+
begin
|
15
|
+
push(Rational(num.to_foorth_r, den.to_foorth_r))
|
16
|
+
rescue
|
17
|
+
push(nil)
|
18
|
+
end
|
19
|
+
})
|
20
|
+
|
21
|
+
# Some conversion words.
|
22
|
+
# [n d] rational! [n/d]
|
23
|
+
VirtualMachine.create_shared_method('rational!', VmSpec, [], &lambda {|vm|
|
24
|
+
num,den = popm(2)
|
25
|
+
|
26
|
+
begin
|
27
|
+
push(Rational(num.to_foorth_r, den.to_foorth_r))
|
28
|
+
rescue
|
29
|
+
error "F40: Cannot coerce a #{num.foorth_name}, #{den.foorth_name} to a Rational"
|
30
|
+
end
|
31
|
+
})
|
32
|
+
|
33
|
+
# [err_limit float] .rationalize_to [rational]
|
34
|
+
Numeric.create_shared_method('.rationalize_to', TosSpec, [], &lambda {|vm|
|
35
|
+
err_limit = Float.foorth_coerce(vm.pop)
|
36
|
+
|
37
|
+
vm.push(self.rationalize(err_limit))
|
38
|
+
})
|
39
|
+
|
40
|
+
Complex.create_shared_method('.rationalize_to', TosSpec, [:stub])
|
41
|
+
|
42
|
+
# [rational] .split [numerator, denominator]
|
43
|
+
Rational.create_shared_method('.split', TosSpec, [],
|
44
|
+
&lambda {|vm| vm.push(self.numerator); vm.push(self.denominator); })
|
45
|
+
|
46
|
+
# [a] .to_r [n/d]
|
47
|
+
Object.create_shared_method('.to_r', TosSpec, [], &lambda {|vm|
|
48
|
+
begin
|
49
|
+
vm.push(Rational(self))
|
50
|
+
rescue
|
51
|
+
vm.push(nil)
|
52
|
+
end
|
53
|
+
})
|
54
|
+
|
55
|
+
# [a] .to_r! [n/d]
|
56
|
+
Object.create_shared_method('.to_r!', TosSpec, [], &lambda {|vm|
|
57
|
+
begin
|
58
|
+
vm.push(Rational(self))
|
59
|
+
rescue
|
60
|
+
error "F40: Cannot convert a #{self.foorth_name} to a Rational instance"
|
61
|
+
end
|
62
|
+
})
|
63
|
+
|
64
|
+
# [a_float] .to_r [n/d]
|
65
|
+
Float.create_shared_method('.to_r', TosSpec, [], &lambda {|vm|
|
66
|
+
begin
|
67
|
+
vm.push(self.rationalize)
|
68
|
+
rescue
|
69
|
+
vm.push(nil)
|
70
|
+
end
|
71
|
+
})
|
72
|
+
|
73
|
+
# [a_float] .to_r! [n/d]
|
74
|
+
Float.create_shared_method('.to_r!', TosSpec, [], &lambda {|vm|
|
75
|
+
begin
|
76
|
+
vm.push(self.rationalize)
|
77
|
+
rescue
|
78
|
+
error "F40: Cannot convert a #{self.foorth_name} to a Rational instance"
|
79
|
+
end
|
80
|
+
})
|
81
|
+
|
82
|
+
# [n/d] .numerator [n]
|
83
|
+
Numeric.create_shared_method('.numerator', TosSpec, [],
|
84
|
+
&lambda {|vm| vm.push(self.numerator); })
|
85
|
+
|
86
|
+
# [n/d] .denominator [d]
|
87
|
+
Numeric.create_shared_method('.denominator', TosSpec, [],
|
88
|
+
&lambda {|vm| vm.push(self.denominator); })
|
89
|
+
|
90
90
|
end
|
@@ -14,7 +14,7 @@ module XfOOrth
|
|
14
14
|
})
|
15
15
|
|
16
16
|
#Clear the Stack object.
|
17
|
-
stack.create_shared_method('.clear', TosSpec, [], &lambda {|vm|
|
17
|
+
stack.create_shared_method('.clear!', TosSpec, [], &lambda {|vm|
|
18
18
|
@data.clear
|
19
19
|
})
|
20
20
|
|
@@ -46,6 +46,11 @@ module XfOOrth
|
|
46
46
|
vm.push(@data.empty?)
|
47
47
|
})
|
48
48
|
|
49
|
+
#[stack] .present? [a_boolean]
|
50
|
+
stack.create_shared_method('.present?', TosSpec, [], &lambda {|vm|
|
51
|
+
vm.push(!@data.empty?)
|
52
|
+
})
|
53
|
+
|
49
54
|
#[stack] .length [an_integer]
|
50
55
|
stack.create_shared_method('.length', TosSpec, [], &lambda {|vm|
|
51
56
|
vm.push(@data.length)
|
@@ -1,6 +1,11 @@
|
|
1
1
|
# coding: utf-8
|
2
2
|
|
3
3
|
#Load up some pretty printing support.
|
4
|
+
require_relative 'formatting/nil'
|
5
|
+
require_relative 'formatting/object'
|
6
|
+
require_relative 'formatting/string'
|
7
|
+
require_relative 'formatting/array'
|
8
|
+
require_relative 'formatting/hash'
|
4
9
|
require_relative 'formatting/columns'
|
5
10
|
require_relative 'formatting/bullets'
|
6
11
|
|
@@ -65,7 +70,7 @@ module XfOOrth
|
|
65
70
|
|
66
71
|
symbol = :chars_per_line
|
67
72
|
$chars_per_line = [80]
|
68
|
-
SymbolMap.add_entry('$chars_per_line',
|
73
|
+
SymbolMap.add_entry('$chars_per_line', symbol)
|
69
74
|
$FOORTH_GLOBALS[symbol] = GlobalVarSpec.new('$chars_per_line', symbol, [])
|
70
75
|
|
71
76
|
#Show the page length.
|
@@ -86,24 +91,22 @@ module XfOOrth
|
|
86
91
|
|
87
92
|
# [ l 2 3 ... n ] .pp []; pretty print the array!
|
88
93
|
Array.create_shared_method('.pp', TosSpec, [], &lambda {|vm|
|
89
|
-
|
94
|
+
puts_foorth_columns($lines_per_page[0], $chars_per_line[0])
|
90
95
|
})
|
91
96
|
|
92
97
|
# [ l 2 3 ... n ] .format_columns []; format to strings with columns.
|
93
98
|
Array.create_shared_method('.format_columns', TosSpec, [], &lambda {|vm|
|
94
|
-
vm.push(
|
95
|
-
.map {|page| page << ""}
|
96
|
-
.flatten[0...-1])
|
99
|
+
vm.push(format_foorth_columns($lines_per_page[0], $chars_per_line[0]))
|
97
100
|
})
|
98
101
|
|
99
102
|
# [ l 2 3 ... n ] .print_columns []; pretty print columns.
|
100
103
|
Array.create_shared_method('.print_columns', TosSpec, [], &lambda {|vm|
|
101
|
-
|
104
|
+
puts_foorth_columns($lines_per_page[0], $chars_per_line[0])
|
102
105
|
})
|
103
106
|
|
104
107
|
#[["1" "stuff"] ["two" stuff] .format_bullets; format to strings with bullets.
|
105
108
|
Array.create_shared_method('.format_bullets', TosSpec, [], &lambda {|vm|
|
106
|
-
vm.push(
|
109
|
+
vm.push(foorth_format_bullets($chars_per_line[0]))
|
107
110
|
})
|
108
111
|
|
109
112
|
#[["1" "stuff"] ["two" stuff] .print_bullets; pretty print bullet points.
|
@@ -113,7 +116,7 @@ module XfOOrth
|
|
113
116
|
|
114
117
|
#{ "1" "stuff" -> "two" "stuff" -> } .format_bullets; format to strings with bullets.
|
115
118
|
Hash.create_shared_method('.format_bullets', TosSpec, [], &lambda {|vm|
|
116
|
-
vm.push(
|
119
|
+
vm.push(foorth_format_bullets($chars_per_line[0]))
|
117
120
|
})
|
118
121
|
|
119
122
|
#{ "1" "stuff" -> "two" "stuff" -> } .print_bullets; pretty print bullet points.
|
@@ -211,33 +211,48 @@ module XfOOrth
|
|
211
211
|
|
212
212
|
# ['fgh' 'abcdefgh'] .right? [boolean]
|
213
213
|
String.create_shared_method('.right?', TosSpec, [],
|
214
|
-
&lambda {|vm| vm.poke(self.end_with?(vm.peek))
|
214
|
+
&lambda {|vm| vm.poke(self.end_with?(vm.peek)) })
|
215
215
|
|
216
216
|
#Other String Methods
|
217
217
|
|
218
218
|
# ['cde' 'abcdefgh'] .contains? [boolean]
|
219
219
|
String.create_shared_method('.contains?', TosSpec, [],
|
220
|
-
&lambda {|vm| vm.poke(self.index(vm.peek).to_foorth_b)
|
220
|
+
&lambda {|vm| vm.poke(self.index(vm.peek).to_foorth_b) })
|
221
221
|
|
222
222
|
# ['cde' 'abcdefgh'] .posn [position or nil]
|
223
223
|
String.create_shared_method('.posn', TosSpec, [],
|
224
|
-
&lambda {|vm| vm.poke(self.index(vm.peek))
|
224
|
+
&lambda {|vm| vm.poke(self.index(vm.peek)) })
|
225
225
|
|
226
226
|
# ["a"] .length [n]
|
227
227
|
String.create_shared_method('.length', TosSpec, [],
|
228
228
|
&lambda {|vm| vm.push(self.length); })
|
229
229
|
|
230
|
+
# ["a"] .empty? [a_boolean]
|
231
|
+
String.create_shared_method('.empty?', TosSpec, [],
|
232
|
+
&lambda {|vm| vm.push(self.empty?) })
|
233
|
+
|
234
|
+
# ["a"] .present? [a_boolean]
|
235
|
+
String.create_shared_method('.present?', TosSpec, [],
|
236
|
+
&lambda {|vm| vm.push(!self.empty?) })
|
237
|
+
|
238
|
+
# ["a"] .clear! [a_boolean]
|
239
|
+
StringBuffer.create_shared_method('.clear!', TosSpec, [],
|
240
|
+
&lambda {|vm| self.clear })
|
241
|
+
|
230
242
|
# ["b", a] + ["ba"]; "ba" is a new object, distinct from "b"
|
231
243
|
String.create_shared_method('+', NosSpec, [],
|
232
244
|
&lambda {|vm| vm.poke((self + vm.peek.to_s).freeze) })
|
233
245
|
|
246
|
+
# ["b", a] << [error]; Bug patch. Not fully understood.
|
247
|
+
String.create_shared_method('<<', NosSpec, [:stub])
|
248
|
+
|
234
249
|
# ["b"*, a] << ["ba"*]; "ba"* is the same object as "b"*
|
235
250
|
StringBuffer.create_shared_method('<<', NosSpec, [],
|
236
251
|
&lambda {|vm| vm.poke(self << vm.peek.to_s); })
|
237
252
|
|
238
253
|
# ["b"*, a] >> ["ab"*]; "ab"* is the same object as "b"*
|
239
254
|
StringBuffer.create_shared_method('>>', NosSpec, [],
|
240
|
-
&lambda {|vm| vm.poke(self.prepend(vm.peek.to_s))
|
255
|
+
&lambda {|vm| vm.poke(self.prepend(vm.peek.to_s)) })
|
241
256
|
|
242
257
|
# ["b", n] * ["bbb..."]
|
243
258
|
String.create_shared_method('*', NosSpec, [], &lambda {|vm|
|
@@ -267,7 +282,7 @@ module XfOOrth
|
|
267
282
|
|
268
283
|
# ["stressed"] .reverse ["desserts"]
|
269
284
|
String.create_shared_method('.reverse', TosSpec, [],
|
270
|
-
&lambda {|vm| vm.push(self.to_s.reverse.freeze)
|
285
|
+
&lambda {|vm| vm.push(self.to_s.reverse.freeze) })
|
271
286
|
|
272
287
|
# ["stressed"*] .reverse* [] #Reverse the string in place.
|
273
288
|
StringBuffer.create_shared_method('.reverse*', TosSpec, [],
|
@@ -318,7 +333,7 @@ module XfOOrth
|
|
318
333
|
|
319
334
|
# [a_string] .shell []
|
320
335
|
String.create_shared_method('.shell', TosSpec, [], &lambda {|vm|
|
321
|
-
system(self)
|
336
|
+
system(self.chomp + "\n")
|
322
337
|
})
|
323
338
|
|
324
339
|
# [a_string] .shell_out [a_string]
|