Class: CEML::Engine
- Inherits:
-
Object
- Object
- CEML::Engine
- Defined in:
- lib/ceml/engine.rb
Instance Attribute Summary collapse
-
#parts ⇒ Object
readonly
Returns the value of attribute parts.
-
#script ⇒ Object
readonly
Returns the value of attribute script.
Instance Method Summary collapse
- #add(id, *roles) ⇒ Object
- #answered_q(q) ⇒ Object
- #ask_q(q) ⇒ Object
- #assign(a) ⇒ Object
- #complete_assign(a = nil) ⇒ Object
- #expand(role, var) ⇒ Object
- #finish ⇒ Object
- #got ⇒ Object
-
#initialize(script_text, delg = Dummy.new) ⇒ Engine
constructor
A new instance of Engine.
- #null_assign ⇒ Object
- #pc ⇒ Object
- #qs_answers ⇒ Object
- #recognized ⇒ Object
- #roles ⇒ Object
- #run ⇒ Object
- #say(x, params = {}) ⇒ Object
- #send_msg(a) ⇒ Object
- #seq ⇒ Object
-
#start ⇒ Object
= basic flow = ==============.
- #this ⇒ Object
Constructor Details
#initialize(script_text, delg = Dummy.new) ⇒ Engine
Returns a new instance of Engine.
18 19 20 21 22 23 |
# File 'lib/ceml/engine.rb', line 18 def initialize(script_text, delg = Dummy.new) @script = CEML.parse(:script, script_text) @delg = delg @parts = {} @seq = {} end |
Instance Attribute Details
#parts ⇒ Object (readonly)
Returns the value of attribute parts.
11 12 13 |
# File 'lib/ceml/engine.rb', line 11 def parts @parts end |
#script ⇒ Object (readonly)
Returns the value of attribute script.
11 12 13 |
# File 'lib/ceml/engine.rb', line 11 def script @script end |
Instance Method Details
#add(id, *roles) ⇒ Object
25 26 27 28 |
# File 'lib/ceml/engine.rb', line 25 def add(id, *roles) obj = Hash === roles[-1] ? roles.pop : {} parts[id] = obj.merge :roles => Set.new(roles) end |
#answered_q(q) ⇒ Object
100 101 102 103 104 |
# File 'lib/ceml/engine.rb', line 100 def answered_q q got or return false qs_answers[q.key] = got true end |
#ask_q(q) ⇒ Object
94 95 96 97 98 |
# File 'lib/ceml/engine.rb', line 94 def ask_q q text = q.interpolate(self) or return false say :ask, :q => text true end |
#assign(a) ⇒ Object
112 113 114 115 116 |
# File 'lib/ceml/engine.rb', line 112 def assign a text = a.interpolate(self) or return false say :assignment, :msg => text true end |
#complete_assign(a = nil) ⇒ Object
118 119 120 121 122 123 124 125 126 127 |
# File 'lib/ceml/engine.rb', line 118 def complete_assign a = nil got or return false if recognized == :done say :ok true else @delg.send :did_report false end end |
#expand(role, var) ⇒ Object
74 75 76 77 78 79 80 81 82 83 |
# File 'lib/ceml/engine.rb', line 74 def (role, var) role = nil if role == 'otherguy' role = role.to_sym if role parts.each do |key, thing| next if key == @current_id next if role and not thing[:roles].include? role value = (thing[:qs_answers]||{})[var] and return value end nil end |
#finish ⇒ Object
134 135 136 |
# File 'lib/ceml/engine.rb', line 134 def finish true end |
#got ⇒ Object
14 |
# File 'lib/ceml/engine.rb', line 14 def got; this[:received]; end |
#null_assign ⇒ Object
129 130 131 132 |
# File 'lib/ceml/engine.rb', line 129 def null_assign say :proceed true end |
#pc ⇒ Object
16 |
# File 'lib/ceml/engine.rb', line 16 def pc; this[:pc] ||= 0; end |
#qs_answers ⇒ Object
70 71 72 |
# File 'lib/ceml/engine.rb', line 70 def qs_answers this[:qs_answers] ||= Hash.new end |
#recognized ⇒ Object
15 |
# File 'lib/ceml/engine.rb', line 15 def recognized; this[:recognized]; end |
#roles ⇒ Object
13 |
# File 'lib/ceml/engine.rb', line 13 def roles; this[:roles] ||= Set.new; end |
#run ⇒ Object
30 31 32 33 34 35 36 37 |
# File 'lib/ceml/engine.rb', line 30 def run :loop while parts.keys.any? do |@current_id| # puts "trying: #{@current_id}: #{seq[pc]}" next unless seq[pc] and send(*seq[pc]) @delg.send(*seq[pc] + [@current_id]) this[:pc]+=1 end end |
#say(x, params = {}) ⇒ Object
65 66 67 68 |
# File 'lib/ceml/engine.rb', line 65 def say x, params = {} this[:said] = x this.merge! params end |
#send_msg(a) ⇒ Object
106 107 108 109 110 |
# File 'lib/ceml/engine.rb', line 106 def send_msg a text = a.interpolate(self) or return false say :message, :msg => text true end |
#seq ⇒ Object
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 |
# File 'lib/ceml/engine.rb', line 39 def seq @seq[roles] ||= begin bytecode = [[:start]] instrs = script.instructions_for(roles) instrs.each do |inst| case inst.cmd when :ask bytecode << [:ask_q, inst] bytecode << [:answered_q, inst] when :tell if script.title bytecode << [:assign, inst] bytecode << [:complete_assign, inst] else bytecode << [:send_msg, inst] end end end if instrs.empty? and script.title bytecode << [:null_assign] bytecode << [:complete_assign] end bytecode << [:finish] end end |
#start ⇒ Object
basic flow =
89 90 91 92 |
# File 'lib/ceml/engine.rb', line 89 def start roles.include? :agent or return false true end |
#this ⇒ Object
12 |
# File 'lib/ceml/engine.rb', line 12 def this; @parts[@current_id]; end |