BOAST 0.9995 → 0.9996

Sign up to get free protection for your applications and to get access to all the features.
@@ -1,17 +1,42 @@
1
1
  module BOAST
2
+
3
+ module_function
4
+ def functorize(klass)
5
+ name = klass.name.split('::').last
6
+ s = <<EOF
7
+ def #{name}(*args,&block)
8
+ #{name}::new(*args,&block)
9
+ end
10
+
11
+ module_function :#{name}
12
+ EOF
13
+ eval s
14
+ end
15
+
16
+ def var_functorize(klass)
17
+ name = klass.name.split('::').last
18
+ s = <<EOF
19
+ def #{name}(*args,&block)
20
+ Variable::new(args[0],#{name},*args[1..-1], &block)
21
+ end
22
+
23
+ module_function :#{name}
24
+ EOF
25
+ eval s
26
+ end
2
27
 
3
28
  module Functor
4
29
 
5
- def parens(*args,&block)
6
- return self::new(*args,&block)
30
+ def self.extended(mod)
31
+ BOAST::functorize(mod)
7
32
  end
8
33
 
9
34
  end
10
35
 
11
36
  module VarFunctor
12
37
 
13
- def parens(*args,&block)
14
- return Variable::new(args[0], self, *args[1..-1], &block)
38
+ def self.extended(mod)
39
+ BOAST::var_functorize(mod)
15
40
  end
16
41
 
17
42
  end
data/lib/BOAST/If.rb CHANGED
@@ -1,8 +1,6 @@
1
1
  module BOAST
2
2
 
3
- class If < BOAST::ControlStructure
4
- include BOAST::Inspectable
5
- extend BOAST::Functor
3
+ class If < ControlStructure
6
4
 
7
5
  attr_reader :conditions
8
6
 
@@ -43,10 +41,10 @@ module BOAST
43
41
  }
44
42
 
45
43
  @@strings = {
46
- BOAST::C => @@c_strings,
47
- BOAST::CL => @@c_strings,
48
- BOAST::CUDA => @@c_strings,
49
- BOAST::FORTRAN => @@f_strings
44
+ C => @@c_strings,
45
+ CL => @@c_strings,
46
+ CUDA => @@c_strings,
47
+ FORTRAN => @@f_strings
50
48
  }
51
49
 
52
50
  eval token_string_generator( * %w{if cond} )
@@ -70,38 +68,38 @@ module BOAST
70
68
 
71
69
  def open
72
70
  s=""
73
- s += BOAST::indent
74
- s += self.to_s
75
- BOAST::get_output.puts s
76
- BOAST::increment_indent_level
71
+ s += indent
72
+ s += to_s
73
+ output.puts s
74
+ increment_indent_level
77
75
  return self
78
76
  end
79
77
 
80
- def print(*args)
78
+ def pr(*args)
81
79
  if @blocks.size > 0 then
82
- BOAST::increment_indent_level
80
+ increment_indent_level
83
81
  @blocks.each_index { |indx|
84
- BOAST::decrement_indent_level
82
+ decrement_indent_level
85
83
  s=""
86
- s += BOAST::indent
87
- s += self.to_s(indx)
88
- BOAST::get_output.puts s
89
- BOAST::increment_indent_level
84
+ s += indent
85
+ s += to_s(indx)
86
+ output.puts s
87
+ increment_indent_level
90
88
  @blocks[indx].call(*args)
91
89
  }
92
- self.close
90
+ close
93
91
  else
94
- self.open
92
+ open
95
93
  end
96
94
  return self
97
95
  end
98
96
 
99
97
  def close
100
- BOAST::decrement_indent_level
98
+ decrement_indent_level
101
99
  s = ""
102
- s += BOAST::indent
100
+ s += indent
103
101
  s += end_string
104
- BOAST::get_output.puts s
102
+ output.puts s
105
103
  return self
106
104
  end
107
105
 
data/lib/BOAST/Index.rb CHANGED
@@ -1,8 +1,9 @@
1
1
  module BOAST
2
+
2
3
  class Index < Expression
3
- include BOAST::Inspectable
4
4
  attr_reader :source
5
5
  attr_reader :indexes
6
+
6
7
  def initialize(source, indexes)
7
8
  @source = source
8
9
  @indexes = indexes
@@ -14,8 +15,8 @@ module BOAST
14
15
  end
15
16
 
16
17
  def to_s
