1. Including Files

Can this please be considered?

I'd like to be able to include files using a variable. For example:

sequence s
s = dir("plugins")
for t=1 to length(s) do
   if not find(s,{".",".."}) then
       include s[t]
   end if
end for

Thanks! :)

-=ck
"Programming in a state of Euphoria."
http://www.cklester.com/euphoria/

new topic     » topic index » view message » categorize

2. Re: Including Files

cklester wrote:
> 
> Can this please be considered?
> 
> I'd like to be able to include files using a variable. For example:
> 
> sequence s
> s = dir("plugins")
> for t=1 to length(s) do
>    if not find(s,{".",".."}) then
>        include s[t]
>    end if
> end for
> 
> Thanks! :)
> 
> -=ck
> "Programming in a state of Euphoria."
> <a
> href="http://www.cklester.com/euphoria/">http://www.cklester.com/euphoria/</a>

That is not a very easy thing to do. Doing so would require changing how Eu
processes code.

You can do what you want using a dynamic include mechanism however.
I'm not sure if it will work in >=2.5 but I beleive it will.

The idea is to include an empty, dummy/placeholder file in your application just
after the branch. Write an import() routine that accepts an include  filename. In
the routine, copy the contents of the specified file into the dummy file.

-- append the contents of include_name to the contents of dummy_name
-- you will need make sure the dummy file is deleted at application start to
clear the previous dynamic contents
global procedure import(sequence dummy_name, sequence include_name)
 integer fn1,size
  fn1 = open("include_name","rb")
  fn2 = open(dummy_name,"ab")
  if seek(fn1,-1) then end if
  size = where(fn1)
  if seek(fn1,0) then end if
  puts(fn2,get_bytes(fn1,size))
  close(fn2)
  close(fn1)
end procedure

-- make sure the contents of the dummy file are cleared
close(open("dummy.e","w"))

sequence s
s = dir("plugins")
for t=1 to length(s) do
  if not find(s,{".",".."}) then
    import("dummy.e",s[t])
  end if
end for
include dummy.e


That dynamic include method will only work for interpretted code however :<

Chris Bensler
~ The difference between ordinary and extraordinary is that little extra ~
http://empire.iwireweb.com - Empire for Euphoria

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

3. Re: Including Files

Chris Bensler wrote:
> 
> cklester wrote:
> > I'd like to be able to include files using a variable. For example:
> > 
> > sequence s
> > s = dir("plugins")
> > for t=1 to length(s) do
> >    if not find(s,{".",".."}) then
> >        include s[t]
> >    end if
> > end for
> 
> That is not a very easy thing to do. Doing so would require changing how Eu
> processes code.

I don't see how

   include smith.e

is that much more complicated than

   include "smith.e"

or

   sequence smith
   smith = "smith.e"

   include smith

> The idea is to include an empty, dummy/placeholder file in your application
> just after the branch. Write an import() routine that accepts an include 
> filename.
> In the routine, copy the contents of the specified file into the dummy file.

Yeah, that might work. I'll think it over and get back to ya. :)

-=ck
"Programming in a state of Euphoria."
http://www.cklester.com/euphoria/

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

4. Re: Including Files

cklester wrote:
> 
> Chris Bensler wrote:

> > That is not a very easy thing to do. Doing so would require changing how Eu
> > processes code.
> 
> I don't see how
> 
>    include smith.e
> 
> is that much more complicated than
> 
>    include "smith.e"
> 
> or
> 
>    sequence smith
>    smith = "smith.e"
> 
>    include smith
> 


Hi CK,

I assume the complexity starts when binding and translating to C.

Regards,

Ray Smith
http://RaymondSmith.com

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

5. Re: Including Files

cklester wrote:
> 
> > That is not a very easy thing to do. Doing so would require changing how Eu
> > processes code.
> 
> I don't see how
> 
>    include smith.e
> 
> is that much more complicated than
> 
>    include "smith.e"
> 
> or
> 
>    sequence smith
>    smith = "smith.e"
> 
>    include smith
> 

For one thing, it's abmiguous. Is smith a variable or a filename without an
extension? If it were up to me, I would resolve this by forcing all literal
filenames to be quoted. But that breaks compatability.

