Work at SourceForge, help us to make it a better place! We have an immediate need for a Support Technician in our San Francisco or Denver office.

Close

#64 w $$@handler is borked

open
nobody
None
5
2012-12-29
2005-08-16
Steve Zeck
No

This works:

s handler="label^routine"
d @handler@("param1","param2") ; spiffy!

This doesn't:

s handler="^x" w $$@handler
%GTM-E-LABELMISSING, Label referenced but not defined:
^xPADDIN

or this:
s handler="label^routine(""firstarg"")"
w $$@handler
%GTM-E-LABELMISSING, Label referenced but not defined:
label^ro

It appears that $$@var truncates the label/routine name
contained in 'var' to 8 characters (or pads it out to 8
with the word 'PADDING' if it's shorter)

Even if you can get it to come out to 8 characters
exactly it still breaks with 'LABELMISSING'

s handler="labl^rtn" w $$@handler
%GTM-E-LABELMISSING, Label referenced but not defined:
labl^rtn

As it is, we were impressed that 'd @handler@(args)'
works, we'd never thought to try it. It would be nice
if we could get the return values too, though there are
workarounds for that (use a globally-defined local
variable, pass a variable by reference, etc..)

This would be great for bludgeoning objects and methods
into M if the minor problem of $$@var could be fixed.
Imagine:

d new^object(.objref)
d @objref("method")@(param)

Discussion

  • Steven Estes
    Steven Estes
    2005-08-16

    Logged In: YES
    user_id=97877

    This looks like it is likely a case of a fairly common
    indirection usage confusion. There are two types of
    indirection: expression indirection and name level
    indirection. The two are NOT interchangeable and are used in
    different situations. The argument for $$ is name level
    indirection which means nothing but a routine OR variable
    name can be put there. The term "label^routine" is an
    expression and cannot be used in name level indirection. If
    you want to specify both routine and label you have two choices:

    In an expression situation, you do something like:
    S handler="$$labl^rtn" w @handler

    For a name situation you do something like:
    S hndllbl="labl" S hndlrtn="rtn" W $$@lbl^@rtn

    However, in this later example, there do appear to be some
    issues with passing parameters (they get treated as part of
    the indirection expression even if rtn is terminated by a
    '@'). I haven't looked up the actual parsing rules in that
    situation so I'm not ready to call it a bug *yet*.. ;-)

    Hope that answers your question

    Steve