1. export & public

Dear EU users,

We have now two new key words which are useful, but words themselves are not clear enought and require some broad explanations.

I'd like to see just "up" instead of "export"

up procedure foo() 
    ... 
end procedure 
 
up constant FOO=0 

Same about "public" - just "and_up".

and_up function fOO() 
     ... 
end function 
 
and_up include foo.e 

There is nothing to do with "export" and "public" in programming at all, I think.

There is just one level or more *up* in scope.

In Russian mode of bilingual EU 2.5 there is no my favourite "global" at all, for example.

Instead used Russian word "vezde" which means "anywhere" in English, not "global".

What do you think, guys?

Regards, Igor Kachan kinz@peterlink.ru

new topic     » topic index » view message » categorize

2. Re: export & public

kinz said...

Dear EU users,

We have now two new key words which are useful, but words themselves are not clear enought and require some broad explanations.

I'd like to see just "up" instead of "export"

[snip]

There is nothing to do with "export" and "public" in programming at all, I think.

There is just one level or more *up* in scope.

Public is certainly a very common term, especially with object oriented languages. It generally means that the identifier is visible outside of its module / class / etc.

I think that export is fairly clear as well (at least to a native English speaker). I'm not aware of any other examples of export used in relation to scope, but its opposite, "import" is very common.

The use of "up" seems less clear to me, since the other two already have denotations and connotations related to scope.

kinz said...

In Russian mode of bilingual EU 2.5 there is no my favourite "global" at all, for example.

Instead used Russian word "vezde" which means "anywhere" in English, not "global".

What do you think, guys?

Global is, in fact, a synonym for anywhere in English.

Matt

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

3. Re: export & public

I agree with Matt on this one.

Jeremy

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

4. Re: export & public

jeremy said...

I agree with Matt on this one.

Jeremy

Ok, guys, why not?

But there is Wiki now on Web, it says about "export": http://en.wikipedia.org/wiki/Export http://en.wikipedia.org/wiki/Export_(disambiguation)

And in EU 4.0 this "export" is just "one level up" and nothing more, so I'd prefer just "up".

Then, about "public" same Wiki says: http://en.wikipedia.org/wiki/Public

And in EU 4.0 this "public" is just "one level up" and almost nothing more, so I'd prefer just "and_up".

Also, about "global" we can see: http://www.merriam-webster.com/dictionary/global

But about "anywhere" that Webster doesn't say that it is a synonym of "global": http://www.merriam-webster.com/dictionary/anywhere

So, I like EU 4.0, but it seems too complicated to me because of discrepancy of new key words to real sence of commands which they express.

Regards, Igor Kachan kinz@peterlink.ru

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

5. Re: export & public

Hi

I would like to further the discussion on this one.

Having given this some considerable thought, I can't help thinking that the new, modernised, include system is somewhat inelegant. Look at the problems that have been had with Langwar (admittedly the current problem is not an include problem, but one of memory management).