The other major issue is that Eu assumes all the files are technically included
before any code is executed. We can 'hack' around it using the interpetter
because of how it parses source code, but the same is not posible for a bound
application. A bound application has already parsed and included it's files
before it even begins to execute anything. So the dummy file would always be
empty, regardless of your attempts to rewrite it.
A bound application would have to be capable of parsing and translating to op
code during runtime, which would impose load time latencies during the run of
your program whenever a new file is encountered.
Any file that contains a dynamic include statement would also have to be
processed everytime it's included, regardless if it was already parsed, since you
couldn't guarantee that the dynamically included files within that include will
be the same.

If eu supported string execution it would be possible, but there is still the
include statement abiguity and the overhead imposed by runtime parsing.

Chris Bensler
~ The difference between ordinary and extraordinary is that little extra ~
http://empire.iwireweb.com - Empire for Euphoria

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

6. Re: Including Files

Chris Bensler wrote:
> 
> cklester wrote:
> > 
> > Can this please be considered?
> > 
> > I'd like to be able to include files using a variable. For example:
> > 
> > sequence s
> > s = dir("plugins")
> > for t=1 to length(s) do
> >    if not find(s,{".",".."}) then
> >        include s[t]
> >    end if
> > end for
> > 
> > Thanks! :)
> > 
> > -=ck
> > "Programming in a state of Euphoria."
> > <a
> > href="http://www.cklester.com/euphoria/">http://www.cklester.com/euphoria/</a>
> 
> That is not a very easy thing to do. Doing so would require changing how Eu
> processes code.
> 
> You can do what you want using a dynamic include mechanism however.
> I'm not sure if it will work in >=2.5 but I beleive it will.
> 
> The idea is to include an empty, dummy/placeholder file in your application
> just after the branch. Write an import() routine that accepts an include 
> filename.
> In the routine, copy the contents of the specified file into the dummy file.
> 
> }}}
<eucode>
> -- append the contents of include_name to the contents of dummy_name
> -- you will need make sure the dummy file is deleted at application start to
> clear the previous dynamic contents
> global procedure import(sequence dummy_name, sequence include_name)
>  integer fn1,size
>   fn1 = open("include_name","rb")
>   fn2 = open(dummy_name,"ab")
>   if seek(fn1,-1) then end if
>   size = where(fn1)
>   if seek(fn1,0) then end if
>   puts(fn2,get_bytes(fn1,size))
>   close(fn2)
>   close(fn1)
> end procedure
> 
> -- make sure the contents of the dummy file are cleared
> close(open("dummy.e","w"))
> 
> sequence s
> s = dir("plugins")
> for t=1 to length(s) do
>   if not find(s,{".",".."}) then
>     import("dummy.e",s[t])
>   end if
> end for
> include dummy.e
> </eucode>
{{{

> 
> That dynamic include method will only work for interpretted code however :<
> 
> Chris Bensler
> ~ The difference between ordinary and extraordinary is that little extra ~
> <a href="http://empire.iwireweb.com">http://empire.iwireweb.com</a> - Empire
> for Euphoria

I made a mistake. you can't append include files together unless you can
guarantee there will be no local name clashes, or else consolidate the files.

What you will need to do for multiple files is either:
A) have a dummy include statement for the maximum possible dynamic includes that
you will allow.
B) append a concurrent dummy include statement to each dummy include file.
So, dummy01.e includes dummy02.e at the end of the file which includes dummy03.e
at the end of it's file, etc..

Using A, you will have to have a limit on how many files will be dynamically
included.

Using B, you will be restricted by Eu's include nesting limit.

Chris Bensler
~ The difference between ordinary and extraordinary is that little extra ~
http://empire.iwireweb.com - Empire for Euphoria

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

7. Re: Including Files

Chris Bensler wrote:
> Chris Bensler wrote:
> > cklester wrote:
> > > I'd like to be able to include files using a variable. For example:
> > You can do what you want using a dynamic include mechanism however.
> > I'm not sure if it will work in >=2.5 but I beleive it will.
> I made a mistake. you can't append include files together unless you can
> guarantee
> there will be no local name clashes, or else consolidate the files.

What about just simply creating an include file that includes files?

files = dir("plugins")
fn = open("built_at_runtime.e","w")
for t=1 to length(files) do
   puts(fn,"include " & files[D_NAME])
end for
include built_at_runtime.e

-=ck
"Programming in a state of Euphoria."
http://www.cklester.com/euphoria/

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

8. Re: Including Files

cklester wrote:
> 
> Chris Bensler wrote:
> > Chris Bensler wrote:
> > > cklester wrote:
> > > > I'd like to be able to include files using a variable. For example:
> > > You can do what you want using a dynamic include mechanism however.
> > > I'm not sure if it will work in >=2.5 but I beleive it will.
> > I made a mistake. you can't append include files together unless you can
> > guarantee
> > there will be no local name clashes, or else consolidate the files.
> 
> What about just simply creating an include file that includes files?
> 
> files = dir("plugins")
> fn = open("built_at_runtime.e","w")
> for t=1 to length(files) do
>    puts(fn,"include " & files[D_NAME])
> end for
> include built_at_runtime.e
> 
> -=ck
> "Programming in a state of Euphoria."
> <a
> href="http://www.cklester.com/euphoria/">http://www.cklester.com/euphoria/</a>

Hehe, yea that ought to work too :P


Chris Bensler
~ The difference between ordinary and extraordinary is that little extra ~
http://empire.iwireweb.com - Empire for Euphoria

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

9. Re: Including Files

cklester wrote:
> 
> Can this please be considered?
> 
> I'd like to be able to include files using a variable. For example:
> 
> sequence s
> s = dir("plugins")
> for t=1 to length(s) do
>    if not find(s,{".",".."}) then
>        include s[t]
>    end if
> end for
> 
> Thanks! :)

