Skip to content

Make examples more didactic #6

@pmetras

Description

@pmetras

The examples are used as tests to validate the fork/join pattern, but they can be made more didactic for Pony learners.

For instance, all examples output the completion of the join by writing the result in the Collector finish function, but frequently one will need to get that result into the actor that initiated the fork/join process. So instead of printing the output in the Collector, having the example outputting the result in Main actor would show how the result can be sent back to the initiator.

Also, inserting Debug with digestof this into the functions of the three classes *Worker, *Generator and *Collector of the examples would show the users who run those examples in debug mode how the work is split between multiple actors and get collected at the end.

Sample for process-array.pony

class Adder is fj.Worker[Array[U8] iso, USize]
  var _working_set: Array[U8] = _working_set.create()

  fun ref receive(work_set: Array[U8] iso) =>
    Debug("Adder #" + (digestof this).string() + " receiving work to do")
    _working_set = consume work_set

  fun ref process(runner: fj.WorkerRunner[Array[U8] iso, USize] ref) =>
    Debug("Adder #" + (digestof this).string() + " doing work")
    var total: USize = 0

    for i in _working_set.values() do
      total = total + i.usize()
    end

    Debug("Adder #" + (digestof this).string() + " completed work")
    runner.deliver(total)

Last, adding how to use the word-count.pony example in case of launch error is more user friendly than reporting an error:

      env.exitcode(-1)
      env.err.print("Error during setup.")
      env.err.print("Usage: word-count <filename>")

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions