[e-lang] [Fwd: Re: Proposal: E / Erlang integration]

Mark S. Miller markm@REDACTED
Fri Jun 9 06:08:40 CEST 2006


# David's code reformatted so it parses correctly. No substantive changes.
# David, what is B for? It is never used?


pragma.disable("explicit-result-guard")
pragma.enable("easy-return")

# Like the Erlang example, we don't handle errors.

# The hardware, which can be controlled asynchronously.
def lim {
     to startTone(tone :String) { "..." }
     to stopTone() { "..." }
     to startRinging() { "..." }
}

def makePOTS() {
     # Declare the states, to avoid forward references...
     def waiting
     def idle
     def getting_first_digit
     def ringing_B_side
     def calling_B
     def ringing_A_side
     def speech

     # The peer we are connecting to.
     var B := null

     # The number being dialed.
     var number :String := ""

     # Together with the match clause in the definition of pots below,
     # this is just a way to make a  process that has different behaviours
     # over time look like a single object.
     var state := idle
     def pots

     # Now define the states...

     # waiting is a dummy state used while we are waiting for the hardware.
     # (In a real example there would have to be a way of getting out of this
     # state if the hardware fails, but the Erlang code doesn't deal with that
     # either.)
     bind waiting {}

     bind idle {
         to offhook() {
             state := waiting
             when (lim <- startTone("dial")) -> {
                 state := getting_first_digit
             }
         }
         to digit() { # ignore
         }
         to requestConnection(peer) {
             # This is a literal interpretation of the Erlang code, but it is
             # not what should be done in E for security reasons -- the peer
             # should only get a facet, not full access to the pots object.
             peer <- accept(pots)
             state := waiting
             B := peer
             when (lim <- startRinging()) -> {
                 state := ringing_B_side
             }
         }
         # we don't need to match unexpected messages here, but we could.
     }

     bind getting_first_digit {
         to onhook() {
             state := waiting
             when (lim <- stopTone()) -> {
                 state := idle
             }
         }
         to digit(d) {
             state := waiting
             when (lim <- stopTone()) -> {
                 # the Erlang code seemed to be missing some context, but
                 # this is probably about right...
                 number := analyse(number, d, validSequences())
                 state := getting_number
             }
         }
         to requestConnection(peer) {
             # same security comment as above
             peer <- reject(pots)
         }
     }

     bind calling_B {
         to onhook() {
             state := idle
         }
         to digit(d) { # ignore
         }
         to accept(peer) {
             state := waiting
             B := peer
             when (lim <- startTone("ring")) -> {
                 state := ringing_A_side
             }
         }
         to reject(peer) {
             state := waiting
             peer := null
             when (lim <- startTone("busy")) -> {
                 state := wait_on_hook
             }
         }
         to requestConnection(peer) {
             # same security comment as above
             peer <- reject(pots)
         }
     }

     #...  more states, also not shown in Erlang code
     bind pots {
         match [verb, args] { E.call(state, verb, args) }
     }
     return pots
}



More information about the erlang-questions mailing list