I think the only 'reasonable' way to do this is to use something like
ooeu's eval() (which it can do).  I haven't migrated that into the c
backend yet, so you'd be stuck with the euphoria backend.  I have some
ideas on how to do it, however, though it's going to be a lot of work.

The difficulty is in adding to the symbol table at runtime.  The c backend
converts all the symtab indices into pointers.  In order to add stuff at
the end of the symbol table, you need to be able to allocate new space.
My solution will use linked symbol table blocks, so that each time you
call eval, a new one gets allocated.

As Ray mentioned, translation is where this gets difficult.  I've got some
ooeu features translating, but to add an eval, you have to embed the 
interpreter into the runtime library, rather than just the support routines.
And then you have to be able to allow stuff to go back and forth between
the translated and interpreted code.  

Similar issues arise from the var_id family of features.  A better way to
do this might be to translate your plugins to c, so that you could 
dynamically load them.  Since the translator is all free, there's less
reason not to do this sort of thing.  You might take a look at the ooeu
debugger, or even the win32lib dll wrapper
(http://www.rapideuphoria.com/windll.zip)
that allows a dll to use the win32lib in the main program.  They should
give some ideas about how to integrate eu code in this manner.

Matt

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

10. Re: Including Files

Matt Lewis wrote:
> cklester wrote:
> > Can this please be considered?
> > 
> > I'd like to be able to include files using a variable. For example:
> > 
> > sequence s
> > s = dir("plugins")
> > for t=1 to length(s) do
> >    if not find(s,{".",".."}) then
> >        include s[t]
> >    end if
> > end for
> > 
> > Thanks! :)
> 
> I think the only 'reasonable' way to do this is to use something like
> ooeu's eval() (which it can do).  I haven't migrated that into the c
> backend yet, so you'd be stuck with the euphoria backend.  I have some
> ideas on how to do it, however, though it's going to be a lot of work.

If Euphoria currently knows what to do with this:

   include myinc.e

which is basically

   include the file 'myinc.e'

why can't it simply do something like this:

(pseudo-code)

   sequence s
   s = "myinc.e"
   include s

which would be the exact same thing as

   include the file 'myinc.e' as defined in the variable s

Instead of

1. parse filename from line of code
2. include filename contents

we would have

1. is include parameter a variable?
    Yes: parse filename from variable
     No: parse filename from line of code
2. include filename contents

It's the EXACT SAME THING, except for that little translation part.
But that happens before the include is invoked! Ultimately, the
interpreter should be using the exact same unaltered include code it uses
now, it's just that there might be a step or two extra before that in
determing from whence the filename should be gotten.

Do you see what I'm saying? The code used to include files now should not
have to change. It can just obtain the filename to include in a new way.

I hope that makes sense. It sure does in my head. 8)

Is this a single-pass/double-pass issue?

-=ck
"Programming in a state of Euphoria."
http://www.cklester.com/euphoria/

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

11. Re: Including Files

