1. routine_id() is not working


See: http://openeuphoria.org/pastey/208.wc

1) As is, routine_id() always returns -1

2) routine_id() is in os.e , but if you delete the include...os.e line, the routine_id() still "works", but always returns 1

3) If you remove either of the top two include lines, the routine_id() will work properly.

What's up with that?

useless

new topic     » topic index » view message » categorize

2. Re: routine_id() is not working

useless_ said...


See: http://openeuphoria.org/pastey/208.wc

1) As is, routine_id() always returns -1

2) routine_id() is in os.e , but if you delete the include...os.e line, the routine_id() still "works", but always returns 1

3) If you remove either of the top two include lines, the routine_id() will work properly.

What's up with that?

You're mixing the 3.1 standard library with 4.0. There is a sleep() in misc.e and in std/os.e. Both file.e and database.e include misc.e, and of course, all symbols are global, Therefore, routine_id cannot resolve a unique sleep() when std/os.e is included.

Matt

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

3. Re: routine_id() is not working

mattlewis said...
useless_ said...


See: http://openeuphoria.org/pastey/208.wc

1) As is, routine_id() always returns -1

2) routine_id() is in os.e , but if you delete the include...os.e line, the routine_id() still "works", but always returns 1

3) If you remove either of the top two include lines, the routine_id() will work properly.

What's up with that?

You're mixing the 3.1 standard library with 4.0. There is a sleep() in misc.e and in std/os.e. Both file.e and database.e include misc.e, and of course, all symbols are global, Therefore, routine_id cannot resolve a unique sleep() when std/os.e is included.

Matt

Umm, i am running the windows install the way i downloaded it that day, i didn't mix versions.

useless

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

4. Re: routine_id() is not working

useless_ said...
mattlewis said...

You're mixing the 3.1 standard library with 4.0. There is a sleep() in misc.e and in std/os.e. Both file.e and database.e include misc.e, and of course, all symbols are global, Therefore, routine_id cannot resolve a unique sleep() when std/os.e is included.

Umm, i am running the windows install the way i downloaded it that day, i didn't mix versions.

Here are the include statements in the code you posted:

include "C:\\Euphoria-10-Feb-2013\\include\\database.e" 
include "C:\\Euphoria-10-Feb-2013\\include\\file.e"  
  
include "C:\\Euphoria-10-Feb-2013\\include\\std\\os.e"  
 

The 3.1 standard library is in the include directory and the 4.0 library is in include/std. In general, you should use the stuff in include/std for new development. The older stuff is for backwards compatibility with legacy code.

Matt

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

5. Re: routine_id() is not working

mattlewis said...
useless_ said...
mattlewis said...

You're mixing the 3.1 standard library with 4.0. There is a sleep() in misc.e and in std/os.e. Both file.e and database.e include misc.e, and of course, all symbols are global, Therefore, routine_id cannot resolve a unique sleep() when std/os.e is included.

Umm, i am running the windows install the way i downloaded it that day, i didn't mix versions.

Here are the include statements in the code you posted:

include "C:\\Euphoria-10-Feb-2013\\include\\database.e" 
include "C:\\Euphoria-10-Feb-2013\\include\\file.e"  
  
include "C:\\Euphoria-10-Feb-2013\\include\\std\\os.e"  
 

The 3.1 standard library is in the include directory and the 4.0 library is in include/std. In general, you should use the stuff in include/std for new development. The older stuff is for backwards compatibility with legacy code.

Matt

That is not documented on http://openeuphoria.org/docs/std_os.html#_1860_sleep .

Also, searches for gets and value return nothing.

useless

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

6. Re: routine_id() is not working

useless_ said...
mattlewis said...

The 3.1 standard library is in the include directory and the 4.0 library is in include/std. In general, you should use the stuff in include/std for new development. The older stuff is for backwards compatibility with legacy code.

That is not documented on http://openeuphoria.org/docs/std_os.html#_1860_sleep .

I'm not sure what we'd put there. Still, I didn't immediately find anything talking about the 3.1 to 4.0 transition, which I thought we had. Possibly in the wiki, although the "What's new in 4.0" at the beginning of the manual says, "Euphoria has a brand new standard library consisting of over 800 public members."

