1. "Forward" function declarations?

I need to do the "C" equivalent of a "forward" function declaration in 
Euphoria.  Can this be done?

new topic     » topic index » view message » categorize

2. Re: "Forward" function declarations?

----- Original Message -----
From: "Ted Fines" <fines at macalester.edu>
To: <EUforum at topica.com>
Sent: Thursday, February 08, 2001 7:45 AM
Subject: "Forward" function declarations?


> I need to do the "C" equivalent of a "forward" function declaration in
> Euphoria.  Can this be done?
>

Not directly. A forward reference is illegal in Euphoria:

funcion foo(object x)
    integer z
    z=bar(x)  --syntax error "bar" not defined
    return z+2
end function

function bar(object y)
    if atom(y) return -1 else return length(y)
end function

printf(1,"%d",foo({1,2,3}))

and there is no way to declare a routine before it is defined (as there is
in C).  Instead Euphoria uses routine_id():

integer bar_ID --bar_ID must be defined before foo()

funcion foo(object x)
    integer z
    z=call_func(bar_ID,{x})
    return z+2
end function

function bar(object y)
    if atom(y) return -1 else return length(y)
end function

bar_ID=routine_id("bar") -- routine_id() must be used after bar()

printf(1,"%d",foo({1,2,3}))


Now this works as foo() can "see" bar_ID and bar_ID is assigned a value
before foo() is called.

-- Mike Nelson

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

3. Re: "Forward" function declarations?

On 8 Feb 2001, at 10:13, Michael Nelson wrote:

> 
> ----- Original Message -----
> From: "Ted Fines" <fines at macalester.edu>
> To: <EUforum at topica.com>
> Sent: Thursday, February 08, 2001 7:45 AM
> Subject: "Forward" function declarations?
> 
> 
> > I need to do the "C" equivalent of a "forward" function declaration in
> > Euphoria.  Can this be done?
> >
> 
> Not directly. A forward reference is illegal in Euphoria:
> 
> funcion foo(object x)
>     integer z
>     z=bar(x)  --syntax error "bar" not defined
>     return z+2
> end function
> 
> function bar(object y)
>     if atom(y) return -1 else return length(y)
> end function
> 
> printf(1,"%d",foo({1,2,3}))
> 
> and there is no way to declare a routine before it is defined (as there is
> in C).  Instead Euphoria uses routine_id():
> 
> integer bar_ID --bar_ID must be defined before foo()
> 
> funcion foo(object x)
>     integer z
>     z=call_func(bar_ID,{x})
>     return z+2
> end function
> 
> function bar(object y)
>     if atom(y) return -1 else return length(y)
> end function
> 
> bar_ID=routine_id("bar") -- routine_id() must be used after bar()
> 
> printf(1,"%d",foo({1,2,3}))
> 
> 
> Now this works as foo() can "see" bar_ID and bar_ID is assigned a value
> before foo() is called.

This is another example of where the interpreter can be made smarter: If the
procedure
hasn't been declared yet, look further into the code for it!! I have seen some
programs
wherein everything has been routine_id()'d, and all procedure and function calls
are to
the routine_id . The interpreter could be doing this as a default, and making
the order
of precedence irrelevant.

Kat

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

4. Re: "Forward" function declarations?

</snip>

constant
    TRUE = 1,
    FALSE = 0

sequence
    types,
    handles,
    rps

global procedure add_function (object handle, integer rp)
integer pos
    pos = find (handle, handles)
    if pos then
        types[pos] = TRUE         -- It does return something
        rps[pos] = rp
    else
        handles = append(handles, handle)
        types = append(types, TRUE)
        rps = append(rps, TRUE)
    end if
end procedure

global procedure add_procedure (object handle, integer rp)
integer pos
    pos = find (handle, handles)
    if pos then
        types[pos] = FALSE         -- It does return something
        rps[pos] = rp
    else
        handles = append(handles, handle)
        types = append(types, FALSE)
        rps = append(rps, FALSE)
    end if
end procedure

global function call_routine (object handle, sequence arg)
integer pos
    pos = find (handle, handles)
    if pos then
        if types[pos] then
            return {TRUE, call_func (rps[pos], arg)}
        else
            call_proc (rps[pos], arg)
            return {TRUE}
        end if
    else
        return {FALSE}
    end if
end function

<snip\>

I think Kat might have been refering to this.

 Euman

----- Original Message -----
From: "Kat" <gertie at PELL.NET>
To: <EUforum at topica.com>
Sent: Thursday, February 08, 2001 13:34
Subject: Re: "Forward" function declarations?


> On 8 Feb 2001, at 10:13, Michael Nelson wrote:
>
> >
> > ----- Original Message -----
> > From: "Ted Fines" <fines at macalester.edu>
> > To: <EUforum at topica.com>
> > Sent: Thursday, February 08, 2001 7:45 AM
> > Subject: "Forward" function declarations?
> >
> >
> > > I need to do the "C" equivalent of a "forward" function declaration in
> > > Euphoria.  Can this be done?
> > >
> >
> > Not directly. A forward reference is illegal in Euphoria:
> >
> > funcion foo(object x)
> >     integer z
> >     z=bar(x)  --syntax error "bar" not defined
> >     return z+2
> > end function
> >
> > function bar(object y)
> >     if atom(y) return -1 else return length(y)
> > end function
> >
> > printf(1,"%d",foo({1,2,3}))
> >
> > and there is no way to declare a routine before it is defined (as there
is
> > in C).  Instead Euphoria uses routine_id():
> >
> > integer bar_ID --bar_ID must be defined before foo()
> >
> > funcion foo(object x)
> >     integer z
> >     z=call_func(bar_ID,{x})
> >     return z+2
> > end function
> >
> > function bar(object y)
> >     if atom(y) return -1 else return length(y)
> > end function
> >
> > bar_ID=routine_id("bar") -- routine_id() must be used after bar()
> >
> > printf(1,"%d",foo({1,2,3}))
> >
> >
> > Now this works as foo() can "see" bar_ID and bar_ID is assigned a value
> > before foo() is called.
>
> This is another example of where the interpreter can be made smarter: If
the procedure
> hasn't been declared yet, look further into the code for it!! I have seen
some programs
> wherein everything has been routine_id()'d, and all procedure and function
calls are to
> the routine_id . The interpreter could be doing this as a default, and
making the order
> of precedence irrelevant.
>
> Kat
>
>

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

5. Re: "Forward" function declarations?

Hi Kat,

> This is another example of where the interpreter can be made smarter: If
the procedure
> hasn't been declared yet, look further into the code for it!!

RDS is aware of this idea and acknowledges that technically it is not all
that difficult to do, but I believe that RDS won't do it because it is
against their philosophy.

------
Derek Parnell
Melbourne, Australia
(Vote [1] The Cheshire Cat for Internet Mascot)

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

Search



Quick Links

User menu

Not signed in.

Misc Menu