cklester wrote:
> 
> If Euphoria currently knows what to do with this:
> 
>    include myinc.e
> 
> which is basically
> 
>    include the file 'myinc.e'
> 
> why can't it simply do something like this:
> 
> (pseudo-code)
> 
>    sequence s
>    s = "myinc.e"
>    include s

Well, for one thing, when things are being parsed, s hasn't been 
assigned any value.
 
> which would be the exact same thing as
> 
>    include the file 'myinc.e' as defined in the variable s
> 
> Instead of
> 
> 1. parse filename from line of code
> 2. include filename contents
> 
> we would have
> 
> 1. is include parameter a variable?
>     Yes: parse filename from variable
>      No: parse filename from line of code
> 2. include filename contents
> 
> It's the EXACT SAME THING, except for that little translation part.
> But that happens before the include is invoked! Ultimately, the
> interpreter should be using the exact same unaltered include code it uses
> now, it's just that there might be a step or two extra before that in
> determing from whence the filename should be gotten.
> 
> Do you see what I'm saying? The code used to include files now should not
> have to change. It can just obtain the filename to include in a new way.
> 
> I hope that makes sense. It sure does in my head. 8)
> 
> Is this a single-pass/double-pass issue?

The issue is that you're asking to be able to execute code during parsing,
which is not how euphoria works (2.5 and later, anyway).  I agree, however,
that your simple example is exactly the same.  So I'd ask you why you would
want to do it that way?

OK, I know the answer is that you'd want to do some other calculations to
either create the sequence dynamically, or include it conditionally.  You
might do better with a preprocessor for the conditional include situation.

You mentioned plugins.  I really think the dll idea is a better way to go,
because you could really load them dynamically (and unload them, if you
really wanted to).  Otherwise, some sort of preprocessor is probably better,
so that you could keep some sort of ini file that identified the plugins
you wanted, and before the code was actually executed, you could create the
includes that you really wanted.  That's basically what some others have done
in their dynamic inclusion schemes for 2.5.

Matt

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

12. Re: Including Files

Matt Lewis wrote:

> The issue is that you're asking to be able to execute code during parsing,
> which is not how euphoria works (2.5 and later, anyway).  I agree, however,
> that your simple example is exactly the same.  So I'd ask you why you would
> want to do it that way?

Because I want users who don't know the internals to use an API to write
plug-ins for my app. These plug-ins will be written in Euphoria and most
likely will not be compiled into a dll, ever. At least, not by me! :)

> You might do better with a preprocessor for the conditional include situation.

Maybe, but I'm leery of leaving a pure Euphoria environment. That is, I tend
to like to avoid kludges, to stay within the boundaries of the standards,
and a preprocessor seems kludgey.

-=ck
"Programming in a state of Euphoria."
http://www.cklester.com/euphoria/

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

13. Re: Including Files

cklester wrote:
> 
> Matt Lewis wrote:
> 
> > The issue is that you're asking to be able to execute code during parsing,
> > which is not how euphoria works (2.5 and later, anyway).  I agree, however,
> > that your simple example is exactly the same.  So I'd ask you why you would
> > want to do it that way?
> 
> Because I want users who don't know the internals to use an API to write
> plug-ins for my app. These plug-ins will be written in Euphoria and most
> likely will not be compiled into a dll, ever. At least, not by me! :)
> 
> > You might do better with a preprocessor for the conditional include
> > situation.
> 
> Maybe, but I'm leery of leaving a pure Euphoria environment. That is, I tend
> to like to avoid kludges, to stay within the boundaries of the standards,
> and a preprocessor seems kludgey.

So how were you proposing that your users include their plugins into your
app?  Are they going to manually modify your code to add their file?  You
could have a setup app that configured the plugins to act as the preprocessor.
A user could run it, and it would modify a section of your code where you 
include the plugins.  Then the user runs the app.  The setup could even be
from within your app (assuming that makes sense for the UI of whatever you're
doing) and the user has to restart for the plugin to work (lot's of things
do this--see Firefox).

If this doesn't sound good, maybe some more detail on what you're doing would
help.

Matt

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

14. Re: Including Files