The current idea seems to be to include whatever files you want to include, within the files that you include (this is why its inelegant - its moved away from the beautiful simplicity of eu3). This has been explained in various ways (by means of foo, bar.e etc, many times, and yet when it comes to implement it (in Langwar for instance), it just seems to fall over.

Derek's comment, that I was not supposed (or recommended) to include std.e will I suspect become one that will come back to haunt him time and again, as beginners, and lazy programmers (myself included), who simply want the job done quickly, without having to hunt through the st include library to find the function (and dependencies) that they want, will just include std.e

The old eu include system, while it had its faults, was quick, and simple to use, and any namespace problems could be resolved by changing the name of the function, or by using namespace qualifiers. (specifically, put the includes for the entire program in the head of the main program, and then allow allow functions etc, in the main program, and the includes, find the functions etc called below them)

To have to specify the scope of functions, procedures etc within include files, and then to have to specify that the include is public, and it is allowed to access it, and then to make sure add include directives to any sub includes is wrong (IMHO), and certainly a step away from the original goals of euphoria to be a simple to write programming language.

If you come back and say, that's not how it is, lets explain it to you again, then this just goes to illustrate my point. I certainly do not hope to attain the heady heights of computer programming attained by Derek and Matt, but I am no newby with either programming or euphoria, and I suspect that if I am having problems, then many other people will be too.

My request is therefore this - continue with forward referencing of functions and procedures and the language keyword list, but remove the include directives, public and export, and allow multiple level includes includes again, or add another directive that allows the 'sloppy' include method.

Derek asked me if I had downloaded the SVN version - in this instance I think it important that I do not, but I will continue to download, and rigorously punish any alpha release that comes along, as I will have no preconceived notion of what I should and should not be doing, that the devs will have acquired through there day to day involvement with the language.

I would like to stress that the developers have done a great job to get eu 4 to where it is, most of the programs I test run with little or no mods, and some work arounds, (DOS programs too) but that include system is going to be a nightmare. The programs that include files are generally only include level deep, and are the 3.1 includes.

Hope I haven't put too many noses out of joint. And of course, the whole development cycle may have gone too far to backtrack, but if this is the case, then I suspect that there will be drop off of current users, or at least a reluctance to leave 3.x behind, despite the advantage that 4 offers.

Chris

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

6. Re: export & public

Igor: I think that your problem is that there is no Russian word for 'public'
another word for public might be the Russian word for 'open'.

Chris:
The include system for ver. 4.0 is much improved from ver. 3.1
Once you start to understand how to use it I think you will like it
a lot better because it allows you to completely control what is
allowed to be visible between each include file.
Bernie

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

7. Re: export & public

ChrisB said...

The current idea seems to be to include whatever files you want to include, within the files that you include (this is why its inelegant - its moved away from the beautiful simplicity of eu3). This has been explained in various ways (by means of foo, bar.e etc, many times, and yet when it comes to implement it (in Langwar for instance), it just seems to fall over.

I don't think that it falls over at all. It's true that 4.0 (including the standard library) is not fully backwards compatible with 3.1, and it does take a bit of work to migrate code like langwar. First, I'd say that we didn't break things lightly, but that we did look to see where things could really be improved, and where breaking some backwards compatibility was beneficial.

More on why I think the changes to the include system were beneficial below...

ChrisB said...

Derek's comment, that I was not supposed (or recommended) to include std.e will I suspect become one that will come back to haunt him time and again, as beginners, and lazy programmers (myself included), who simply want the job done quickly, without having to hunt through the st include library to find the function (and dependencies) that they want, will just include std.e

That's certainly one way to do things. It does increase the odds of namespace conflicts, requiring additional work to deconflict those issues. The new standard library is a lot bigger than the old one, and there are conflicts between different files in the standard library, and with some built-ins, such as find().

One of the key advantages of the new scoping and include system is that it's easier to insulate code in one file from interfering with others. It's probably true that your own code in a file is unlikely to conflict in a single application, but this also applies to 3rd party libraries.

Here is a contrived example. Suppose that for some reason, you had a project that used both win32lib and arwen. I haven't looked at arwen closely, but I would be surprised if there weren't some namespace conflicts with win32lib (and if I'm wrong, then imagine that they are two other libraries that you are usingmaybe you need to connect to two different types of database). In 3.1, it was very possible to have two 3rd party libraries conflict with each other. Due to the global scoping of euphoria, the only way to resolve such a problem (remember, the namespace error is occurring within the libraries, not in any code that you wrote!) was to edit one or both of the libraries.

ChrisB said...

The old eu include system, while it had its faults, was quick, and simple to use, and any namespace problems could be resolved by changing the name of the function, or by using namespace qualifiers. (specifically, put the includes for the entire program in the head of the main program, and then allow allow functions etc, in the main program, and the includes, find the functions etc called below them)

The new way of doing things really isn't much more difficult. It's true that you'll need to put the include statements in each file. But in addition to the benefit of not having 3rd party conflicts, you have the additional benefit of more self documenting code, in that it's clearer what dependencies for a particular file are. It also reduces the potential for namespace conflicts, so code is more likely to 'just work' without having to qualify symbols.

ChrisB said...

To have to specify the scope of functions, procedures etc within include files, and then to have to specify that the include is public, and it is allowed to access it, and then to make sure add include directives to any sub includes is wrong (IMHO), and certainly a step away from the original goals of euphoria to be a simple to write programming language.

I think that a problem is that the intention of the system hasn't been explained and demonstrated. During development, we noted that we needed to explain and educate a wider audience to understand how the new things worked and to explain the benefits and the drawbacks. That hasn't really happened, though now that we've actually released a version to the public, we need to get moving on that (and here is one instance smile ).

The "public include" mechanism is really meant for library developers. First, one assumption behind 4.0 was that the global scope was too open, and invites problems - many of which become apparent mainly in large projects, and especially those that use multiple 3rd party libraries.

While some libraries work well as single files, there are others, such as win32lib, that are easier to maintain and work with if they are multiple files. However, it is often desirable to present a clean interface to consumers of the library. Not all win32lib routines called by a win32lib app actually reside in the Win32Lib.ew file. With global scope, this isn't a problem in exposing functionality to the consumer, though now we can have lots of namespace issues.

Initially (in 4.0 development), we had just the public scope in addition to global. So we could expose a symbol from a file, and also allow the scope of the symbol to propagate through a "public include" statement. This would allow the developer to put API routines anywhere in his multi-file library. But in this system, there is no way to limit the scope of a symbol to only be used within the files of win32lib.

Enter the export scope. This declares symbols that cannot be propagated through additional include statements. So a library author could have internal library implementation that would remain hidden to the consumer of his library, but could be visible to multiple files within his library.

So that's a quick history of how the current scopes came to be, and some basic rationale for their existence.

ChrisB said...

If you come back and say, that's not how it is, lets explain it to you again, then this just goes to illustrate my point. I certainly do not hope to attain the heady heights of computer programming attained by Derek and Matt, but I am no newby with either programming or euphoria, and I suspect that if I am having problems, then many other people will be too.

I guess I don't understand what you're illustrating here. There are some new concepts, and I agree that we need to communicate better about this. Undoubtedly, the documentation could be improved, and there's probably FAQ or wiki content that could/should be created. For the typical user, however, I think that it's still pretty easy.

If you're just using other people's code (including the standard library) then usually all you need to do is to put a regular old include statement in your file, and then use the code. If you're designing libraries for other people to use, then there are some additional things you need to think about, because 4.0 offers some more powerful tools in the way of scoping the contents of your library.

ChrisB said...

My request is therefore this - continue with forward referencing of functions and procedures and the language keyword list, but remove the include directives, public and export, and allow multiple level includes includes again, or add another directive that allows the 'sloppy' include method.

The 'sloppy' include method still works. Well, it still works so long as you are using global symbols. After due consideration on the development list, and in the same process that gave us the scopes that we now have, the decision was made to reduce the reliance on global, mainly for the reasons I gave above, but I'm sure there were others.

In short, the cost is that you type some additional include statements. The benefit is that you will eliminate namespace conflicts between 3rd party libraries, and also reduce the frequency of namespace conflicts and the requirement to qualify references in your own code.

ChrisB said...

Derek asked me if I had downloaded the SVN version - in this instance I think it important that I do not, but I will continue to download, and rigorously punish any alpha release that comes along, as I will have no preconceived notion of what I should and should not be doing, that the devs will have acquired through there day to day involvement with the language.

That's fine. I think Derek's point was that he'd made some fixes in response to your report, and wanted you to test them out to see if they fixed the issues. You're absolutely correct that it's important to get outside reviews and testing. We've knocked down an awful lot of bugs, but there are lots of little corners out there that we probably haven't touched. It's worth noting that we have written lots of unit tests for euphoria 4.0, and continue to add them as issues come up. It's helped us a lot, and will continue to help us.

ChrisB said...

I would like to stress that the developers have done a great job to get eu 4 to where it is, most of the programs I test run with little or no mods, and some work arounds, (DOS programs too) but that include system is going to be a nightmare. The programs that include files are generally only include level deep, and are the 3.1 includes.

I think that once you get a little more familiar with it, it won't be so bad. We've even got some tools to help migrate to the new standard library. They're in the source directory (dis.ex), and unfortunately not well (or at all!) documented, which needs to be remedied. There is actually an option to have dis.ex generate a graph showing you how all of your include files are related (NB: you'll need to install GraphViz to get the graphs).

ChrisB said...

Hope I haven't put too many noses out of joint. And of course, the whole development cycle may have gone too far to backtrack, but if this is the case, then I suspect that there will be drop off of current users, or at least a reluctance to leave 3.x behind, despite the advantage that 4 offers.

I think that there will definitely be a reluctance, as there is with every major version of any piece of software. But I think that once people get comfortable with the additions, they'll be very happy with [most] of what euphoria 4.0 has become.

And this has been much more civil than the developer list often becomes.

Matt

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

8. Re: export & public

ChrisB said...

Having given this some considerable thought, I can't help thinking that the new, modernised, include system is somewhat inelegant. Look at the problems that have been had with Langwar (admittedly the current problem is not an include problem, but one of memory management).

Programs that are written assuming the global protocol may have problems using the v4 standard library. Langwar was one of those. These programs will however run fine using the v3 library with the v4 interpreter (aside of any clashes with new keywords).

And as you say, the problem with Langwar right now has nothing to do with the public verses global scoping rules.

ChrisB said...

The current idea seems to be to include whatever files you want to include, within the files that you include (this is why its inelegant - its moved away from the beautiful simplicity of eu3). This has been explained in various ways (by means of foo, bar.e etc, many times, and yet when it comes to implement it (in Langwar for instance), it just seems to fall over.

My view is the v3 scoping is simplistic rather than simple. I too feel that simplicity is a goal worth striving for, and, as I think Einstein was heard to say, "... but not too simple..."

I'm not sure what your sentences above actually mean. Maybe you can clarify it with an example?

As for your assertion that "when it comes to implement it, it just seems to fall over". I have no evidence to back you up there. To the contrary, I have evidence that the new public scope rules work well. Again, maybe you can supply some example that demonstrates your position.

ChrisB said...

Derek's comment, that I was not supposed (or recommended) to include std.e will I suspect become one that will come back to haunt him time and again, as beginners, and lazy programmers (myself included), who simply want the job done quickly, without having to hunt through the st include library to find the function (and dependencies) that they want, will just include std.e

The reason that I created std.e, and argued for its inclusion, was to enble amateur and Q&D programming to continue to be easy to achieve. Sometimes we just have to resort to this style, but I do see it as an exception and not the normal way one ought to code.

The recommendation I talk about, is based on the idea that the use of std.e will generally add to the cost of maintenance for those programs that will have a long lifetime. If you are writing a program that is not intended to have a long development life and/or involve a large team of people over its lifetime, then the use of std.e might be cost-effective. However in other scenarios it wouldn't be and thus I cannot recommend its use, in the general case.

ChrisB said...

The old eu include system, while it had its faults, was quick, and simple to use, and any namespace problems could be resolved by changing the name of the function, or by using namespace qualifiers. (specifically, put the includes for the entire program in the head of the main program, and then allow allow functions etc, in the main program, and the includes, find the functions etc called below them)

Firstly, the ability to code using the "old" system has not been done away with, except when referring to identifiers in the standard library. Anyone is free to write their own include files (libraries) using the global scope if the want to. We have not prevented that at all.

As for "changing the name of the function" to resolve things, I'm sure you'll recognise that such course of action may not be possible, or desirable, in many circumstances. Especially if the library files you are going to change are being maintained by someone else. The namespace qualifiers are still available to you. In fact, they have been enhanced to allow better and easier control of name clash resolutions. One of the benefits of the public scope is to lessen the need to resolve clashes by preventing them occuring in the first place.

ChrisB said...

To have to specify the scope of functions, procedures etc within include files, and then to have to specify that the include is public, and it is allowed to access it, and then to make sure add include directives to any sub includes is wrong (IMHO), and certainly a step away from the original goals of euphoria to be a simple to write programming language.

No, it is not wrong, it but merely different from what you expected. But before we continue, can you have a look at these concepts ...

Coupling
Cohesion

I'd also like to point out that no one is being forced to code in the manner you just suggested. In fact, that manner would be an odd way to do things.

We approached the public scope concept with the idea that a module should be responsible for its own code. Among other things, this means that if a module is to refer to an indentifier that is declared in another file then that module should explictly ask for the identifier's declaration file.

This means that if a statement in foo.e refers to bar, which is declared in bat.e, then foo.e should include bat.e and this include will not effect any file that just hapens to include foo.e. We are trying to avoid unintentional side-effects. With the global scope, when you added a library to your applicaiton, you were never sure if there were going to be name clashes or not. With public (and export) scope you can be sure that just adding a library to your applicaiton will not cause any clashes that force you to modified someone else's code.

ChrisB said...

If you come back and say, that's not how it is, lets explain it to you again, then this just goes to illustrate my point. I certainly do not hope to attain the heady heights of computer programming attained by Derek and Matt, but I am no newby with either programming or euphoria, and I suspect that if I am having problems, then many other people will be too.

I don't think it illustrates your point at all. I think it shows that we have done a poor job of preparing for this release. There is not enough good documentation about the changes, the rationale behind them, and tips about how to get the best out of them. Thankfully, alpha testers like yourself can show us where we need to concentrate our next priorities.

ChrisB said...

My request is therefore this - continue with forward referencing of functions and procedures and the language keyword list, but remove the include directives, public and export, and allow multiple level includes includes again, or add another directive that allows the 'sloppy' include method.

Your friend, global still exists. The use of std.e will facilitate "sloppy" coding practices with respect to using the standard library.

ChrisB said...

Derek asked me if I had downloaded the SVN version - in this instance I think it important that I do not, but I will continue to download, and rigorously punish any alpha release that comes along, as I will have no preconceived notion of what I should and should not be doing, that the devs will have acquired through there day to day involvement with the language.

That's fine too. I just assumed you'd want to get fixes as soon as you could, so you can continue with testing the rest of the stuff without having to wait for each new alpha release.

ChrisB said...

I would like to stress that the developers have done a great job to get eu 4 to where it is, most of the programs I test run with little or no mods, and some work arounds, (DOS programs too) but that include system is going to be a nightmare. The programs that include files are generally only include level deep, and are the 3.1 includes.

As a transition tool, we have allowed the v3 and v4 libraries to co-exist so that coders can migrate (or not) their code in a timeframe that suits them. There are also a few little utilities written that can help with converting and analyzing existing code. We need to document them though.

ChrisB said...

Hope I haven't put too many noses out of joint. And of course, the whole development cycle may have gone too far to backtrack, but if this is the case, then I suspect that there will be drop off of current users, or at least a reluctance to leave 3.x behind, despite the advantage that 4 offers.

Time will tell. We firmly believe that the new features in v4, even though some will break existing code, are worth the effort of migration and learning new tricks. For new comers to Euphoria, we hope that they will not be bogged down with the v3 coding mentality.

As a personal note, I couldn't go back to v3 now because coding in v4 is just so much easier, clearer, and cleaner. And I know that the things planned for the releases after v4.0 will increase the pleasure of using Euphoria over v3, and most other languages too for that matter.

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

9. Re: export & public

source/std.ex

to show missing std/includes or unresolved references
exwc source/std.ex someprog.ex 

output is on the console, and will create ex.err you can view or open in a text editor. this can fail if for ex you are beginning to convert an eu3 program and still have include misc.e or a known eu4 keword like loop used as a variable. you would want to start by fixing any includes you know will need to change and avoid mixing v3. and v4 includes. although it may work if you are lucky.

unfortunately, source dir was excluded from the first alpha distribution. grab the source dir from svn and create rev.e if you want to try dis or std before the next eu4 alpha or beta.

analize.ex

shows missing includes.
win: 
exwc eu4\bin\analize.ex someprog.ex 
nix: 
exu eu4/bin/analize.ex someprog.ex 

analize can also catalog 3rd party libs by including their include path in an euinc.conf or -i ..\..\path on the commandline

if you have many files and directories on your euinc path this can take some time and memory on a slower computer. you will probably want to limit the paths accordingly.

-TEST

used as a commandline option,

don't run the program just parse it and return any errors
exwc -TEST someprog.ex 

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

10. Re: export & public

I haven't tried to translate dis.ex or std.ex maybe that would be an alternative to including the full source dir? for a complicated graph you can use an image editor with zoom to view the pics. possibly you can drag them from the html browser.

text lifted from a posting by Matt 10/08, svn1206 or later.

source/dis.ex

graphviz.org to get graphviz.
make sure graphviz/bin is in your path or make a batch to call it.

$ dot -V 
should get something like: 
dot - Graphviz version 2.20.2 (Mon Jul 7 20:50:29 GMT 2008)

exwc EU4\source\dis app --html -g -d appdis 
to see the graphs start appdis\index.html  

Breakdown of the command line:

  • dis is just dis.ex (located in the source dir)
  • app is your app
  • --html tells it to give you html output
  • -g suppresses all of the call graphs (this can take a long time, and I don't think you're really interested in this)
  • -d appdis tells dis to put its output in the appdis subdir (whichwill be created if necessary).
  • By default, it filters out the standard library. You can add the '-s' option to include information on the standard library. Basically, it just looks to see if "std/" is in the path of the file.

Once it's finished, go into the appdis dir, and look at index.html. It will give you a giant diagram of all of the includes in your app. You can click on the file links on the left to see just the details for a specific file (i.e., which files included it, and which files it included).

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

11. Re: export & public

Bernie wrote:

Igor: I think that your problem is that there is no Russian word for 'public' another word for public might be the Russian word for 'open'.

Hi Bernie,

No, we have this word in many variants and they all sound almost just as English - "publika" - public, people; "publichnyj" - for public; "publikovat'" - to make visible for public, etc.

For "open" there is different word - "otkrytyj", so I do not have any problem with understanding what really means "public".

But in EU 4.0, this word is not suitable, I think.

If I'll update the bilingual EU 2.5 to 4.0, its "public" become "and_up" to be absolutely clear in specific Euphoria context.

Same about "export". Translated to Russian, it will be the Russian equivalent to "up".

Regards, Igor Kachan kinz@peterlink.ru

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

12. Re: export & public

Hi

Matt and Derek

Thanks for that, I'm actually reasonably reassured, and shall endeavour to learn the new methods. I think I have some basic conceptualisation to do still, but given your explanations the curve doesn't look too steep.

Chris

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

13. Re: export & public

ne1uno said...

I haven't tried to translate dis.ex or std.ex maybe that would be an alternative to including the full source dir? for a complicated graph you can use an image editor with zoom to view the pics. possibly you can drag them from the html browser.

text lifted from a posting by Matt 10/08, svn1206 or later.

I've made this into a wiki page:

http://openeuphoria.org/wiki/euwiki.cgi?dis.ex

Matt

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

14. Re: export & public

analize.ex hasn't been updated to the new map:put syntax change from a function to a procedure yet.
and the doc still indicate it returns the updated map. confusing even if the map is indeed updated.

just remove the variable = m:put in 2 places
about line 55 and line 135 change

thevarb = m:put(...) 
to just 
  m:put(...) 
new topic     » goto parent     » topic index » view message » categorize

15. Re: export & public

I am only replying so that my silence is not interpreted as anything, other than my disinterest in trying to have yet another fruitless dialog with Mr Kachan.

This is a programming language and not English. It is based upon the English language and reserves the right to adapt existing words to express concepts that are not covered by existing English words. Even in English, it is common for a given word to have different meanings depending on the context that the word is found in. You might like to broaden your mind to encompass the idea that sees the Euphoria language as a new context for English words.

With this in mind, a "public" symbol has been re-used to to express the concept that a symbol is "available to anyone (the public), so long as they explicitly choose to include it". As an analogy, a playground might be declared as public, but it does not mean that you can use it until you actually go there.

The idea of a "public" include is a type of shorthand insomuch as the public symbols in the file being included are deemed to have been declared as public in the file using the "public include". There is no obvious word to use from English to express this idea. An analogy might be that you have a ticket to go from London to Melbourne, but on route you need to change planes at Dubai - You don't have a ticket for Dubai but the one you have allows access to any number of way-stops on the main route. In a similar idea, a public symbol is normally only a "ticket" to the next stop, but a "public include" enables that "ticket" to be used as a transit ticket to a third destination. This is normally only used by library authors who are writing a large library consisting of many files instead on one large monolithic file. The "public" symbols are there for people to access the library's API even though they might have been declared in sub-library files. THat sort of implementation detail is not relevant to the application author.

Consider the Win32lib. It consists of many files. Each of these files can declare public symbols which are intented to be used by the application coder. However, because a public symbol is only made available to files directly including it, these sub-library declarations would actually be invisible to the application. To assist library writers, we developed the idea of a "public" include. Its job to make available public symbols in sub-library files to the application coder - AS IF they were declared "public" in the main library file.

The term "export" is being used to express the concept that a symbol might be needed within a multi-file library but is not really a part of the API. This is a way to allow library authors to develop a multi-file library that contains symbols that are designed to only be used internally within the library's own files. These "export" symbols behave like "public" ones in that they are exposed to the file that includes them, but a "public include" does not propagate them any further along the include chain. Again, there is not a simple English word to cover this concept. (On a personal note, I voted against the word "export" and wanted to use the word "library" because these are library-internal symbols, but I was out voted - such is life.)

I must say that the terms "up" and "and_up" are very poor choices. There is no "up" as a direction of propagation. That concept depends on the model one uses to describe the relationships between files in a Euphoria application. It might apply to an inverted tree model, but it is not an absolute term that applies to all models. However, if your Russian speakers will get benefit then of course use these approximations.

This is not a discussion; just my thoughts on the subject.

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

16. Re: export & public

I read the doc about scope and the difference between public and export is not explained. Both words seem to means the same.
Plus what it the effect of: public include .... ?


Thanks to develloppers and keep the good work.
jacques d.

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

17. Re: export & public

...

Key word "up" means "one level UP to user of the library".

Key word "and_up" means "one or more levels UP to user of the library".

Just try to explain your "export" and "public" to EU new comer, and you will come to these short formulas above (but after reading pages and pages of docs and discussions).

Thanks to all. The question seems to be settled.

Regards, Igor Kachan kinz@peterlink.ru

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

18. Re: export & public

ne1uno said...

analize.ex

shows missing includes.
win: 
exwc eu4\bin\analize.ex someprog.ex 
nix: 
exu eu4/bin/analize.ex someprog.ex 

analize can also catalog 3rd party libs by including their include path in an euinc.conf or -i ..\..\path on the commandline

if you have many files and directories on your euinc path this can take some time and memory on a slower computer. you will probably want to limit the paths accordingly.

This program needs finished actually. It should create a database of the source directories and only scan what it has not scanned in the past. This is not a hard upgrade, maybe I can get to it this weekend. It would of course store the file date/time to detect file changes and rescan that file. Anyway, that would provide drastic speed increases.

Jeremy

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

19. Re: export & public

kinz said...

...

Key word "up" means "one level UP to user of the library".

Key word "and_up" means "one or more levels UP to user of the library".

Just try to explain your "export" and "public" to EU new comer, and you will come to these short formulas above (but after reading pages and pages of docs and discussions).

Um, "up" and "and_up" are two very, very confusing words to me and I've explored many programming languages. "export" and "public" are very common programming words and are very easily explained to anyone, a Eu newbie or veteran. export = make the item visible to it's parent (i.e. the opposite of import) and only to it's parent, no matter what it's parent thinks should be done with it. public = make it available to it's parent and allow it's parent to do with it whatever it thinks is necessary, after all it is usable to the general public.

I guess I would be open to a different word for public and or export but we thought long and hard before making that choice. up and and_up are not better choices. If we come up with better choices, I would be up for more conversation on the subject.

Jeremy

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

20. Re: export & public

jacquesd said...

I read the doc about scope and the difference between public and export is not explained. Both words seem to means the same.
Plus what it the effect of: public include .... ?


Thanks to develloppers and keep the good work.
jacques d.

Jacques,

Take a peek at: http://openeuphoria.org/docs/eu400_0012.html#_74_Scope and see if that helps.

Jeremy

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

21. Re: export & public

jacquesd said...

I read the doc about scope and the difference between public and export is not explained. Both words seem to means the same.
Plus what it the effect of: public include .... ?

They are similar. Both allow symbols to be exposed to a file that includes the file in which they are declared. public symbols can possibly be seen by the files that included the file, etc, assuming public include is used to include the files. Here is a simple example:

libA.e said...
export constant A_EXPORT = 0 
public constant A_PUBLIC = 0 
       constant A_LOCAL  = 0 
libB.e said...
public include libA.e 
  -- these are legal: 
? A_EXPORT 
? A_PUBLIC 
  -- this is not: 
? A_LOCAL 
libC.e said...
include libA.e 
  -- these are legal: 
? A_EXPORT 
? A_PUBLIC 
  -- this is not: 
? A_LOCAL 
libD.e said...
public include libB.e 
  -- this is legal: 
? A_PUBLIC 
  -- these are not: 
? A_EXPORT 
? A_LOCAL 
libE.e said...
include libD.e 
  -- this is legal: 
? A_PUBLIC 
  -- these are not: 
? A_EXPORT 
? A_LOCAL 
libF.e said...
include libC.e 
  -- these are not legal 
? A_PUBLIC 
? A_EXPORT 
? A_LOCAL 

I've just shown several different files that have varying visibility of the symbols in libA.e. Of course, only libA.e can use symbols declared as local (i.e., no modifiers), just like 3.1. And we can see that all the files that directly include libA.e can use A_EXPORT and A_PUBLIC. None of the files that did not directly include libA.e can use A_EXPORT.

The key difference shows up between libE.e and libF.e. Notice that libE.e can still use A_PUBLIC, while libF.e cannot. This is because:

libE.e includes libD.e public includes libB.e public includes libA.e
libF.e includes libC.e includes libA.e

Basically, the public include directive passes along any public symbols it can see in any other files. It may have been able to see them because it directly included the file, or because of other public include directives in files it included (as the example above shows).

Mattt

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

22. Re: export & public

ChrisB said...

Having given this some considerable thought, I can't help thinking that the new, modernised, include system is somewhat inelegant.

I've got a program (BBCMF) that uses almost 100 included files, and I find the new include system to be useful, especially in maintaining the modularity of the include files.

Think of it this way: each include file makes sure to include all the files it needs, so you don't have to in your main program. You just plug it in and it's ready to go.

ChrisB said...

Look at the problems that have been had with Langwar (admittedly the current problem is not an include problem, but one of memory management).

This is probably an issue of learning/adapting to a new method. There's a learning curve for any programming language, and there will be a slight one for Euphoria 4.0. I experienced it and it was painless, quick, and easy.

ChrisB said...

The current idea seems to be to include whatever files you want to include, within the files that you include (this is why its inelegant - its moved away from the beautiful simplicity of eu3).

That beautiful simplicity had problems of its own, made apparent as programs grow in size and the need for a multitude of libraries increased. Eu4 is still beautiful and simple. But now it has the mechanisms in place for advanced uses that Eu3 did not have.

ChrisB said...

...will just include std.e

That's why it's there, so don't fret it. Use it. smile

ChrisB said...

I certainly do not hope to attain the heady heights of computer programming attained by Derek and Matt, but I am no newby with either programming or euphoria, and I suspect that if I am having problems, then many other people will be too.

I'm basically in that position, and I have had no problems. I figure if I can do it, so can you. smile

ChrisB said...

...or add another directive that allows the 'sloppy' include method.

I think we're wanting to get away from what was "not good" with Eu3, so I don't think we'll be going back to it.

ChrisB said...

...that include system is going to be a nightmare.

I thought this at first as well. But it's really not.

ChrisB said...

I suspect that there will be drop off of current users, or at least a reluctance to leave 3.x behind, despite the advantage that 4 offers.

I would be very surprised if a Eu3 programmer experienced Eu4 and decided not to switch.

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

23. Re: export & public

euphoric said...
ChrisB said...

Having given this some considerable thought, I can't help thinking that the new, modernised, include system is somewhat inelegant.

I've got a program (BBCMF) that uses almost 100 included files, and I find the new include system to be useful, especially in maintaining the modularity of the include files.

Well, I see that ChrisB's issues were already addressed, and with more clarity than I gave. Next time I'll read the entire thread before speaking up. However, I think my experience in converting to Eu4 is still enlightening. smile

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

24. Re: export & public

To present Matthew's example in a different way ...

libA.e said...
global constant A_GLOBAL - 0 
export constant A_EXPORT = 0 
public constant A_PUBLIC = 0 
       constant A_LOCAL  = 0 
libB.e said...
public include libA.e 
libC.e said...
include libA.e 
libD.e said...
public include libB.e 
libE.e said...
include libB.e 
libF.e said...
include libD.e 
libG.e said...
include libC.e 

'Y' = is visible

Symbol A
declaration file
B
public include A
C
include A
D
public include B
E
include B
F
include D
G
include C
A_GLOBAL Y Y Y Y Y Y Y
A_PUBLIC Y Y Y Y Y Y -
A_EXPORT Y Y Y - - - -
A_LOCAL Y - - - - - -

Focusing just on the public and export declared symbols ...

  • public
    • libB can see the public symbols from A because it directly includes A.
    • libC can see the public symbols from A because it directly includes A.
    • libD can see the public symbols from A because it directly includes B, which public includes A.
    • libE can see the public symbols from A because it directly includes B, which public includes A.
    • libF can see the public symbols from A because it directly includes D, which public includes B, which public includes A. This is the propagation of public symbols.
    • libG can not see the public symbols from A because it does not include anything that has propagated A's public symbols.
  • export
    • libB can see the export symbols from A because it directly includes A.
    • libC can see the export symbols from A because it directly includes A.
    • libD can not see the export symbols from A because it does not directly include A.
    • libE can not see the export symbols from A because it does not directly include A.
    • libF can not see the export symbols from A because it does not directly include A.
    • libG can not see the export symbols from A because it does not directly include A.
new topic     » goto parent     » topic index » view message » categorize

25. Re: export & public

jeremy said...
kinz said...

...

Key word "up" means "one level UP to user of the library".

Key word "and_up" means "one or more levels UP to user of the library".

Just try to explain your "export" and "public" to EU new comer, and you will come to these short formulas above (but after reading pages and pages of docs and discussions).

Um, "up" and "and_up" are two very, very confusing words to me and I've explored many programming languages. "export" and "public" are very common programming words and are very easily explained to anyone, a Eu newbie or veteran. export = make the item visible to it's parent (i.e. the opposite of import) and only to it's parent, no matter what it's parent thinks should be done with it. public = make it available to it's parent and allow it's parent to do with it whatever it thinks is necessary, after all it is usable to the general public.

I guess I would be open to a different word for public and or export but we thought long and hard before making that choice. up and and_up are not better choices. If we come up with better choices, I would be up for more conversation on the subject.

Jeremy

Jeremy, sorry, but there is one question more: who or what is that "parent" in EU programming?

I just see one dictionary:

http://www.merriam-webster.com/dictionary/parent

Yet another dictionary:

http://en.wikipedia.org/wiki/Parent

Then docs of our old good EU:

http://www.rapideuphoria.com/cgi-bin/guru.exu?refDoc=on&libDoc=on&otherDoc=on&keywords=parent

There is just nothing about any object, similar to new my problem just with your new the "parent" word.

Or you want me to learn many programming languages just to understand "export", "public" and now "parent" in 4.0?

Good news - before programming in EU 4.0, learn please the jargon, i.e. traditional Mumbo-Jumbo, from C, C# etc .....

There are main file (users program) and library files in EU.

What is that "parent", as you say. Library or main file?

My new main file is almost empty now, is it a "parent"?

No, I think.

Ok, I've just included win32lib.

Is my main almost empty file "parent" for win32lib?

Oh, no-no, oh, sorry-sorry, Big Dave is Parent of win32lib...

And so on with that "parent".

Sorry Jeremy, I hope we all and you do have some sence of humor smile

But:

--lib.e 
up procedure first() -- will work in upper file  
 ... 
end procedure 

will work in my main file, if I write:

--main.ex -- young (new) program 
include lib.e -- old good lib, what is a "parent" ? 
first() 

Do you see, your "parent" just seems to be from that series of those Mumbo-Jumbo words of conventional languages?

Same as "public" and "export" (the opposite of "import") smile

I'll use Russian "vyshe" and "i_vyshe" i.e. "up" and "and_up" in bilingual version.

I do know who is father and who is son.

Regards, Igor Kachan kinz@peterlink.ru

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

26. Re: export & public

Kinz,

Parent is a very common term in all sorts of things, not just human relationships, nor graphs, nor document layout, nor computer programming languages. A parent is the file including the child file.

[eucode] File: myprog.ex include child.e [/eucode]

myprog.ex is child.e's parent.

Also, about learning C or some other mumbo jumbo language before learning Euphoria is a bit crazy. That would be like saying Euphoria uses an if statement, thus you first have to learn C because, after all, the if statement works the same in C as in Euphoria. Just because Euphoria uses common terms does not mean you have to learn every language that also uses a "while" statement.

Further, there are all sorts programming books that will use pseudo code. I see the word public, export, import frequently in those pseudo code examples that can apply to any language you wish. However, if you start using up and and_up, people will be totally confused. Euphoria is a programming language and it is allowed to use programming terms.

Jeremy

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

27. Re: export & public

Ghm

In my h. opinion, the "public" word is usually used in programmin' langs, and it is normal to use it instead "global". But I have one big question why use "export" word? As I can see, the "export" means nearly the same that "public" means, but the exported routines is abled to use in file when them was declared and the file, which includes that file when them was decalred (did u understand? smile).

But why it is neccessary? Why use the "export" instead the "public"?

Well, Igor, your "i_vishe" is not so clear for me... "vezde_vishe" is more informative, isn't it?

All I have written is my HO.

Thank you all, Algorythm algorythm at yandex.ru

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

28. Re: export & public

Algorythm said...

Ghm

In my h. opinion, the "public" word is usually used in programmin' langs, and it is normal to use it instead "global". But I have one big question why use "export" word? As I can see, the "export" means nearly the same that "public" means, but the exported routines is abled to use in file when them was declared and the file, which includes that file when them was decalred (did u understand? smile).

But why it is neccessary? Why use the "export" instead the "public"?

Well, Igor, your "i_vishe" is not so clear for me... "vezde_vishe" is more informative, isn't it?

All I have written is my HO.

Thank you all, Algorythm algorythm at yandex.ru

Hi Algorithm,

Let's better discuss Russian version in Russian. Come back please.

Regards, Igor Kachan kinz@peterlink.ru

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

29. Re: export & public

Algorythm said...

But why it is neccessary? Why use the "export" instead the "public"?

This post explains the reason for both public and export:

http://openeuphoria.org/EUforum/index.cgi?module=forum&action=message&id=103042#103042

Matt

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

30. Re: export & public

Hi

Derek, that table and include list should go in the manual. Great stuff.

Euphoric - I am encouraged. You have been using 4 a lot longer than me -I have stayed away from it until now, so as to try to get a feel for what it would be like for a new user. Perhaps this is wrong, but if a developer and pre alpha tester uses something then they will be used to doing something one way, whereas someone fresh will use the language in a way not intended, and this is where most of the unseen bugs are squashed.

Chris

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

31. Re: export & public

mattlewis said...

Enter the export scope. This declares symbols that cannot be propagated through additional include statements. So a library author could have internal library implementation that would remain hidden to the consumer of his library, but could be visible to multiple files within his library.

Might either of the words "private" or "restrict" better communicate the intention of the word "export"?

Export means "to send an item out from", without implying any innate restriction as to where the item might end up at, which seems to not be what is intended by using it in V4.0

"private" and "restrict" both seem to fairly clearly indicate that a symbol referenced by them is only available for use by the file that included the file containing the symbol.

Dan

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

32. Re: export & public

jeremy said...

Kinz,

Parent is a very common term in all sorts of things, not just human relationships, nor graphs, nor document layout, nor computer programming languages. A parent is the file including the child file.

[eucode] File: myprog.ex include child.e [/eucode]

myprog.ex is child.e's parent.

Yes, Jeremy, I do know that "parent" is a very common term in all sorts of things. In English. But I can not say literally "parent file" in Russian. I need some other word to say about such a file. "Upper file" or something other.

Same about "child file". There are ugly attempts in Russian to say just "daughter file" instead of "child" ("child" is just absolutely impossible here), but "daughter" in such a construct in Russian looks as something transsexual.

And pure Rob's EU English documentation is ideal for understanding by Russians and for translation to Russian and other languages.

So, the thing is - the docs of 4.0 will read not only English-speaking people, but registered users in 67 countries.

I'd like to see pure neutral English not only in 4.0 docs, but in language key words too, as it is in Rob's EU itself *and* in its docs (with very rare and suitable exceptions).

jeremy said...

Also, about learning C or some other mumbo jumbo language before learning Euphoria is a bit crazy. That would be like saying Euphoria uses an if statement, thus you first have to learn C because, after all, the if statement works the same in C as in Euphoria. Just because Euphoria uses common terms does not mean you have to learn every language that also uses a "while" statement.

Jeremy, I like EU so much thanks to its *almost pure* English in very elegant programming syntax of extremly powerful key words.

But to understand "export" of 4.0, I *just need* to compare 4.0/export with C/export to be sure for myself if is it something new or somthing better or what at all.

jeremy said...

Further, there are all sorts programming books that will use pseudo code. I see the word public, export, import frequently in those pseudo code examples that can apply to any language you wish. However, if you start using up and and_up, people will be totally confused. Euphoria is a programming language and it is allowed to use programming terms.

Jeremy, we are discussing Russian version here, Russian version of "and_up" instead of "public" seems to be clear for now. It looks good with Russian version of "global" etc. (Also, for "public" in EU context we do not have some good literal translation, just like to "child" above in technical texts).

Let's wait for more comments.

Regards, Igor Kachan kinz@peterlink.ru

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

33. Re: export & public

Do I have this right:

"export" is a kind of alternative for "global", in that it allows an "export"ed symbol to be SEEN by the including file, but with the advantage that it can ONLY be seen by the including file?

Whereas "public" is a DIFFERENT alternative for "global", in that if a file says "public include foo", then any of the "public" symbols that were in foo now CAN be seen by ANY FILE that included the file that said "public include foo"?

If that's right, then it would seem that "private" could reasonably be used instead of "export", because any "private" symbol would be only privately available to the immediately including file,

and "restrict" could be used instead of "public", so that a "restrict"ed symbol would normally be only seen by the immediately including file, but with "unrestrict include foo" meaning that any of the ""restrict"ed symbols that were in foo now CAN be seen by ANY FILE that included the file that said "unrestrict include foo"?

So "private" would be one step up from local symbols, and "restrict" (or "restricted"?) would be potentially one-half step above "private", in scope.

Perhaps that might also satisfy translation of keywords from English to other languages?

Dan

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

34. Re: export & public

DanM said...

Might either of the words "private" or "restrict" better communicate the intention of the word "export"?

Export means "to send an item out from", without implying any innate restriction as to where the item might end up at, which seems to not be what is intended by using it in V4.0

"private" and "restrict" both seem to fairly clearly indicate that a symbol referenced by them is only available for use by the file that included the file containing the symbol.

I think that private and restrict are counter-intuitive in this usage, since they both seem to imply the opposite of other files being able to see the symbols.

Perhaps something like "friend" would be a better term than "export". I'm thinking of a C concept where the friends of a class can see the class' privates. It's not a perfect analogy.

Matt

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

35. Re: export & public

mattlewis said...

...the friends of a class can see the class' privates.

They'd have to be really really close friends for me to let them see my privates.

Wait, what are we talking about?

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

36. Re: export & public

mattlewis said...
DanM said...

Might either of the words "private" or "restrict" better communicate the intention of the word "export"?

Export means "to send an item out from", without implying any innate restriction as to where the item might end up at, which seems to not be what is intended by using it in V4.0

"private" and "restrict" both seem to fairly clearly indicate that a symbol referenced by them is only available for use by the file that included the file containing the symbol.

I think that private and restrict are counter-intuitive in this usage, since they both seem to imply the opposite of other files being able to see the symbols.

Perhaps something like "friend" would be a better term than "export". I'm thinking of a C concept where the friends of a class can see the class' privates. It's not a perfect analogy.

Matt

I'm not sure I'd agree that they're counter-intuitive, as "private" (replacing "export") suggests available to the owner only (like a private journal), and one could consider the including file as being the owner of the included file, so any "private" symbols in the included file would be available to, and only to, the including file.

And if "restrict" (or "restricted") were to replace "public" (forget about my original suggestion above to have it maybe replace "export"), then that also is not counter-intuitive, because "restricted access to something" just means some access is allowed while some is not, and then "unrestrict include foo" would mean that even more access is granted, though not global access.

Just a thought smile

Dan

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

37. Re: export & public

DanM said...
mattlewis said...
DanM said...

Might either of the words "private" or "restrict" better communicate the intention of the word "export"?

Export means "to send an item out from", without implying any innate restriction as to where the item might end up at, which seems to not be what is intended by using it in V4.0

"private" and "restrict" both seem to fairly clearly indicate that a symbol referenced by them is only available for use by the file that included the file containing the symbol.

I think that private and restrict are counter-intuitive in this usage, since they both seem to imply the opposite of other files being able to see the symbols.

Perhaps something like "friend" would be a better term than "export". I'm thinking of a C concept where the friends of a class can see the class' privates. It's not a perfect analogy.

Matt

I'm not sure I'd agree that they're counter-intuitive, as "private" (replacing "export") suggests available to the owner only (like a private journal), and one could consider the including file as being the owner of the included file, so any "private" symbols in the included file would be available to, and only to, the including file.

And if "restrict" (or "restricted") were to replace "public" (forget about my original suggestion above to have it maybe replace "export"), then that also is not counter-intuitive, because "restricted access to something" just means some access is allowed while some is not, and then "unrestrict include foo" would mean that even more access is granted, though not global access.

Just a thought smile

Dan

Everywhere I have seen the word private, it means specifically, outside the immediate scope, no one can access this item. The scope being a class or a file. The idea of a private journal is a good analogy for every day objects, but is counter intuitive compared to all programming languages I've ever used.

Jeremy

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

38. Re: export & public

Opps! Didn't mean to quote the whole thing.

Jeremy

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

39. Re: export & public

jeremy said...

Everywhere I have seen the word private, it means specifically, outside the immediate scope, no one can access this item. The scope being a class or a file. The idea of a private journal is a good analogy for every day objects, but is counter intuitive compared to all programming languages I've ever used.

Jeremy

Ok, if it goes against the grain for normal usage in other programming languages, never mind; I also noticed that my suggestion of "unrestricted" might seem to suggest COMPLETELY unrestricted, which isn't what's desired in this situation, so nevermind for it too.

Dan

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

40. Re: export & public

DanM said...

Ok, if it goes against the grain for normal usage in other programming languages, never mind; I also noticed that my suggestion of "unrestricted" might seem to suggest COMPLETELY unrestricted, which isn't what's desired in this situation, so nevermind for it too.

I admit that export and public are pretty close in their meaning and it's a touchy subject. Any word is explainable to their meaning in our application, but it sure would be nice to have two perfect words that require no explanation but is simply natural.

Jeremy

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

41. Re: export & public

jeremy said...

I admit that export and public are pretty close in their meaning and it's a touchy subject. Any word is explainable to their meaning in our application, but it sure would be nice to have two perfect words that require no explanation but is simply natural.

Jeremy:
How about not_shared, shared, fully_shared ?

PS. When is win98 alpha comming out ?

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

42. Re: export & public

bernie said...

PS. When is win98 alpha comming out ?

We've decided to drop support for Win98 and Win2000.

(Just kiddin'. A little April fools joke in December. tongue)

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

43. Re: export & public

bernie said...

PS. When is win98 alpha comming out ?

The alpha is based on Shawn's eubins. His windows eubins are designed to work on 98 if I have understood Shawn correctly. (I haven't actually tested them on 98, however.)

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

44. Re: export & public

euphoric said...
bernie said...

PS. When is win98 alpha comming out ?

We've decided to drop support for Win98 and Win2000.

(Just kiddin'. A little April fools joke in December. tongue)

We're really dropping support for Windows Mojave. tongue

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

Search



Quick Links

User menu

Not signed in.

Misc Menu