Method: Eggshell::ExpressionEvaluator.op_eval

Defined in:
lib/eggshell/expression-evaluator.rb

.op_eval(lop, op, rop) ⇒ Object



305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
# File 'lib/eggshell/expression-evaluator.rb', line 305

def self.op_eval(lop, op, rop)
	#$stderr.write "op_eval:\n\t#{lop.inspect} #{op.inspect} #{rop.inspect}\n"
	if (lop.is_a?(Numeric) && rop.is_a?(Numeric))
		if op == OP_MATCH || op == OP_NMATCH
			raise Exception.new("'#{op}' can only be used with strings -- #{lop} #{op} #{rop}")
		end
		return lop.send(op, rop)
	elsif op == OP_EQQ
		return lop === rop
	elsif rop == :empty && (op == OP_EQ || op == OP_NEQ)
		# essentially (lop == false || lop == nil || lop == '') [==|!=] true
		# @todo other conditions to check empty?
		return (lop == false || lop == nil || lop == '').send(op, true)
	elsif lop.is_a?(String)
		e = nil
		if op == OP_MULTIPLY
			if rop.is_a?(Numeric)
				return lop * rop
			else
				e = "multiply string with numeric, #{rop.class} given"
			end
		elsif op == OP_MATCH || op == OP_NMATCH
			if rop.is_a?(String)
				m = lop.match(rop)
				if op == OP_NMATCH
					m = m == nil ? true : false
				end
				return m
			else
				e = "'#{op}' expects right operand to be string, #{rop.class} given"
			end
		elsif op == OP_ADD
			return lop + rop
		end
				
		raise Exception.new(e) if e
	elsif lop.is_a?(Array)
		if op == OP_MULTIPLY && rop.is_a?(Numeric)
			return lop * rop
		elsif (op == OP_ADD || op == OP_SUBTRACT) && rop.is_a?(Array)
			return lop.send(op, rop)
		end
		raise Exception.new("unsupported operation: #{lop.class} #{op} #{rop.class}")
	else
		
	end
end