Matt Lewis wrote:
> 
> cklester wrote:
> > 
> > Matt Lewis wrote:
> > 
> > > The issue is that you're asking to be able to execute code during parsing,
> > > which is not how euphoria works (2.5 and later, anyway).  I agree,
> > > however,
> > > that your simple example is exactly the same.  So I'd ask you why you
> > > would
> > > want to do it that way?
> > 
> > Because I want users who don't know the internals to use an API to write
> > plug-ins for my app. These plug-ins will be written in Euphoria and most
> > likely will not be compiled into a dll, ever. At least, not by me! :)
> > 
> > > You might do better with a preprocessor for the conditional include
> > > situation.
> > 
> > Maybe, but I'm leery of leaving a pure Euphoria environment. That is, I tend
> > to like to avoid kludges, to stay within the boundaries of the standards,
> > and a preprocessor seems kludgey.
> 
> So how were you proposing that your users include their plugins into your
> app?  Are they going to manually modify your code to add their file?  You
> could have a setup app that configured the plugins to act as the preprocessor.
> A user could run it, and it would modify a section of your code where you 
> include the plugins.  Then the user runs the app.  The setup could even be
> from within your app (assuming that makes sense for the UI of whatever you're
> doing) and the user has to restart for the plugin to work (lot's of things
> do this--see Firefox).
> 
> If this doesn't sound good, maybe some more detail on what you're doing would
> help.
> 
> Matt

Hasn't anyone made Eu-in-Eu into an embeddable script engine yet?
Seems to me, this is one of the few ways in which it can really be useful.


Chris Bensler
~ The difference between ordinary and extraordinary is that little extra ~
http://empire.iwireweb.com - Empire for Euphoria

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

15. Re: Including Files

Chris Bensler wrote:
> > 
> Hasn't anyone made Eu-in-Eu into an embeddable script engine yet?
> Seems to me, this is one of the few ways in which it can really be useful.
> 

Yes, ooeu can do this, but currently only with the eu-based backend.  As I
mentioned earlier in this thread, I'm working on getting that implemented
in the C backend, but it's going to take a while (I'm currently focusing
on wxEuphoria development).

Matt

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

16. Re: Including Files

Matt Lewis wrote:
> 
> So how were you proposing that your users include their plugins into your
> app?  Are they going to manually modify your code to add their file?

What I proposed is that the user simply puts their plugin into the plugins
directory and the program will pick it up. Then, when the program is run, it
simply includes all the files in the plugins directory.

I'll probably have to go with the solution proposed earlier, where I create
an include file that includes all the files in the plugins folder, then
include that include file in the main program.

> could have a setup app that configured the plugins to act as the preprocessor.
> A user could run it, and it would modify a section of your code where you 
> include the plugins.

The way it's proposed above makes it a one-step process. Drop in the file,
run the program. That'll work for now... I hope. Haven't tested it, yet, but
will this weekend. :)

-=ck
"Programming in a state of Euphoria."
http://www.cklester.com/euphoria/

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

17. Re: Including Files

cklester wrote:
> 
> Matt Lewis wrote:
> > 
> > So how were you proposing that your users include their plugins into your
> > app?  Are they going to manually modify your code to add their file?
> 
> What I proposed is that the user simply puts their plugin into the plugins
> directory and the program will pick it up. Then, when the program is run, it
> simply includes all the files in the plugins directory.
> 
> I'll probably have to go with the solution proposed earlier, where I create
> an include file that includes all the files in the plugins folder, then
> include that include file in the main program.
> 
> > could have a setup app that configured the plugins to act as the
> > preprocessor.
> > A user could run it, and it would modify a section of your code where you 
> > include the plugins.
> 
> The way it's proposed above makes it a one-step process. Drop in the file,
> run the program. That'll work for now... I hope. Haven't tested it, yet, but
> will this weekend. :)
> 
> -=ck
> "Programming in a state of Euphoria."
> <a
> href="http://www.cklester.com/euphoria/">http://www.cklester.com/euphoria/</a>

I'm actually dealing with the exact same issue in my Fluid Application
Environment project. It has optional modules which provide services for
applications, and they are included in the kernel. As it is now, I have to
manually add include statements and some other things to "modules.e" for new
modules to work.

I think what' i'm going to do is have a file called "modules.cfg" which will be
included in "modules.e". When FluidAE is started, a special startup program will
scan the /modules folder and add the appropriate entries into "modules.cfg"
before executing "fluidae.exw". It will also allow modules to be included, but in
a disabled state.

Maybe we could work together on this. smile

~Ryan W. Johnson

Fluid Application Environment
http://www.fluidae.com/

[cool quote here, if i ever think of one...]

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

Search



Quick Links

User menu

Not signed in.

Misc Menu