[#72642] Advantages of Symbols over constants — Marek Janukowicz <childNOSPAM@...17.ds.pwr.wroc.pl>

11 messages 2003/06/01

[#72732] case of sub! not working — Ian Macdonald <ian@...>

Hi,

27 messages 2003/06/03
[#72734] Re: case of sub! not working — Joel VanderWerf <vjoel@...> 2003/06/03

Ian Macdonald wrote:

[#72744] Re: case of sub! not working — Ian Macdonald <ian@...> 2003/06/03

On Tue 03 Jun 2003 at 10:21:43 +0900, Joel VanderWerf wrote:

[#72769] Re: case of sub! not working — Michael Campbell <michael_s_campbell@...> 2003/06/03

[#72907] Syck 0.35 + YAML.rb 0.60 -- the 1st stable release — why the lucky stiff <ruby-talk@...>

Pleased to announce:

18 messages 2003/06/05
[#75182] Re: Syck 0.35 + YAML.rb 0.60 -- the 1st stable release — Richard Zidlicky <rz@...68k.org> 2003/07/04

On Fri, Jun 06, 2003 at 06:15:58AM +0900, why the lucky stiff wrote:

[#72908] Problem with "require" stmt in "test-first " tutorial — RLMuller@... (Richard)

Hi All,

27 messages 2003/06/05

[#72940] VAPOR 0.06, Transparent Persistence to PostgreSQL — "Oliver M. Bolzer" <oliver@...>

Hi!

22 messages 2003/06/06

[#72975] join block — "Simon Strandgaard" <0bz63fz3m1qt3001@...>

29 messages 2003/06/06

[#72986] multiple blocks or proc arguments to method — itsme213@... (you CAN teach an old dog ...)

I was trying to write a collect_if method:

11 messages 2003/06/07

[#73081] requiring standard libs with save level 1 — Eugene Scripnik <Eugene.Scripnik@...>

I've set up new version of Ruby from CVS and my programs failed to work.

13 messages 2003/06/09
[#73114] Re: requiring standard libs with save level 1 — matz@... (Yukihiro Matsumoto) 2003/06/09

Hi,

[#73134] tcltklib does not get compiled. — John Fletcher <J.P.Fletcher@...>

I have installed ruby 1.6.7 on two computers using Red Hat 8.0 Linux.

14 messages 2003/06/10

[#73148] OT: Regexp question — Dominik Werder <dwerder@...>

Hi all,

25 messages 2003/06/10

[#73215] Rubyx (provisionally named) linux distro. Made by and run by Ruby — Andrew Walrond <andrew@...>

I have developed a little script which creates a simple linux distro

38 messages 2003/06/11

[#73260] Multiple Initialize methods? — "Nick" <nick.robinson@...>

Hi,

21 messages 2003/06/11

[#73283] Ruby advantages over Perl — Marek Janukowicz <childNOSPAM@...17.ds.pwr.wroc.pl>

68 messages 2003/06/11
[#73374] Re: Ruby advantages over Perl — Jason Creighton <androflux@...> 2003/06/12

On Thu, 12 Jun 2003 17:56:02 +0900

[#73356] does each work on a copy? — Rasputin <rasputin@...>

17 messages 2003/06/12

[#73372] Reason for implicit block syntax ? — itsme213@... (you CAN teach an old dog ...)

What is the reason for the implicit block in Ruby invocations?

13 messages 2003/06/12

[#73463] Hispeed String concat — Dominik Werder <dwerder@...>

What is the fastest way to add many small Strings to a big buffer?

17 messages 2003/06/13

[#73503] RaaInstallInRuby petition — ptkwt@...1.aracnet.com (Phil Tomson)

18 messages 2003/06/13

[#73555] I need a code beautifier or formatter — joaopedrosa@... (Joao Pedrosa)

Hello,

13 messages 2003/06/14

[#73600] Get songtitle from Winamp — calvin8@... (Andi Scharfstein)

Hi,

26 messages 2003/06/15
[#73601] Re: Get songtitle from Winamp — Daniel Carrera <dcarrera@...> 2003/06/15

-----BEGIN PGP SIGNED MESSAGE-----

[#73602] Re: Get songtitle from Winamp — Chad Fowler <chadfowler@...> 2003/06/15

It's a Win32API convention meaning "Window Handle".

[#73603] Re: Get songtitle from Winamp — Daniel Carrera <dcarrera@...> 2003/06/15

-----BEGIN PGP SIGNED MESSAGE-----

[#73605] Re: Get songtitle from Winamp — Wesley J Landaker <wjl@...> 2003/06/15

On Sunday 15 June 2003 9:34 am, Daniel Carrera wrote:

[#73609] Re: Get songtitle from Winamp — Daniel Carrera <dcarrera@...> 2003/06/15

-----BEGIN PGP SIGNED MESSAGE-----

[#73640] Standardizing Installers — Tom Clarke <tom@...2i.com>

I was thinking about some of the issues raised involving ruby libraries

16 messages 2003/06/16

[#73663] /BEGIN/ .. /END/ file reading — Wild Karl-Heinz <kh.wild@...>

hello

15 messages 2003/06/16
[#73674] Re: /BEGIN/ .. /END/ file reading — "Robert Klemme" <bob.news@...> 2003/06/16

[#73677] Re: /BEGIN/ .. /END/ file reading — Michael Campbell <michael_s_campbell@...> 2003/06/16

> A range operator with a regexp works like a flip flop (bistable

[#73680] Multiline comments? — "Christoph Tapler" <christoph.tapler@...>

I'm new to Ruby and I'm wondering that there is no possibility to write

38 messages 2003/06/16

[#73781] editor / ide recommentation on Windows — itsme213@... (you CAN teach an old dog ...)

What editor / ide would you recommend for serious Ruby work on

20 messages 2003/06/17

[#73787] Array#push(empty array expanded) => no exception — "Simon Strandgaard" <0bz63fz3m1qt3001@...>

This strange behavier really surprised me..

13 messages 2003/06/17

[#73821] European Ruby Conference — "Hal E. Fulton" <hal9000@...>

I don't think I've mentioned this before, but I

15 messages 2003/06/17

[#73924] Re: TCP/IP protocol and Net::HTTP — "J.Hawkesworth" <J.Hawkesworth@...>

Works for me too.

13 messages 2003/06/19
[#73931] Re: TCP/IP protocol and Net::HTTP — Nigel Gilbert <n.gilbert@...> 2003/06/19

I am beginning to wonder if this problem arises from the MacOS X

[#73943] collect info about ruby-api — "Simon Strandgaard" <0bz63fz3m1qt3001@...>

I have long been longing for a good description of ruby C api.

35 messages 2003/06/19

[#74039] WxRuby status? — ptkwt@...1.aracnet.com (Phil Tomson)

14 messages 2003/06/20
[#74507] Re: WxRuby status? — Richard Kilmer <rich@...> 2003/06/26

Things are progressing great. Kevin Smith has taken the development

[#74070] How to test if a file exists? — Daniel Carrera <dcarrera@...>

-----BEGIN PGP SIGNED MESSAGE-----

12 messages 2003/06/21

[#74096] Exasperated with ruby/tk - anybody successfully using it? — "Richard Browne" <richb@...>

General question: Is ruby/tk still being maintained in 1.7/1.8 or is it

10 messages 2003/06/22

[#74104] String#decorate — martindemello@... (Martin DeMello)

When chaining methods, it'd be neat to have something that was passed

17 messages 2003/06/22

[#74156] Marshal bug? — Anders Borch <spam@...>

Hi!

15 messages 2003/06/23
[#74161] Re: Marshal bug? — Dave Thomas <dave@...> 2003/06/23

Anders Borch wrote:

[#74205] can't find appropriate regexp — "Patrick Zesar" <jonnypichler@...>

spamassassin blocked my previous post :-((((

17 messages 2003/06/23

[#74279] Ruby Developer's Guide - hurt book sale — dennis@... (Dennis Sutch)

Syngress Publishing is having a hurt book sale. Per Syngress

11 messages 2003/06/24

[#74379] protect parents from children — "Simon Strandgaard" <0bz63fz3m1qt3001@...>

I fell into these pitfalls yesterday.. that a child was modifying a parent!

27 messages 2003/06/25

[#74413] Ruby/Java integration through JNI: working implementation — Mauricio Fern疣dez <batsman.geo@...>

14 messages 2003/06/25
[#74436] Re: Ruby/Java integration through JNI: working implementation — D T <tran55555@...> 2003/06/25

Yet An other JRuby ?? :-)

[#74465] DBD for Oracle9i — Jim Cain <list@...>

Hi all. I was looking for a Ruby interface to 9i that would handle all

25 messages 2003/06/25

[#74478] RPM for 1.8.0 — John Carter <john.carter@...>

I would like to get / build a Mandrake 9.1 RPM for Ruby-1.8.0 Preview 3

17 messages 2003/06/26

[#74506] String#split(' ') and whitespace (perl user's surprise) — mike@... (Mike Stok)

I have to confess that I use a lot of Perl, and some of its idioms are

15 messages 2003/06/26

[#74573] Using & for arrays of objects — "Krishna Dole" <kpdole@...>

Hi,

39 messages 2003/06/27

[#74579] why can't I use $3somevar for global variable in ruby 1.8.0? — Donglai Gong <donglai@...>

Hi, I'm new to Ruby programming and I just upgraded from 1.6.8 to 1.8.0

10 messages 2003/06/27

[#74702] Slides from my talk are up on rubyhacker.com — "Hal E. Fulton" <hal9000@...>

I was pleased to attend the European Ruby Conference

25 messages 2003/06/29

[#74706] Help with UnboundMethod#bind error — gabriele renzi <surrender_it@...1.vip.lng.yahoo.com>

Hi gurus and nubys,

16 messages 2003/06/29
[#74708] Re: Help with UnboundMethod#bind error — nobu.nokada@... 2003/06/29

Hi,

[#74732] Re: Help with UnboundMethod#bind error — matz@... (Yukihiro Matsumoto) 2003/06/30

Hi,

[#74919] Re: Help with UnboundMethod#bind error — "Pit Capitain" <pit@...> 2003/07/02

On 30 Jun 2003 at 17:18, Yukihiro Matsumoto wrote:

[#74717] Re: Message catalogs (I18N) overnight hack... — "Hal E. Fulton" <hal9000@...>

----- Original Message -----

17 messages 2003/06/29

[#74747] Editor like Textpad on Linux? — Dominik Werder <dwerder@...>

Hello,

13 messages 2003/06/30

[#74768] dynamic object creation — Aryeh Friedman <aryeh@...>

If I have something like this:

15 messages 2003/06/30

Code generation and state machines

From: Zellyn Hunter <ruby-list@...>
Date: 2003-06-19 00:11:57 UTC
List: ruby-talk #73896
Hi folks,

I'm starting a project for fun in Ruby, partly to help learn the language.  
One of the pieces it needs is a state machine.

I liked the code generation for tables and rows described in 
http://www.codegeneration.net/tiki-read_article.php?articleId=9 so I thought 
I'd take a stab at getting it to work on a simple level.  (By the way, don't 
*ever* write an article where you show the syntax of a really neat trick but 
leave the implementation out because it's "too complicated".  That's just 
taunting!)

Here's my attempt.  It actually works, but I wanted to get the list's 
feedback.

Mostly I just want to know whether there are cleaner ways to do any parts of 
it, or if there is a more Ruby way to do any of it.  Any criticism is 
welcome.

The thing I'm least happy with is that I needed to create accessors for the @@ 
class variables because I couldn't figure out how to reference the child 
class's class variables from the run() method defined in the parent class.  
Is there a neat way to do it?

Thanks,

Zellyn

#
# Parent class of state machines.  Defines the functions that allow
# simple syntax in child classes
#

class StateMachine

  # Create a new state - simply add the given block to the states hash
  # under the state's name

  def StateMachine.state(name, &action)
    module_eval <<-"end_eval"
      puts "DEBUG: Defining state '\#{name}'"
      @@states || @@states = {}
      @@states[name] = action
    end_eval
  end

  # Create a new transition.  Each start state's entry in the
  # transitions hash is an array of pairs.  Each pair contains
  # and end state and a condition block

  def StateMachine.transition (startState, endState, &condition)
    puts "DEBUG: Defining transition from '#{startState}' to '#{endState}'"
    module_eval <<-"end_eval"
      ary = @@transitions[startState] || []
      ary.push([endState,condition])
      @@transitions[startState] = ary
    end_eval
  end

  # set the start state

  def StateMachine.startstate(name)
    module_eval <<-"end_eval"
      @@startState = name
    end_eval
  end

  # set the end state

  def StateMachine.endstate(name)
    module_eval <<-"end_eval"
      @@endState = name
    end_eval
  end

  # Actually run the state machine.
  # - Start in the start state.
  # - Evaluate each state's block on entering the state
  # - Try each transition for the start state.  When a condition
  #   evaluates to true, enter the corresponding target state.
  # - Quit when you reach the end state

  def run
    currentState = startState()

    while (currentState != endState()) do
      states()[currentState].call()
      ary = transitions()[currentState]
      ary.each do |(target,condition)|
        if condition.call()
          currentState = target
          next
        end
      end
    end

    # and execute the final state's action
    states()[currentState].call()
  end

  # Trap child classes inheriting from this class, and add the
  # necessary class variables and their accessors.

  def StateMachine.inherited(subclass)
    subclass.module_eval <<-"end_eval"
      @@states = {}
      @@transitions = {}
      @@startState = nil
      @@endState = nil

      def states
        @@states
      end

      def transitions
        @@transitions
      end

      def startState
        @@startState
      end

      def endState
        @@endState
      end
    end_eval
  end
end


# First simple state machine:
# Start -> Second -> End

class SimpleState1 < StateMachine

  state("Start") { puts "Start State (1)" }
  state("Second") { puts "Second State (1)" }
  state("End")    { puts "End State (1)" }

  startstate("Start")
  transition("Start", "Second") { 1 }
  transition("Second","End") { 1 }
  endstate("End")

end
require 'StateMachine'

# Second simple state machine
# Start -> Second -> Third -> End
# (with never-taken transition from Second -> End)

class SimpleState2 < StateMachine

  state("Start") { puts "Start State (2)" }
  state("Second") { puts "Second State (2)" }
  state("Third") { puts "Third State (2)" }
  state("End")    { puts "End State (2)" }

  startstate("Start")
  transition("Start", "Second") { 1 }
  transition("Second","End") { 0 }
  transition("Second","Third") { 1 }
  transition("Third","End") { 1 }
  endstate("End")

end

#
# Test it all out.  Make two state machines with similar state names so
# that we're sure we're actually defining the states and transitions
# in the right place - overlaps/clashes will show up clearly.
#

machine1 = SimpleState1.new()
machine2 = SimpleState2.new()

puts()
puts "Running State Machine 1:"
machine1.run

puts()
puts "Running State Machine 2:"
machine2.run

puts()
puts "Running State Machine 1 again:"
machine1.run

#
# Output:
#
# DEBUG: Defining state 'Start'
# DEBUG: Defining state 'Second'
# DEBUG: Defining state 'End'
# DEBUG: Defining transition from 'Start' to 'Second'
# DEBUG: Defining transition from 'Second' to 'End'
# DEBUG: Defining state 'Start'
# DEBUG: Defining state 'Second'
# DEBUG: Defining state 'Third'
# DEBUG: Defining state 'End'
# DEBUG: Defining transition from 'Start' to 'Second'
# DEBUG: Defining transition from 'Second' to 'End'
# DEBUG: Defining transition from 'Second' to 'Third'
# DEBUG: Defining transition from 'Third' to 'End'
# 
# Running State Machine 1:
# Start State (1)
# Second State (1)
# End State (1)
# 
# Running State Machine 2:
# Start State (2)
# Second State (2)
# Third State (2)
# End State (2)
# 
# Running State Machine 1 again:
# Start State (1)
# Second State (1)
# End State (1)
#


In This Thread

Prev Next