useless_ said...

Also, searches for gets and value return nothing.

Hmm...looks like a problem with our indexing. Some things changed in the way the documentation was built, and it looks like the indexing didn't fully make it.

Matt

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

7. Re: routine_id() is not working

mattlewis said...
useless_ said...
mattlewis said...

The 3.1 standard library is in the include directory and the 4.0 library is in include/std. In general, you should use the stuff in include/std for new development. The older stuff is for backwards compatibility with legacy code.

That is not documented on http://openeuphoria.org/docs/std_os.html#_1860_sleep .

I'm not sure what we'd put there. Still, I didn't immediately find anything talking about the 3.1 to 4.0 transition, which I thought we had. Possibly in the wiki, although the "What's new in 4.0" at the beginning of the manual says, "Euphoria has a brand new standard library consisting of over 800 public members."

I have a further question, since i hadn't considered mixing includes for 3.1 and 4.0 which have the same function names. Lets say i do:

include "C:\\Euphoria-10-Feb-2013\\include\\std\\os.e" 
include "C:\\Euphoria-10-Feb-2013\\include\\misc.e" 

(and we can say i did it, because i did it), then i do:

id_num = routine_id("os:sleep") 
id_num = routine_id("sleep") 
id_num = routine_id("misc:sleep") 

both id_num for sleep and misc:sleep are -1. Of course, this does work:

include "C:\\Euphoria-10-Feb-2013\\include\\misc.e" as misc 
id_num = routine_id("misc:sleep") 

So using namespaces to identify the sleep in misc.e works, but since the sleep in os.e is already namespaced away from misc.e, shouldn't this work too:

include "C:\\Euphoria-10-Feb-2013\\include\\std\\os.e" 
include "C:\\Euphoria-10-Feb-2013\\include\\misc.e" 
id_num = routine_id("sleep") 

This also works:

include "C:\\Euphoria-10-Feb-2013\\include\\std\\os.e" as os 
id_num = routine_id("os:sleep") 

even tho os.e is already namespaced internally to itself. So maybe if we get into the habit of always using "as" in includes, or better yet: the interpreter does this automagically, it might make life a lil easier. I think the error msg could get more informative also:

include "C:\\Euphoria-10-Feb-2013\\include\\std\\os.e" as os 
include "C:\\Euphoria-10-Feb-2013\\include\\misc.e" as misc 
id_num = routine_id("sleep") 
puts(1,"\n") 
id_num = routine_id("sleep") 
 
-- Error line 3 : pick sleep from os or misc 
-- Error line 5 : pick sleep from os or misc 

Because right now,

include "C:\\Euphoria-10-Feb-2013\\include\\std\\os.e" as os 
include "C:\\Euphoria-10-Feb-2013\\include\\misc.e" 

does not error, but the sleep in misc.e is unavailable. Or is that an undocumented feature?

And the reason i appended my question to this as i did is so you can add your answer to the section on namespaces and resolving the mix in the routine_id() section.

useless

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

8. Re: routine_id() is not working

useless_ said...

So using namespaces to identify the sleep in misc.e works, but since the sleep in os.e is already namespaced away from misc.e, shouldn't this work too:

include "C:\\Euphoria-10-Feb-2013\\include\\std\\os.e" 
include "C:\\Euphoria-10-Feb-2013\\include\\misc.e" 
id_num = routine_id("sleep") 

This also works:

include "C:\\Euphoria-10-Feb-2013\\include\\std\\os.e" as os 
id_num = routine_id("os:sleep") 

even tho os.e is already namespaced internally to itself.

That's not quite how euphoria namespaces work. The default namespace declared in a file is available for others to use, but is not strictly required, like it is in some languages. It's there as a convenience, but has to be used to make a difference.

useless_ said...

So maybe if we get into the habit of always using "as" in includes, or better yet: the interpreter does this automagically, it might make life a lil easier. I think the error msg could get more informative also:

include "C:\\Euphoria-10-Feb-2013\\include\\std\\os.e" as os 
include "C:\\Euphoria-10-Feb-2013\\include\\misc.e" as misc 
id_num = routine_id("sleep") 
puts(1,"\n") 
id_num = routine_id("sleep") 
 
