1. !!!Re: Re: routine_id help

>After posting, I experimented a bit; it indeed appears that "routine_id" can't
>access ANY forward routines, even in the
>same file. This doesn't sound right... the documentation states that forward
>access can be achieved, and even notes that
>mutual recursion is possible using the function. I had been working under the
>assumption that visibility was only limited by
>global/local/private scope.

Well, about scope, Robert has promised us to fix it. Im at least assuming he
fixes it in such way direct forward calling of a
routine in *another* include file is possible. (as long as the includes
statements match).

However, dont take it the wrong way, routine_id is suppose to be used
differently. Look at this..

-- run a forward routine a number of times
procedure repeat_procedure (integer rp, integer count, sequence arg)
    for index = 1 to count do
        call_proc (rp,arg)
    end for
end procedure

-- just a procedure
procedure barf (sequence s)
    puts (1, "Barf!! " & s & " Barf!!\n")
end procedure

repeat_procedure (routine_id ("barf"), 10, " You can make a forward call !! ")

What does this do ?
This prints out "Barf!! You can make a forward call !!  Barf!!" exactly 10
times.
A useles example, I know. Look at this, an example, you are likely to see
somewhere:

------- A library called procces.e or something

    sequence filters        -- used to store the different routine pointers

    global function register_filter (integer rp)
        filters = append(filters, rp)
    end function

    global function procces (sequence s)
        for index = 1 to length(filters) do
            s = call_func (filters[index], {s})
        end for
        return s
    end function

--- A program

    include procces.e

    function pos (object x)
        return x + ( x < 0 * -2)        -- makes all of x positive
    end function

    function upper_case (object x)
x = x + ( ( 'a' - 'A' ) * ( x >= 'a' and x <= 'z' ))        -- make all
        of x uppercase
    end function

    -- registering filters
    register_filter (routine_id ("pos"))
    register_filter (routine_id ("upper_case"))

puts (1, procces ( -32 & -32 & "two spaces surround this" & -32 & -32 & '\n'
    ) )
    -- prints out: "  TWO SPACES SURROUND THIS  \n"

Do you now see how they are meant to be used ?
If you want to use them in the way you did, use this library:

    -- routine.e

    sequence names, pointers

    global procedure add_routine (sequence name, integer rp)
    integer place

        place = find (name, names)
        if place then
            pointers[place] = rp
        else
            names = append(names, name)
            pointers = append(pointers, rp)
        end if
     end procedure

    global funciton lookup_routine (sequence name)
    integer place

        place = find (name, names)
        if place then
            return pointers[place]
        else
            return -1        -- 'none' equals -1 (the third boolean IMO)
        end if
    end function

-- end of routine.e

How do you use this library ?
Well, after the routine that it should be able to call, you say:
(you could just do this right after *every* routine and type)

    procedure indent ()
        puts (1, repeat (' ', 6))
    end procedure
    add_routine ("indent", routine_id ("indent"))

Then a library included before is allowed to say lookup_routine ("indent') and
get the routine pointer associated.
(actually, except for the integer and sequence type restriction, the library is
just a general key-association library)

So, include the library above, and use lookup_routine () were you previously
used routine_id () and use add_routine after each
routine you want lookup_routine to be able to find.

>Just out of curiosity, if "routine_id" can't call a forward routine, how on
>earth can Euphoria implement mutual recursion?
>Perhaps my copy of refman.doc is out of date?

This is how:

-- note: do not try to run this: infinite recursion created (see how
    Euphoria uses up all your memory, rather than just
    -- the stack to contiue the recursion as long as possible blink

    integer proc_b

    procedure proc_a ()
        call_proc (proc_b, {})
    end procedure

    procedure proc_b ()
        proc_a ()
    end procedure
    proc_b = routine_id ("proc_a")

-- Simple, not ? Just dont try to run it. It doesnt do anything anyway.

I hope this clears things up. Lots of code, but it saves me from having to
strangle english to make it say what I want.

Ralf N.

new topic     » topic index » view message » categorize

2. Re: !!!Re: Re: routine_id help

<Light bulb turns on>

I see. Thanks Ralf, that was a big help. I've been looking at this the =
wrong way, making assumptions about how the Euphoria interpreter was =
doing things...

It looks like I will be able to finish my library without much of a =
change. It won't be as elegant as I had originally hoped, but it can be =
done.

Hopefully I can let it go public shortly.

Thanks again everyone for the help. smile


Rod Jackson


----------
From:   Ralf Nieuwenhuijsen[SMTP:nieuwen at XS4ALL.NL]
Sent:   Tuesday, February 16, 1999 1:16 PM
To:     EUPHORIA at LISTSERV.MUOHIO.EDU
Subject:        !!!Re:      Re: routine_id help

>After posting, I experimented a bit; it indeed appears that =
"routine_id" can't access ANY forward routines, even in the
>same file. This doesn't sound right... the documentation states that =
forward access can be achieved, and even notes that
>mutual recursion is possible using the function. I had been working =
under the assumption that visibility was only limited by
>global/local/private scope.

Well, about scope, Robert has promised us to fix it. Im at least =
assuming he fixes it in such way direct forward calling of a
routine in *another* include file is possible. (as long as the includes =
statements match).

However, dont take it the wrong way, routine_id is suppose to be used =
differently. Look at this..

<rest snipped for brevity, available in prior post>

I hope this clears things up. Lots of code, but it saves me from having =
to strangle english to make it say what I want.

Ralf N.

new topic     » goto parent     » topic index » view message » categorize

Search



Quick Links

User menu

Not signed in.

Misc Menu