A Joyce programozási nyelv

Ágens eljárások

AgentProcedure = "agent" AgentName ProcedureBlock ";" .
ProcedureBlock = FormalParameterPart ";" ProcedureBody .
FormalParameterPart = [ "(" FormalParameterList ")" ] .
FormalParameterList = ParameterDefinition { ";" ParameterDefinition }.
ParameterDefinition = VariableName { "," VariableName } ":" TypeName .
ProcedureBody = [ ConstantDefinitionPart ] [ TypedefinitionPart ]
{ AgentProcedure } [ VariableDefinitionPart ] CompoundStatement .

A következő ágens eljárás
agent P(a1:T1; a2:T2; ... am:Tm);
...
begin SL end;

bevezeti a P elnevezést egy blokk jelölésére, amely ágensek egy osztályát definiálja. Ennek az osztálynak egy új ágense akkor aktiválódik, amikor egy másik ágens végrehajt egy olyan ágenshívást, amely a P eljárásra hivatkozik.
Az a1:T1; a2:T2; ... am:Tm formális paraméter lista az ágens formális paramétereit határozza meg. T1, T2, ..., Tm-nek ismert típusoknak kell lenniük.

Az ai:Ti paraméter definíció bevezeti az ai elnevezést egy Ti típusú formális paraméter jelölésére.

Az a1, a2, ..., aj: Tk paraméter definíció definiálja az a1, a2, ..., aj formális paramétereket, amelyeknek a típusa Tk.

Valójában minden formális paraméter egy lokális változó, amelyhez egy aktuális paraméter (egy kifejezés) értéke rendelődik, amikor az ágens aktiválódik.
Az új ágens az aktiválása után a következő két lépésben hajtja végre az eljárás törzsét:

  1. Az ágens végrehajtja az SL összetett utasítást.
  2. Az ágens megvárja, amíg az összes olyan ágens terminál, amelynek õ a létrehozója (ha van ilyen). Ekkor az ágens saját változói és belső csatornái megszűnnek, és az ágens terminál.

Példa
agent semaphore[x: integer; user: PV); begin while true do poll user?P & x > 0 -> x:= x - 1 | user?V -> x:= x + 1 end end;