-- Error line 3 : pick sleep from os or misc 
-- Error line 5 : pick sleep from os or misc 

I can see a benefit from throwing an error when routine_id returns -1, but this seems like something that could significantly break a lot of code, so we'd probably need a way to toggle this behavior.

useless_ said...

Because right now,

include "C:\\Euphoria-10-Feb-2013\\include\\std\\os.e" as os 
include "C:\\Euphoria-10-Feb-2013\\include\\misc.e" 

does not error, but the sleep in misc.e is unavailable. Or is that an undocumented feature?

And the reason i appended my question to this as i did is so you can add your answer to the section on namespaces and resolving the mix in the routine_id() section.

It's a consequence of the way you've included things. You've introduced a conflict in resolving "sleep." You have a namespace that allows you to address one of them, but not the other.

Matt

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

9. Re: routine_id() is not working

mattlewis said...
useless_ said...

since the sleep in os.e is already namespaced away from misc.e,

That's not quite how euphoria namespaces work.

Yes, that "already namespaced away" struck me as a very odd thing to say. My tuppenceworth:
If the compiler finds a conflict, it cannot, repeat CANNOT, arbitrarily pick one of them - or at least would drive you absolutely nuts if it did.
There is no way that a namespace of any kind can somehow make one of them "the default".
A namespace is a qualifier which tells the compiler, explicitly, which one to use when there is such a conflict. No more, no less.

mattlewis said...

I can see a benefit from throwing an error when routine_id returns -1, but this seems like something that could significantly break a lot of code, so we'd probably need a way to toggle this behavior.

Agreed. I would suggest either:

id = routine_id("sleep") 
if id=-1 then 
    puts(1,get_last_routine_id_error_description()) 
    ?9/0 
end if 

or add a new optional parameter

id = routine_id("sleep",fail_on_error:=True) 

Pete

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

10. Re: routine_id() is not working

petelomax said...
mattlewis said...
useless_ said...

since the sleep in os.e is already namespaced away from misc.e,

That's not quite how euphoria namespaces work.

Yes, that "already namespaced away" struck me as a very odd thing to say. My tuppenceworth:
If the compiler finds a conflict,

But the thing is, the way Matt explained it, there is a conflict, and no error was thrown. The sleep in os could be referred to as os:sleep, but it was still in the same namespace as misc's sleep.

No error was thrown when the two files both included a sleep, and none was thrown when routine_id() was used on sleep.

So i also suggested, and maybe to limit the scope of the post i shouldn't have, mentioned it might be more helpful for the crash-on-start to list the routine_id(sleep) lines when it found two sleeps in the same namespace.

useless

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

11. Re: routine_id() is not working

useless_ said...
petelomax said...
mattlewis said...
useless_ said...

since the sleep in os.e is already namespaced away from misc.e,

That's not quite how euphoria namespaces work.

Yes, that "already namespaced away" struck me as a very odd thing to say. My tuppenceworth:
If the compiler finds a conflict,

But the thing is, the way Matt explained it, there is a conflict, and no error was thrown. The sleep in os could be referred to as os:sleep, but it was still in the same namespace as misc's sleep.

No error was thrown when the two files both included a sleep, and none was thrown when routine_id() was used on sleep.

Pete's explanation was a little odd, too, in that he referred to the compiler. A routine_id call is entirely handled at runtime. So it's really the interpreter dealing with this at runtime. The error is returned as -1 (albeit without much help at figuring out why).

useless_ said...

So i also suggested, and maybe to limit the scope of the post i shouldn't have, mentioned it might be more helpful for the crash-on-start to list the routine_id(sleep) lines when it found two sleeps in the same namespace.

We could add warnings, perhaps, for routine_id calls with literals that we know cannot be resolved. Since you can dynamically build the name of the routine, we obviously cannot do this for all calls to routine_id.

Matt

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

12. Re: routine_id() is not working

eukat said...

No error was thrown when the two files both included a sleep,

No error should be thrown here!!! The whole point of namespaces - this shouldn't be an error!

eukat said...

and none was thrown when routine_id() was used on sleep.

