Class: CEML::Engine

Inherits:
Object
  • Object
show all
Defined in:
lib/ceml/engine.rb

Instance Attribute Summary collapse

Instance Method Summary collapse

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

#partsObject (readonly)

Returns the value of attribute parts.



11
12
13
# File 'lib/ceml/engine.rb', line 11

def parts
  @parts
end

#scriptObject (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 expand(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

#finishObject



134
135
136
# File 'lib/ceml/engine.rb', line 134

def finish
  true
end

#gotObject



14
# File 'lib/ceml/engine.rb', line 14

def got;        this[:received];   end

#null_assignObject



129
130
131
132
# File 'lib/ceml/engine.rb', line 129

def null_assign
  say :proceed
  true
end

#pcObject



16
# File 'lib/ceml/engine.rb', line 16

def pc;         this[:pc] ||= 0;   end

#qs_answersObject



70
71
72
# File 'lib/ceml/engine.rb', line 70

def qs_answers
  this[:qs_answers] ||= Hash.new
end

#recognizedObject



15
# File 'lib/ceml/engine.rb', line 15

def recognized; this[:recognized]; end

#rolesObject



13
# File 'lib/ceml/engine.rb', line 13

def roles;      this[:roles] ||= Set.new; end

#runObject



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

#seqObject



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

#startObject

basic flow =



89
90
91
92
# File 'lib/ceml/engine.rb', line 89

def start
  roles.include? :agent or return false
  true
end

#thisObject



12
# File 'lib/ceml/engine.rb', line 12

def this;       @parts[@current_id]; end