Use Ruby to parse a Tcl DSL
I would like to be able to parse some Tcl code where arguments are not surrounded by strings.

Consider this tcl code:

    proc foo {name} {
      puts "Foo --> $name"
    }    
    
    foo bar

For those unfamiliar with Tcl, `foo` is the method name and `bar` is the argument (quotes are optional in Tcl).

The previous code will output:

    Foo --> bar

Is it possible to parse *exactly* the same input using ruby (`bar` remains unquoted)?

The equivalent ruby code is:

    def foo(name)
      puts "Foo --> #{name}"
    end
    
    tcl = <<-TCL.gsub(/^\s+/, "").chop
      foo bar
    TCL
    instance_eval(tcl)

Of course that fails when it reaches `bar` since it's expected it to be quoted. 

I've tried tinkering with `method_missing` 

    def method_missing(meth, *args)
        puts meth.to_s + " --> args.to_s
    end

but it parses in reverse order:

    to_hash --> []
    bar --> []
    foo --> [nil]

Does anyone have a clean solution to this type of problem. I'd like to avoid tokenizing the strings since reading the data in by calling a method requires minimal work compared to lexical analysis. But if I'm trying to do something that's not possible, I'd like to know. Thanks.           
Use Ruby to parse a Tcl DSL
===

I would like to be able to parse some Tcl code where arguments are not surrounded by strings.

Consider this tcl code:

    proc foo {name} {
      puts "Foo --> $name"
    }    
    
    foo bar

For those unfamiliar with Tcl, `foo` is the method name and `bar` is the argument (quotes are optional in Tcl).

The previous code will output:

    Foo --> bar

Is it possible to parse *exactly* the same input using ruby (`bar` remains unquoted)?

The equivalent ruby code is:

    def foo(name)
      puts "Foo --> #{name}"
    end
    
    tcl = <<-TCL.gsub(/^\s+/, "").chop
      foo bar
    TCL
    instance_eval(tcl)

Of course that fails when it reaches `bar` since it's expected it to be quoted. 

I've tried tinkering with `method_missing` 

    def method_missing(meth, *args)
        puts meth.to_s + " --> args.to_s
    end

but it parses in reverse order:

    to_hash --> []
    bar --> []
    foo --> [nil]

Does anyone have a clean solution to this type of problem. I'd like to avoid tokenizing the strings since reading the data in by calling a method requires minimal work compared to lexical analysis. But if I'm trying to do something that's not possible, I'd like to know. Thanks.           