This should be optional. There are cases when you want to just let the code continue when routine_id() can't figure things out, but other times you do want an error to be thrown to catch this bug.

I'm quite partial to Pete's optional parameter idea for this.

eukat said...

So i also suggested it might be more helpful for the crash-on-start to list the routine_id(sleep) lines when it found two sleeps in the same namespace.

If the user specifies that routine_id() should crash, then yes! I fully agree with this.

eukat said...

, and maybe to limit the scope of the post i shouldn't have, mentioned

I'd agree with this principle in general, but I disagree with this particular instance. It's too relevant to the topic at hand to be ignored.

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

13. Re: routine_id() is not working

jimcbrown said...
eukat said...

No error was thrown when the two files both included a sleep,

No error should be thrown here!!! The whole point of namespaces - this shouldn't be an error!

So if i write an include with a sleep proceedure in it, and then i include it and misc.e, no error should be thrown? This should not be a problem?

include sleep.e 
include misc.e 

Why shouldn't this generate an error report?

useless

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

14. Re: routine_id() is not working

useless_ said...

So if i write an include with a sleep proceedure in it, and then i include it and misc.e, no error should be thrown? This should not be a problem?

include sleep.e 
include misc.e 

Why shouldn't this generate an error report?

Because there are no errors in that code.

Now, try calling sleep without qualifying it. That's an error, because there is no way to tell which one you really wanted to call.

Matt

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

15. Re: routine_id() is not working

mattlewis said...
useless_ said...

So if i write an include with a sleep proceedure in it, and then i include it and misc.e, no error should be thrown? This should not be a problem?

include sleep.e 
include misc.e 

Why shouldn't this generate an error report?

Because there are no errors in that code.

Now, try calling sleep without qualifying it. That's an error, because there is no way to tell which one you really wanted to call.

Matt

By itself, from the 4ft pov, true, no error as Euphoria is now. But Euphoria still put two sleeps into the same namespace, and it had to include both sleeps in the run code, because of routine_id() being called. In this example, neither sleep is namespaced.

Had i included os.e also, there'd be 3 sleep()s in the same namespace, and the program would happily begin running and not crash untill the program executed a routine_id(sleep), maybe hours later, with data loss. Come on Matt, surely Euphoria can be smarter than that.

useless

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

16. Re: routine_id() is not working

eukat said...

By itself, from the 4ft pov, true, no error as Euphoria is now. But Euphoria still put two sleeps into the same namespace, and it had to include both sleeps in the run code, because of routine_id() being called. In this example, neither sleep is namespaced.

Actually, that depends on the contents of sleep.e - which isn't either a 3.1 or 4.0 include file.

eukat said...

Had i included os.e also, there'd be 3 sleep()s in the same namespace,

Actually, the one in os.e would be in os.e's default namespace.

eukat said...

and the program would happily begin running and not crash untill the program executed a routine_id(sleep), maybe hours later, with data loss. Come on Matt, surely Euphoria can be smarter than that.

It would not, as currently, routine_id(sleep) (assuming sleep is a variable containing the string "sleep") returns -1 instead of crashing. No crash, no data loss.

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

17. Re: routine_id() is not working

jimcbrown said...
eukat said...

By itself, from the 4ft pov, true, no error as Euphoria is now. But Euphoria still put two sleeps into the same namespace, and it had to include both sleeps in the run code, because of routine_id() being called. In this example, neither sleep is namespaced.

Actually, that depends on the contents of sleep.e - which isn't either a 3.1 or 4.0 includ

I had previously said, in reponce to a post by you in this thread:

said...

So if i write an include with a sleep proceedure in it, and then i include it and misc.e, no error should be thrown? This should not be a problem?

jimcbrown said...
eukat said...

Had i included os.e also, there'd be 3 sleep()s in the same namespace,

Actually, the one in os.e would be in os.e's default namespace.

It's also in "no namespace", you can call it without specifying os:sleep.

jimcbrown said...
eukat said...

and the program would happily begin running and not crash untill the program executed a routine_id(sleep), maybe hours later, with data loss. Come on Matt, surely Euphoria can be smarter than that.