17
- return self.to_s_fortran if BOAST::get_lang == FORTRAN
18
- return self.to_s_c if [C, CL, CUDA].include?( BOAST::get_lang )
18
+ return to_s_fortran if lang == FORTRAN
19
+ return to_s_c if [C, CL, CUDA].include?( lang )
19
20
  end
20
21
 
21
22
  def to_s_fortran
@@ -25,7 +26,7 @@ module BOAST
25
26
  end
26
27
 
27
28
  def to_s_texture
28
- raise "Unsupported language #{BOAST::get_lang} for texture!" if not [CL, CUDA].include?( BOAST::get_lang )
29
+ raise "Unsupported language #{lang} for texture!" if not [CL, CUDA].include?( lang )
29
30
  raise "Write is unsupported for textures!" if not ( @source.constant or @source.direction == :in )
30
31
  dim_number = 1
31
32
  if @source.dimension then
@@ -33,7 +34,7 @@ module BOAST
33
34
  end
34
35
  raise "Unsupported number of dimension: #{dim_number}!" if dim_number > 3
35
36
  s = ""
36
- if BOAST::get_lang == CL then
37
+ if lang == CL then
37
38
  s += "as_#{@source.type.decl}("
38
39
  s += "read_imageui(#{@source}, #{@source.sampler}, "
39
40
  if dim_number == 1 then
@@ -76,7 +77,7 @@ module BOAST
76
77
  if dim.val2 then
77
78
  start = dim.val1
78
79
  else
79
- start = BOAST::get_array_start
80
+ start = get_array_start
80
81
  end
81
82
  sub = "#{@indexes.first} - (#{start})"
82
83
  i=1
@@ -93,12 +94,12 @@ module BOAST
93
94
  if dim.val2 then
94
95
  start = dim.val1
95
96
  else
96
- start = BOAST::get_array_start
97
+ start = get_array_start
97
98
  end
98
99
  sub += " + (#{@indexes[i]} - (#{start}))"+ss
99
100
  i+=1
100
101
  }
101
- if BOAST::get_replace_constants then
102
+ if get_replace_constants then
102
103
  begin
103
104
  # puts sub
104
105
  indx = eval(sub)
@@ -112,12 +113,12 @@ module BOAST
112
113
  return s
113
114
  end
114
115
 
115
- def print
116
+ def pr
116
117
  s=""
117
- s += BOAST::indent
118
- s += self.to_s
119
- s += ";" if [C, CL, CUDA].include?( BOAST::get_lang )
120
- BOAST::get_output.puts s
118
+ s += indent
119
+ s += to_s
120
+ s += ";" if [C, CL, CUDA].include?( lang )
121
+ output.puts s
121
122
  return self
122
123
  end
123
124
 
@@ -1,25 +1,18 @@
1
1
  module BOAST
2
2
 
3
- @@inspect = false
4
-
5
- def self.inspect?
6
- return @@inspect
7
- end
8
-
9
- def self.inspect=(val)
10
- @@inspect = val
11
- end
3
+ boolean_state_accessor :boast_inspect
4
+ @@boast_inspect = false
12
5
 
13
6
  module Inspectable
14
7
 
15
8
  def inspect