It would not, as currently, routine_id(sleep) (assuming sleep is a variable containing the string "sleep") returns -1 instead of crashing. No crash, no data loss.

Only if i always wrote code to catch the -1 returned from routine_id() (even when i KNOW there is a procedure of the name i am routine_id'ing), which to me is like saying "i know Eu is going to overlook an ambiguous situation at compile time and crash during runtime...". So i suggest AGAIN that Euphoria alert of the ambiguilty before it runs instead of wasting all the runtime before the inevitable crash. It's not terribly reasonable to read the entirety of every include file and compare to every other include file, to check for duplicates procedure names, and not even Euphoria is alerting to this happening until that name is called in the program during runtime.

useless

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

18. Re: routine_id() is not working

eukat said...
jimcbrown said...
eukat said...

By itself, from the 4ft pov, true, no error as Euphoria is now. But Euphoria still put two sleeps into the same namespace, and it had to include both sleeps in the run code, because of routine_id() being called. In this example, neither sleep is namespaced.

Actually, that depends on the contents of sleep.e - which isn't either a 3.1 or 4.0 include file.

I had previously said, in reponce to a post by you in this thread:

said...

So if i write an include with a sleep proceedure in it, and then i include it and misc.e, no error should be thrown? This should not be a problem?

Well, I suppose it depends on the contents of that include.

eukat said...
jimcbrown said...
eukat said...

Had i included os.e also, there'd be 3 sleep()s in the same namespace,

Actually, the one in os.e would be in os.e's default namespace.

It's also in "no namespace", you can call it without specifying os:sleep.

Good point. Perhaps, in the case where there's a routine with a namespace and a routine without one, routine_id() should choose the routine without the namespace.

eukat said...
jimcbrown said...
eukat said...

and the program would happily begin running and not crash untill the program executed a routine_id(sleep), maybe hours later, with data loss. Come on Matt, surely Euphoria can be smarter than that.

It would not, as currently, routine_id(sleep) (assuming sleep is a variable containing the string "sleep") returns -1 instead of crashing. No crash, no data loss.

Only if i always wrote code to catch the -1 returned from routine_id() (even when i KNOW there is a procedure of the name i am routine_id'ing), which to me is like saying "i know Eu is going to overlook an ambiguous situation at compile time and crash during runtime...". So i suggest AGAIN that Euphoria alert of the ambiguilty before it runs instead of wasting all the runtime before the inevitable crash. It's not terribly reasonable to read the entirety of every include file and compare to every other include file, to check for duplicates procedure names, and not even Euphoria is alerting to this happening until that name is called in the program during runtime.

That's a good point. Adding better lint-type help is always a good idea imvho. I think this makes sense as a warning emitted by eui -test.

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

19. Re: routine_id() is not working

useless_ said...
mattlewis said...
useless_ said...

So if i write an include with a sleep proceedure in it, and then i include it and misc.e, no error should be thrown? This should not be a problem?

include sleep.e 
include misc.e 

Why shouldn't this generate an error report?

Because there are no errors in that code.

Now, try calling sleep without qualifying it. That's an error, because there is no way to tell which one you really wanted to call.

Matt

By itself, from the 4ft pov, true, no error as Euphoria is now. But Euphoria still put two sleeps into the same namespace, and it had to include both sleeps in the run code, because of routine_id() being called. In this example, neither sleep is namespaced.

I don't know what you mean by two sleeps in the same namespace. You seem to be talking about namespaces as they exist in, say, C++. The routines were in different files. This often happens, especially if you use a lot of 3rd party libraries. It becomes a problem when you want to use them. If you never use them, then there is no problem.

useless_ said...

Had i included os.e also, there'd be 3 sleep()s in the same namespace, and the program would happily begin running and not crash untill the program executed a routine_id(sleep), maybe hours later, with data loss. Come on Matt, surely Euphoria can be smarter than that.

Maybe. If you're putting a literal into routine_id, then we could resolve this at parse time. Of course, I'd ask why you're doing that and waiting until hours into run time. Better to do it up front and catch the error early. We've agreed that some optional error checking in routine_id makes sense. I'm not sure what else you're asking for.

Please read up on euphoria namespaces. You don't put something into a namespace. You use a namespace to point at a particular file to disambiguate from a symbol in another file. You may declare a default namespace for a file as a convenience, but again, this isn't some sort of sandbox around the symbols in the file. It's just an easy way to tell euphoria to look at that particular file.

Matt

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

20. Re: routine_id() is not working

mattlewis said...

Please read up on euphoria namespaces. You don't put something into a namespace. You use a namespace to point at a particular file to disambiguate from a symbol in another file. You may declare a default namespace for a file as a convenience, but again, this isn't some sort of sandbox around the symbols in the file. It's just an easy way to tell euphoria to look at that particular file.

Matt


Ah, the last two sentences are the crux of my misunderstanding. They should be in the manual, at the very top of the namespace section.

However, loading two procedures or function by the same name (and un-namespaced) being legal, but loading variables of the same name (and un-namespaced) isn't, seems wrong, because if the programmer didn't namespace them (include blah.e as blah), one or more of them cannot be used.

I don't read all of win32lib.e or it's many includes, so i might write a procedure of the same name as exists in win32lib. Or perhaps something under std/net (which has happened a few times the last few years). I doubt anyone reads all the proc names in every file they might include to see if that name is already taken.

For that reason, i suggest Euphoria "understand" transparently and automagically that all procedures and functions in includes are now addressable like filename:procname, if the programmer has not manually done so. And if i then include os.e and misc.e and then want to use sleep(), being that it's in two files and i didn't specify which one to use, Euphoria toss an error before it runs, letting me know to choose one.

useless

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

21. Re: routine_id() is not working

eukat said...

However, loading two procedures or function by the same name (and un-namespaced) being legal, but loading variables of the same name (and un-namespaced) isn't, seems wrong,

It is wrong. Loading variables of the same name (and un-namespaced) is legal.

-- a.e 
public object ab = 0 
-- b.e 
public object ab = 1 
-- main.ex 
include /dev/shm/a.e 
include /dev/shm/b.e 
eukat said...

because if the programmer didn't namespace them (include blah.e as blah), one or more of them cannot be used.

This makes sense, but on the other hand, there's a good chance that the identifiers with name conflicts won't be used at all in the main program.

eukat said...

I don't read all of win32lib.e or it's many includes, so i might write a procedure of the same name as exists in win32lib. Or perhaps something under std/net (which has happened a few times the last few years). I doubt anyone reads all the proc names in every file they might include to see if that name is already taken.

I doubt anyone uses every sumbol in win32lib.e et al.

eukat said...

For that reason, i suggest Euphoria "understand" transparently and automagically that all procedures and functions in includes are now addressable like filename:procname, if the programmer has not manually done so.

Like peu does?

eukat said...

And if i then include os.e and misc.e and then want to use sleep(), being that it's in two files and i didn't specify which one to use, Euphoria toss an error before it runs, letting me know to choose one.

This already happens...

-- c.e 
?-1 
include /dev/shm/a.e 
include /dev/shm/b.e 
?0 
?1 
?2 
?3 
?4 
?5 
?6 
?7 
?8 
?9 
? ab 

Running that with the earlier examples in this post gives

/dev/shm/c.e:14 
<0074>:: Errors resolving the following references: 
    'ab' (/dev/shm/c.e:14) has been declared more than once. 
        in /dev/shm/a.e 
        in /dev/shm/b.e 
 
? ab 
    ^ 
new topic     » goto parent     » topic index » view message » categorize

22. Re: routine_id() is not working

useless_ said...
mattlewis said...

Please read up on euphoria namespaces. You don't put something into a namespace. You use a namespace to point at a particular file to disambiguate from a symbol in another file. You may declare a default namespace for a file as a convenience, but again, this isn't some sort of sandbox around the symbols in the file. It's just an easy way to tell euphoria to look at that particular file.


Ah, the last two sentences are the crux of my misunderstanding. They should be in the manual, at the very top of the namespace section.

I think you're right. I've inserted this paragraph into the 4.1 manual under namespaces, right at the beginning:

manual said...

Euphoria namespaces are used to disambiguate between symbols (routines, variables, constants, etc) with the same names in different files. They may be declared as a default namespace in a file for the convenience of the users of that file, or they may be declared at the point where a file is included. Note that unlike namespaces in some other languages, this does not provide a sandbox around the symbols in the file. It is just an easy way to tell euphoria to look for a symbol in a particular file.

useless_ said...

However, loading two procedures or function by the same name (and un-namespaced) being legal, but loading variables of the same name (and un-namespaced) isn't, seems wrong, because if the programmer didn't namespace them (include blah.e as blah), one or more of them cannot be used.

That's true. Whenever I write a new file these days, I put a default namespace in. I don't always use them, but when I need to, it's available and easy to put in. The general idea is that you'll get an error as soon as you have a problem, and you can fix it right away.

I don't think that most people (or me, anyways) use routine_id as much as you do. These days, I mainly use it for things like GUI event handlers, or for dispatch in the translator (where a missing routine_id is noticed and an error is thrown). Adding checks when a literal is passed to routine_id would definitely help you (and others).

useless_ said...

I don't read all of win32lib.e or it's many includes, so i might write a procedure of the same name as exists in win32lib. Or perhaps something under std/net (which has happened a few times the last few years). I doubt anyone reads all the proc names in every file they might include to see if that name is already taken.

For that reason, i suggest Euphoria "understand" transparently and automagically that all procedures and functions in includes are now addressable like filename:procname, if the programmer has not manually done so. And if i then include os.e and misc.e and then want to use sleep(), being that it's in two files and i didn't specify which one to use, Euphoria toss an error before it runs, letting me know to choose one.

Hmm...that's an interesting idea. It seems like it would have to just be the file name, without any path qualifiers. Maybe even without extension. I suppose that explicit namespaces would override. What to do in the case where a file has a default namespace that clashes with a file name of another file included?

Ugh...I think it seems simpler to say, "just add a namespace to your include directive."

I know you're using 4.1 these days. I think you might be interested in include/euphoria/debug/debug.e. It lets you poke around the symbol table, among other things.

Matt

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

23. Re: routine_id() is not working

mattlewis said...

I suppose that explicit namespaces would override. What to do in the case where a file has a default namespace that clashes with a file name of another file included?

Well, default namespaces have this problem as well. There's nothing stopping me from editing eukat's sleep.e and changing the top line to 'namespace stdseq'.

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

24. Re: routine_id() is not working

jimcbrown said...
mattlewis said...

I suppose that explicit namespaces would override. What to do in the case where a file has a default namespace that clashes with a file name of another file included?

Well, default namespaces have this problem as well. There's nothing stopping me from editing eukat's sleep.e and changing the top line to 'namespace stdseq'.

That's true, but adding filenames now could break working code without changing the code. I'm not seeing a lot of benefit in doing this over what we have.

Matt

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

25. Re: routine_id() is not working

mattlewis said...
jimcbrown said...
mattlewis said...

I suppose that explicit namespaces would override. What to do in the case where a file has a default namespace that clashes with a file name of another file included?

Well, default namespaces have this problem as well. There's nothing stopping me from editing eukat's sleep.e and changing the top line to 'namespace stdseq'.

That's true, but adding filenames now could break working code without changing the code. I'm not seeing a lot of benefit in doing this over what we have.

Matt

Same here.

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

26. Re: routine_id() is not working

mattlewis said...
jimcbrown said...
mattlewis said...

I suppose that explicit namespaces would override. What to do in the case where a file has a default namespace that clashes with a file name of another file included?

Well, default namespaces have this problem as well. There's nothing stopping me from editing eukat's sleep.e and changing the top line to 'namespace stdseq'.

That's true, but adding filenames now could break working code without changing the code. I'm not seeing a lot of benefit in doing this over what we have.

Matt


Does that happen often now?

useless

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

27. Re: routine_id() is not working

eukat said...
mattlewis said...
jimcbrown said...
mattlewis said...

I suppose that explicit namespaces would override. What to do in the case where a file has a default namespace that clashes with a file name of another file included?

Well, default namespaces have this problem as well. There's nothing stopping me from editing eukat's sleep.e and changing the top line to 'namespace stdseq'.

That's true, but adding filenames now could break working code without changing the code. I'm not seeing a lot of benefit in doing this over what we have.

Matt


Does that happen often now?

I can't say the answer to that, but I do know that this change would in fact break the interpreter (we have multiple files called syncolor, multiple files called error, etc.) For really big projects that use multiple levels of subdirectories to organize files, I'd be suprised if this sort of thing was actually uncommon...

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

28. Re: routine_id() is not working

mattlewis said...
jimcbrown said...
mattlewis said...

I suppose that explicit namespaces would override. What to do in the case where a file has a default namespace that clashes with a file name of another file included?

Well, default namespaces have this problem as well. There's nothing stopping me from editing eukat's sleep.e and changing the top line to 'namespace stdseq'.

That's true, but adding filenames now could break working code without changing the code.

Matt

Menno's peu solved this problem, though I'm not sure if we'd want to adopt it.

Hmm .. there might be other issues. What if someone wanted to include "e.ex" as well as "e.e" ? Or "e!.ex" ? Or "0error.e" ?

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

29. Re: routine_id() is not working

jimcbrown said...
mattlewis said...
jimcbrown said...
mattlewis said...

I suppose that explicit namespaces would override. What to do in the case where a file has a default namespace that clashes with a file name of another file included?

Well, default namespaces have this problem as well. There's nothing stopping me from editing eukat's sleep.e and changing the top line to 'namespace stdseq'.

That's true, but adding filenames now could break working code without changing the code.

Matt

Menno's peu solved this problem, though I'm not sure if we'd want to adopt it.

Hmm .. there might be other issues. What if someone wanted to include "e.ex" as well as "e.e" ? Or "e!.ex" ? Or "0error.e" ?


Now you're sounding like a wrongfull-injury lawyer. No matter what you make, someone will work hard enough to get injured by it. You are talking about willfully editing files to re-namespace them, or re-naming them to existing filenames.

useless

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

30. Re: routine_id() is not working

eukat said...
jimcbrown said...
mattlewis said...
jimcbrown said...
mattlewis said...

I suppose that explicit namespaces would override. What to do in the case where a file has a default namespace that clashes with a file name of another file included?

Well, default namespaces have this problem as well. There's nothing stopping me from editing eukat's sleep.e and changing the top line to 'namespace stdseq'.

That's true, but adding filenames now could break working code without changing the code.

Matt

Menno's peu solved this problem, though I'm not sure if we'd want to adopt it.

Hmm .. there might be other issues. What if someone wanted to include "e.ex" as well as "e.e" ? Or "e!.ex" ? Or "0error.e" ?

Now you're sounding like a wrongfull-injury lawyer. You are talking about willfully editing files to re-namespace them, or re-naming them to existing filenames.

The renaming examples were all real. "e!.ex" was the name of the file used by the e! intepreter, an Euphoria runtime interpeter (which broken when 2.4 came out and dynamic including was no longer possible). 0rror.e (or 0rror.c) is actually produced and used by the translator when bootstraping Euphoria itself. "e.ex" and "e.e" were shorthand for backend.e and backend.ex, in euphoria/source.

eukat said...

No matter what you make, someone will work hard enough to get injured by it.

Good point. That's excellent justification for leaving the entire namespace system as-is.

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

31. Re: routine_id() is not working

useless_ said...

Now you're sounding like a wrongfull-injury lawyer. No matter what you make, someone will work hard enough to get injured by it. You are talking about willfully editing files to re-namespace them, or re-naming them to existing filenames.

Yes, they will. But doing something that we know will cause pain is something that requires significant benefits. I'm just not seeing the benefits here.

Matt

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

32. Re: routine_id() is not working

jimcbrown said...

(which broken when 2.4 came out and dynamic including was no longer possible)

At the risk of sounding petty, it was 2.5 that broke dynamic including.

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

33. Re: routine_id() is not working

petelomax said...
jimcbrown said...

(which broken when 2.4 came out and dynamic including was no longer possible)

At the risk of sounding petty, it was 2.5 that broke dynamic including.

Whoops. You're right. Thanks for the correction.

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

Search



Quick Links

User menu

Not signed in.

Misc Menu