16
- if BOAST::inspect? then
17
- variables = self.instance_variables.map{ |v|
9
+ if BOAST::boast_inspect? then
10
+ variables = instance_variables.map{ |v|
18
11
  instance_variable_get(v) ? "#{v}=#{instance_variable_get(v).inspect}" : nil
19
12
  }.reject{ |v| v.nil? }.join(", ")
20
- "#<#{self.class}:#{(self.object_id<<1).to_s(16)}#{variables == "" ? "" : " #{variables}" }>"
13
+ "#<#{self.class}:0x#{(self.object_id<<1).to_s(16)}#{variables == "" ? "" : " #{variables}" }>"
21
14
  else
22
- self.to_s
15
+ to_s
23
16
  end
24
17
  end
25
18
 
@@ -1,15 +1,17 @@
1
1
  module BOAST
2
2
 
3
3
  class Operator
4
+ extend PrivateStateAccessor
5
+
4
6
  def Operator.inspect
5
- return "#{self.name}"
7
+ return "#{name}"
6
8
  end
7
9
 
8
10
  def Operator.get_vector_name(type)
9
- case BOAST::get_architecture
11
+ case get_architecture
10
12
  when X86
11
13
  case type
12
- when BOAST::Int
14
+ when Int
13
15
  size = "#{type.size*8}"
14
16
  name = ""
15
17
  if type.total_size*8 > 64
@@ -26,7 +28,7 @@ module BOAST
26
28
  name += "u"
27
29
  end
28
30
  return name += size
29
- when BOAST::Real
31
+ when Real
30
32
  case type.size
31
33
  when 4
32
34
  return "ps" if type.vector_length > 1
@@ -38,13 +40,13 @@ module BOAST
38
40
  else
39
41
  raise "Undefined vector type!"
40
42
  end
41
- when BOAST::ARM
43
+ when ARM
42
44
  case type
43
- when BOAST::Int
45
+ when Int
44
46
  name = "#{ type.signed ? "s" : "u" }"
45
47
  name += "#{ type.size * 8}"
46
48
  return name
47
- when BOAST::Real
49
+ when Real
48
50
  return "f#{type.size*8}"
49
51
  else
50
52
  raise "Undefined vector type!"
@@ -55,8 +57,8 @@ module BOAST
55
57
  end
56
58
 
57
59
  def Operator.convert(arg, type)
58
- case BOAST::get_architecture
59
- when BOAST::X86
60
+ case get_architecture
61
+ when X86
60
62
  s1 = arg.type.total_size*8
61
63
  s2 = type.total_size*8
62
64
  n1 = get_vector_name(arg.type)
@@ -68,14 +70,14 @@ module BOAST
68
70
  elsif [s1, s2].max <= 512 then
69
71
  return "_mm512_cvt#{n1}_#{n2}( #{arg} )"
70
72
  end
71
- when BOAST::ARM
73
+ when ARM
72
74
  if type.class != arg.type.class then
73
75
  if type.size == arg.type.size then
74
76
  s = type.total_size*8
75
77
  n1 = get_vector_name(arg.type)
76
78
  n2 = get_vector_name(type)
77
79
  return "vcvt#{ s == 128 ? "q" : "" }_#{n2}_#{n1}( #{arg} )"
78
- elsif type.class == BOAST::Real then
80
+ elsif type.class == Real then
79
81
  intr = convert(arg, arg.type.copy(:size=>type.size))
80
82
  return convert(arg.copy(intr, :size => type.size ), type)
81
83
  else
@@ -84,9 +86,9 @@ module BOAST
84
86
  t2 = type.copy(:size => arg.type.size)
85
87
  n2 = get_vector_name( t2 )
86
88
  intr = "vcvt#{ s == 128 ? "q" : "" }_#{n2}_#{n1}( #{arg} )"
87
- return convert(BOAST::Variable::from_type(intr, t2), type)
89
+ return convert(Variable::from_type(intr, t2), type)
88
90
  end
89
- elsif type.class != BOAST::Real then
91
+ elsif type.class != Real then
90
92
  n = get_vector_name(arg.type)
91
93
  if type.size == arg.type.size then
92
94
  if type.signed == arg.type.signed then
@@ -108,19 +110,20 @@ module BOAST
108
110
  raise "Unsupported architecture!"
109
111
  end
110
112
  end
113
+
111
114
  end
112
115
 
113
- class BasicBinaryOperator < BOAST::Operator
116
+ class BasicBinaryOperator < Operator
114
117
 
115
118
  def BasicBinaryOperator.to_s(arg1, arg2, return_type)
116
119
  #puts "#{arg1.class} * #{arg2.class} : #{arg1} * #{arg2}"
117
- if BOAST::get_lang == BOAST::C and (arg1.class == BOAST::Variable and arg2.class == BOAST::Variable) and (arg1.type.vector_length > 1 or arg2.type.vector_length > 1) then
120
+ if lang == C and (arg1.class == Variable and arg2.class == Variable) and (arg1.type.vector_length > 1 or arg2.type.vector_length > 1) then
118
121
  raise "Vectors have different length: #{arg1} #{arg1.type.vector_length}, #{arg2} #{arg2.type.vector_length}" if arg1.type.vector_length != arg2.type.vector_length
119
122
  #puts "#{arg1.type.signed} #{arg2.type.signed} #{return_type.type.signed}"
120
123
  return_name = get_vector_name(return_type.type)
121
124
  size = return_type.type.total_size * 8
122
- case BOAST::get_architecture
123
- when BOAST::X86
125
+ case get_architecture
126
+ when X86
124
127
  if arg1.type != return_type.type
125
128
  a1 = convert(arg1, return_type.type)
126
129
  else
@@ -137,7 +140,7 @@ module BOAST
137
140
  end
138
141
  intr_name += "_#{intr_name_X86}_#{return_name}"
139
142
  return "#{intr_name}( #{a1}, #{a2} )"
140
- when BOAST::ARM
143
+ when ARM
141
144
  if arg1.type.class != return_type.type.class then
142
145
  a1 = convert(arg1, return_type.type)
143
146
  else
@@ -159,32 +162,33 @@ module BOAST
159
162
  return basic_usage( arg1, arg2 )
160
163
  end
161
164
  end
165
+
162
166
  end
163
167
 
164
- class Set < BOAST::Operator
168
+ class Set < Operator
165
169
 
166
170
  def Set.to_s(arg1, arg2, return_type)
167
- if BOAST::get_lang == BOAST::C then
168
- if arg1.class == BOAST::Variable and arg1.type.vector_length > 1 then
171
+ if lang == C then
172
+ if arg1.class == Variable and arg1.type.vector_length > 1 then
169
173
  if arg1.type == arg2.type then
170
174
  return basic_usage(arg1, arg2)
171
175
  elsif arg1.type.vector_length == arg2.type.vector_length then
172
176
  return "(#{arg1} = #{convert(arg2, arg1.type)})"
173
177
  elsif arg2.type.vector_length == 1 then
174
178
  size = arg1.type.total_size*8
175
- case BOAST::get_architecture
176
- when BOAST::ARM
179
+ case get_architecture
180
+ when ARM
177
181
  intr_name = "vmov"
178
182
  intr_name += "q" if size == 128
179
183
  intr_name += "_n_#{get_vector_name(arg1.type)}"
180
- when BOAST::X86
181
- return "(#{arg1} = _m_from_int64( #{a2} ))" if arg1.type.class == BOAST::Int and arg1.type.size == 8 and size == 64
184
+ when X86
185
+ return "(#{arg1} = _m_from_int64( #{a2} ))" if arg1.type.class == Int and arg1.type.size == 8 and size == 64
182
186
  intr_name = "_mm"
183
187
  if size > 128 then
184
188
  intr_name += "#{size}"
185
189
  end
186
190
  intr_name += "_set1_#{get_vector_name(arg1.type).gsub("u","")}"
187
- intr_name += "x" if arg1.type.class == BOAST::Int and arg1.type.size == 8
191
+ intr_name += "x" if arg1.type.class == Int and arg1.type.size == 8
188
192
  else
189
193
  raise "Unsupported architecture!"
190
194
  end
@@ -203,23 +207,27 @@ module BOAST
203
207
  def Set.basic_usage(arg1, arg2)
204
208
  return "(#{arg1} = #{arg2})"
205
209
  end
210
+
206
211
  end
207
212
 
208
- class Different < BOAST::Operator
213
+ class Different < Operator
214
+
209
215
  def Different.to_s(arg1, arg2, return_type)
210
216
  return basic_usage(arg1, arg2)
211
217
  end
212
218
 
213
219
  def Different.basic_usage(arg1, arg2)
214
- return "#{arg1} /= #{arg2}" if BOAST::get_lang == BOAST::FORTRAN
220
+ return "#{arg1} /= #{arg2}" if lang == FORTRAN
215
221
  return "#{arg1} != #{arg2}"
216
222
  end
223
+
217
224
  end
218
225
 
219
- class Affectation < BOAST::Operator
226
+ class Affectation < Operator
227
+
220
228
  def Affectation.to_s(arg1, arg2, return_type)
221
- if BOAST::get_lang == BOAST::C then
222
- if arg1.class == BOAST::Variable and arg1.type.vector_length > 1 then
229
+ if lang == C then
230
+ if arg1.class == Variable and arg1.type.vector_length > 1 then
223
231
  #puts "#{arg1.type.vector_length} #{arg2.type.vector_length}"
224
232
  if arg1.type == arg2.type then
225
233
  return basic_usage(arg1, arg2)
@@ -233,13 +241,13 @@ module BOAST
233
241
  else
234
242
  a2 = a2[1..-1]
235
243
  end
236
- case BOAST::get_architecture
237
- when BOAST::ARM
244
+ case get_architecture
245
+ when ARM
238
246
  intr_name = "vldl"
239
247
  intr_name += "q" if size == 128
240
248
  intr_name += "_#{get_vector_name(arg1.type)}"
241
- when BOAST::X86
242
- if arg1.type.class == BOAST::Int and size == 64 then
249
+ when X86
250
+ if arg1.type.class == Int and size == 64 then
243
251
  return "#{arg1} = _m_from_int64( *((int64_t * ) #{a2} ) )"
244
252
  end
245
253
  intr_name = "_mm"
@@ -247,7 +255,7 @@ module BOAST
247
255
  intr_name += "#{size}"
248
256
  end
249
257
  intr_name += "_load_"
250
- if arg1.type.class == BOAST::Int then
258
+ if arg1.type.class == Int then
251
259
  intr_name += "si#{size}"
252
260
  else
253
261
  intr_name += "#{get_vector_name(arg1.type)}"
@@ -259,7 +267,7 @@ module BOAST
259
267
  else
260
268
  raise "Unknown convertion between vectors of different length!"
261
269
  end
262
- elsif arg2.class == BOAST::Variable and arg2.type.vector_length > 1 then
270
+ elsif arg2.class == Variable and arg2.type.vector_length > 1 then
263
271
  size = arg2.type.total_size*8
264
272
  a1 = "#{arg1}"
265
273
  if a1[0] != "*" then
@@ -267,13 +275,13 @@ module BOAST
267
275
  else
268
276
  a1 = a1[1..-1]
269
277
  end
270
- case BOAST::get_architecture
271
- when BOAST::ARM
278
+ case get_architecture
279
+ when ARM
272
280
  intr_name = "vstl"
273
281
  intr_name += "q" if size == 128
274
282
  intr_name += "_#{get_vector_name(arg2.type)}"
275
- when BOAST::X86
276
- if arg2.type.class == BOAST::Int and size == 64 then
283
+ when X86
284
+ if arg2.type.class == Int and size == 64 then
277
285
  return " *((int64_t * ) #{a1}) = _m_to_int64( #{arg2} )"
278
286
  end
279
287
  intr_name = "_mm"
@@ -281,7 +289,7 @@ module BOAST
281
289
  intr_name += "#{size}"
282
290
  end
283
291
  intr_name += "_store_"
284
- if arg2.type.class == BOAST::Int then
292
+ if arg2.type.class == Int then
285
293
  intr_name += "si#{size}"
286
294
  else
287
295
  intr_name += "#{get_vector_name(arg2.type)}"
@@ -301,9 +309,11 @@ module BOAST
301
309
  def Affectation.basic_usage(arg1, arg2)
302
310
  return "#{arg1} = #{arg2}"
303
311
  end
312
+
304
313
  end
305
314
 
306
- class Multiplication < BOAST::BasicBinaryOperator
315
+ class Multiplication < BasicBinaryOperator
316
+
307
317
  class << self
308
318
 
309
319
  def symbol
@@ -323,9 +333,11 @@ module BOAST
323
333
  end
324
334
 
325
335
  end
336
+
326
337
  end
327
338
 
328
- class Addition < BOAST::BasicBinaryOperator
339
+ class Addition < BasicBinaryOperator
340
+
329
341
  class << self
330
342
 
331
343
  def symbol
@@ -345,9 +357,11 @@ module BOAST
345
357
  end
346
358
 
347
359
  end
360
+
348
361
  end
349
362
 
350
- class Substraction < BOAST::BasicBinaryOperator
363
+ class Substraction < BasicBinaryOperator
364
+
351
365
  class << self
352
366
 
353
367
  def symbol
@@ -367,9 +381,11 @@ module BOAST
367
381
  end
368
382
 
369
383
  end
384
+
370
385
  end
371
386
 
372
- class Division < BOAST::BasicBinaryOperator
387
+ class Division < BasicBinaryOperator
388
+
373
389
  class << self
374
390
 
375
391
  def symbol
@@ -389,27 +405,30 @@ module BOAST
389
405
  end
390
406
 
391
407
  end
408
+
392
409
  end
393
410
 
394
- class Minus < BOAST::Operator
411
+ class Minus < Operator
412
+
395
413
  def Minus.to_s(arg1, arg2, return_type)
396
414
  return " -(#{arg2})"
397
415
  end
416
+
398
417
  end
399
418
 
400
- class Not < BOAST::Operator
419
+ class Not < Operator
420
+
401
421
  def Not.to_s(arg1, arg2, return_type)
402
422
  return " ! #{arg2}"
403
423
  end
424
+
404
425
  end
405
426
 
406
427
  class Ternary
407
- include BOAST::Arithmetic
408
- include BOAST::Inspectable
409
-
410
- def self.parens(*args,&block)
411
- return self::new(*args,&block)
412
- end
428
+ extend Functor
429
+ include Arithmetic
430
+ include Inspectable
431
+ include PrivateStateAccessor
413
432
 
414
433
  attr_reader :operand1
415
434
  attr_reader :operand2
@@ -422,8 +441,8 @@ module BOAST
422
441
  end
423
442
 
424
443
  def to_s
425
- raise "Ternary operator unsupported in FORTRAN!" if BOAST::get_lang == BOAST::FORTRAN
426
- return self.to_s_c if [BOAST::C, BOAST::CL, BOAST::CUDA].include?( BOAST::get_lang )
444
+ raise "Ternary operator unsupported in FORTRAN!" if lang == FORTRAN
445
+ return to_s_c if [C, CL, CUDA].include?( lang )
427
446
  end
428
447
 
429
448
  def to_s_c
@@ -431,13 +450,15 @@ module BOAST
431
450
  s += "(#{@operand1} ? #{@operand2} : #{@operand3})"
432
451
  end
433
452
 
434
- def print
453
+ def pr
435
454
  s=""
436
- s += BOAST::indent
437
- s += self.to_s
438
- s += ";" if [BOAST::C, BOAST::CL, BOAST::CUDA].include?( BOAST::get_lang )
439
- BOAST::get_output.puts s
455
+ s += indent
456
+ s += to_s
457
+ s += ";" if [C, CL, CUDA].include?( lang )
458
+ output.puts s
440
459
  return self
441
460
  end
461
+
442
462
  end
463
+
443
464
  end
data/lib/BOAST/Parens.rb CHANGED
@@ -1,32 +1,11 @@
1
- class Object
2
- alias_method :orig_method_missing, :method_missing
3
-
4
- def method_missing(m, *a, &b)
5
- #puts "WARNING: unknown #{m}"
6
- s=nil
7
- klass = begin
8
- s = (self.is_a?(Module) ? self : self.class)
9
- s.const_get(m)
10
- rescue NameError
11
- end
12
-
13
- return klass.send(:parens, *a, &b) if klass.respond_to? :parens
14
-
15
- if s == BOAST then
16
- STDERR.puts "Warning unkwown function #{m} generated as BOAST::FuncCall!" if BOAST::debug
17
- return BOAST::FuncCall::new(m,*a,&b)
18
- end
19
-
20
- orig_method_missing m, *a, &b
21
- end
22
- end
23
-
24
1
  module BOAST
25
2
 
26
- def self.register_funccall(name)
3
+ module_function
4
+
5
+ def register_funccall(name)
27
6
  s =<<EOF
28
7
  def self.#{name}(*args)
29
- return BOAST::FuncCall("#{name}", *args)
8
+ return FuncCall("#{name}", *args)
30
9
  end
31
10
  EOF
32
11
  eval s
data/lib/BOAST/Pragma.rb CHANGED
@@ -1,8 +1,9 @@
1
1
  module BOAST
2
2
 
3
3
  class Pragma
4
- include BOAST::Inspectable
5
- extend BOAST::Functor
4
+ include PrivateStateAccessor
5
+ include Inspectable
6
+ extend Functor
6
7
 
7
8
  attr_reader :name
8
9
  attr_reader :options
@@ -14,7 +15,7 @@ module BOAST
14
15
 
15
16
  def to_s
16
17
  s = ""
17
- if BOAST::get_lang == FORTRAN then
18
+ if lang == FORTRAN then
18
19
  s += "$!"
19
20
  else
20
21
  s += "#pragma"
@@ -25,10 +26,10 @@ module BOAST
25
26
  return s
26
27
  end
27
28
 
28
- def print
29
+ def pr
29
30
  s=""
30
- s += self.to_s
31
- BOAST::get_output.puts s
31
+ s += to_s
32
+ output.puts s
32
33
  return self
33
34
  end
34
35
  end
@@ -0,0 +1,7 @@
1
+ module BOAST
2
+
3
+ def self.print(a)
4
+ a.pr
5
+ end
6
+
7
+ end