1. eval() function

After my unsuccessful attempt at using OOEU's eval() function, I thought I would
write my own that will work with the normal rds download.
But it won't work!

constant EVAL_FILE_NAME = "tmp_evalfile.ex"
constant EVAL_ERROR = -1

global function eval(sequence data)
	integer tmp_fn, ret
	sequence plat

	tmp_fn = open(EVAL_FILE_NAME, "w")
	if tmp_fn = -1 then
		puts(1, "Could not opne temporary eval file ... Sorry!")
		return EVAL_ERROR
	end if

	puts(tmp_fn, data)

	if platform() = DOS32 then
		plat = "ex"
	elsif platform() = WIN32 then
		plat = "exw"
	elsif (platform() = LINUX) or (platform() = FREEBSD) then
		plat = "exu"
	end if
	puts(1, plat & " " & EVAL_FILE_NAME & " > eval.out")
	ret = system_exec(plat & " " & EVAL_FILE_NAME, 0)
	system("DELE " & EVAL_FILE_NAME, 0)
	return ret
end function


Can somebody help me?

Thanks,
 Alex

P.S. Matt Lewis - Sorry I haven't emailed you any source that is not workin, but
my PC is being wiped and I am using another so until I get it back and read off
backups etc I can't get it to you.

new topic     » topic index » view message » categorize

2. Re: eval() function

Alex Chamberlain wrote:

> After my unsuccessful attempt at using OOEU's eval() function,
> I thought would write my own that will work with the normal rds
> download.
> But it won't work!
>
> }}}
<eucode>
> constant EVAL_FILE_NAME = "tmp_evalfile.ex"
> constant EVAL_ERROR = -1
>
> global function eval(sequence data)
> 	integer tmp_fn, ret
> 	sequence plat
>
> 	tmp_fn = open(EVAL_FILE_NAME, "w")
> 	if tmp_fn = -1 then
> 		puts(1, "Could not opne temporary eval file ... Sorry!")
> 		return EVAL_ERROR
> 	end if
>
> 	puts(tmp_fn, data)
>
> 	if platform() = DOS32 then
> 		plat = "ex"
> 	elsif platform() = WIN32 then
> 		plat = "exw"
> 	elsif (platform() = LINUX) or (platform() = FREEBSD) then
> 		plat = "exu"
> 	end if
> 	puts(1, plat & " " & EVAL_FILE_NAME & " > eval.out")
> 	ret = system_exec(plat & " " & EVAL_FILE_NAME, 0)
> 	system("DELE " & EVAL_FILE_NAME, 0)
> 	return ret
> end function
> </eucode>
{{{

>
> Can somebody help me?


When I try to run that program, I get the following error message:
   DOS32 has not been declared
           if platform() = DOS32 then
                               ^
So at least you should write at the beginning of the program:
   include misc.e

Also when you have opened a file, don't forget to close it!

And you have mixed up some things. blink
Besides the missing 'include' statement, the program can not work,
because you are redirecting the wrong command, you never read the output
of the temporary program, and the function returns the wrong value.
Additionally it looks to me that system_exec() can not be used for
output redirection. But redirecting the output is not necessary at all
here.

Make a clear concept, you need 4 steps:
a) write a temporary program for evaluating the expression and writing
   the result to another temporary file
b) run the temporary program (and delete the program file)
c) read the content of the temporary result file, and convert it to
   a number (and delete the file)
d) return this number (do *not* return the return value of
   system_exec()!)

Now you have important hints. I'll not give you the complete program at
the moment. Trying yourself is more fun! smile

Regards,
   Juergen

-- 
Have you read a good program lately?

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

3. Re: eval() function

Me wrote:

> Alex Chamberlain wrote:
>
>> After my unsuccessful attempt at using OOEU's eval() function,
>> I thought would write my own that will work with the normal rds
>> download.
>> But it won't work!
>>
>> }}}
<eucode>
>> constant EVAL_FILE_NAME = "tmp_evalfile.ex"
>> constant EVAL_ERROR = -1
>>
>> global function eval(sequence data)
>> 	integer tmp_fn, ret
>> 	sequence plat
>>
>> 	tmp_fn = open(EVAL_FILE_NAME, "w")
>> 	if tmp_fn = -1 then
>> 		puts(1, "Could not opne temporary eval file ... Sorry!")
>> 		return EVAL_ERROR
>> 	end if
>>
>> 	puts(tmp_fn, data)
>>
>> 	if platform() = DOS32 then
>> 		plat = "ex"
>> 	elsif platform() = WIN32 then
>> 		plat = "exw"
>> 	elsif (platform() = LINUX) or (platform() = FREEBSD) then
>> 		plat = "exu"
>> 	end if
>> 	puts(1, plat & " " & EVAL_FILE_NAME & " > eval.out")
>> 	ret = system_exec(plat & " " & EVAL_FILE_NAME, 0)
>> 	system("DELE " & EVAL_FILE_NAME, 0)
>> 	return ret
>> end function
>> </eucode>
{{{

>>
>> Can somebody help me?
>
>
> When I try to run that program, I get the following error message:
>    DOS32 has not been declared
>            if platform() = DOS32 then
>                                ^
> So at least you should write at the beginning of the program:
>    include misc.e
>
> Also when you have opened a file, don't forget to close it!
>
> And you have mixed up some things. blink
> Besides the missing 'include' statement, the program can not work,
> because you are redirecting the wrong command, you never read the output
> of the temporary program, and the function returns the wrong value.
> Additionally it looks to me that system_exec() can not be used for
> output redirection. But redirecting the output is not necessary at all
> here.
>
> Make a clear concept, you need 4 steps:
> a) write a temporary program for evaluating the expression and writing
>    the result to another temporary file
> b) run the temporary program (and delete the program file)
> c) read the content of the temporary result file, and convert it to
>    a number (and delete the file)
> d) return this number (do *not* return the return value of
>    system_exec()!)
>
> Now you have important hints. I'll not give you the complete program at
> the moment. Trying yourself is more fun! smile


Here comes the second part of my reply, firstly some more remarks:

It is often useful to write a function like this in a way, so that it is
as versatile as possible, and useful for different types of programs.
Now imagine a program with a nice looking GUI, and then a black console
window pops up with the message:
     "Could not open temporary eval file ... Sorry!"
Since this would look ugly, a versatile library function should not
output such messages itself, but return a specific error code, and let
the main program display the appropriate message (see code below).

Your function returns -1 to indicate an error. But -1 can also be a
valid result of the function, e.g.  eval("-2*0.5") => -1.
When eval() returns -1, how can the main program know whether this
special -1 is a valid result or an error flag? Answer: It cannot!
We must return error flags in a different way. From the top of my head
three possibilities come to my mind:
1) Always return a sequence of 2 elements, where the first element is a
   special flag, and the second element is the desired value, in case
   there is no error.
   This way is used e.g. by the Euphoria functions get() (see below) and
   value().
2) Always return an atom, and use a separate local or global error
   variable, which is set by eval() e.g.
        atom result
        integer error
        result = eval("1+1")
        if error then
           puts(1, "Can't calculate that.\n")
        else
           printf(1, "Result: %g\n", {result})
        end if
   This is not working code, but I hope you'll get the idea.
3) Always return an atom for a valid result, and a sequence in case of
   an error (or vice versa, like gets() does). This method is used in
   the code below.

In your code you used "DELE", I don't know that. On DOS and Windows it
must be "DEL". If "DELE" is not a typo, but a valid Linux/FreeBSD
command, you must change the code of the function, so that it uses the
proper command according to the current platform.

Like you did, I use 2 files. But my files both have the same extension,
so I only need 1 command to delete them.
This command is deliberately commented out currently. After running the
code, you should look at the contents of the file "eval_prg.tmp". Then
you probably will see what's going on. smile

include misc.e
include get.e

constant
   EVAL_PROG_NAME = "eval_prg.tmp",
   EVAL_RES_NAME  = "eval_res.tmp",
   EVAL_WRITE_ERR = {1},
   EVAL_READ_ERR  = {2}


global function eval (sequence expression)
   sequence plat, ret
   integer fn, sys

   -- write a temporary program for evaluating the expression and
   -- writing the result to another temporary file
   fn = open(EVAL_PROG_NAME, "w")
   if fn = -1 then
      return EVAL_WRITE_ERR
   end if
   printf(fn, "integer fn\n"
            & "fn = open(\"%s\", \"w\")\n"
            & "print(fn, %s)\n"
            & "close(fn)\n",
            {EVAL_RES_NAME, expression})
   close(fn)

   -- run the temporary program
   if platform() = DOS32 then
      plat = "ex"
   elsif platform() = WIN32 then
      plat = "exw"
   elsif (platform() = LINUX) or (platform() = FREEBSD) then
      plat = "exu"
   end if
   sys = system_exec(plat & " " & EVAL_PROG_NAME, 0)

   -- read the content of the temporary result file,
   -- and convert it to a number
   fn = open(EVAL_RES_NAME, "r")
   if fn = -1 then
      return EVAL_READ_ERR
   end if
   ret = get(fn)
   close(fn)

   -- delete temporary files
--    system("DEL *.tmp", 0)

   -- return the number from the temporary result file
   if ret[1] = GET_SUCCESS then
      return ret[2]
   else
      return EVAL_READ_ERR
   end if
end function


-- Demo
object result
sequence expression

expression = "3*2.5"
-- expression = "power(4,2)"

result = eval(expression)
if atom(result) then
   printf(1, "%s = %g\n", {expression, result})
elsif equal(result, EVAL_WRITE_ERR) then
   puts(1, "Could not write eval program ... Sorry!")
elsif equal(result, EVAL_READ_ERR) then
   puts(1, "Could not read eval result ... Sorry!")
end if
puts(1, "\nPress Enter to continue ...")
if getc(0) then end if


If you still have questions, just let us know.

Regards,
   Juergen

-- 
Have you read a good program lately?

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

4. Re: eval() function

Thanks Juergen - amazing mind! I don't think I made it clear that I need the
script to evaluate full Euphoria programs!
I have adapted your script to run it my way.

--eval.e
include misc.e

global constant
EVAL_PROG_NAME = "eval_prg.tmp",
EVAL_RES_NAME = "eval_res.tmp",
EVAL_ERR_RET = -1,
EVAL_WRITE_ERR = 1,
EVAL_READ_ERR  = 2

global integer EVAL_ERROR

EVAL_ERROR = 0

global function eval (sequence script)
	sequence plat, ret
	integer tmp_fn -- , sys
	object line

	-- write a temporary program for evaluating the expression and
	-- writing the result to another temporary file
	tmp_fn = open(EVAL_PROG_NAME, "w")
	if tmp_fn = -1 then
		EVAL_ERROR = EVAL_WRITE_ERR
		return EVAL_ERR_RET
	end if
	
	puts(tmp_fn, script)
	close(tmp_fn)

	-- run the temporary program
	if platform() = DOS32 then
		plat = "ex"
	elsif platform() = WIN32 then
		plat = "exw"
	elsif (platform() = LINUX) or (platform() = FREEBSD) then
		plat = "exu"
	end if
	system(plat & " " & EVAL_PROG_NAME & " > " & EVAL_RES_NAME, 0)

	-- read the content of the temporary result file,
	-- and convert it to a number
	tmp_fn = open(EVAL_RES_NAME, "r")
	if tmp_fn = -1 then
		EVAL_ERROR = EVAL_READ_ERR
		return EVAL_ERR_RET
	end if

	ret = {}
	while 1 do
		line = gets(tmp_fn)
		if atom(line) then
			exit
		end if
		ret &= line
	end while
	close(tmp_fn)

	-- delete temporary files
	system("DEL *.tmp", 0)

	return ret
end function


--demo.ex
include eval.e
include get.e

sequence script
object ret

-- Define the script contents - any Euphoria code!
script = "puts(1, \"This is this result of the demo eval script!\")"

procedure handleReturn(object ret)
	puts(1, "The script output the following:\n" & ret)
end procedure

ret = eval(script)

if atom(ret) then
	if EVAL_ERROR = 0 then
		handleReturn(ret)
	elsif EVAL_ERROR = EVAL_WRITE_ERR then
		puts(1, "Sorry, there was a write error whilst evaluating the script")
	elsif EVAL_ERROR = EVAL_READ_ERR then
		puts(1, "Sorry, there was a read error whilst evaluating the script")
	end if
else
	handleReturn(ret)
end if

abort(wait_key()*0)


The only problem is that the Windows program doesn't like redirecting its input
(can others please try it!) and it hasn't been run on Linux/FreeBSD yet. It work
on DOS fine so there you go. On the web very soon, and is running up to my CGI
interpretor.

Thanks,
 Alex

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

5. Re: eval() function

Does system() normally work to redirect output, for a Euphoria program, on
Linux?

Also, does it matter what the integer is as the second parameter?

Thanks,
 Alex

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

6. Re: eval() function

Alex Chamberlain wrote:
> Does system() normally work to redirect output, 
> for a Euphoria program, on Linux?

Yes, your system command can redirect output of a program 
to standard out, or standard error.
 
> Also, does it matter what the integer is as the second parameter?

On Linux, you should normally use 2.
0 and 1 are intended mainly for DOS graphics modes.

Regards,
   Rob Craig
   Rapid Deployment Software
   http://www.RapidEuphoria.com

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

7. Re: eval() function

Robert Craig wrote:
> Alex Chamberlain wrote:
> > Does system() normally work to redirect output, 
> > for a Euphoria program, on Linux?
> 
> Yes, your system command can redirect output of a program 
> to standard out, or standard error.

I didn't say that very well.

I should have said that a system command can redirect the
standard output or standard error output (or standard input)
of a program, even a Euphoria program. 
Here's a Linux example that does all 3:
system("mail < mail_commands > headers 2> /dev/null", 2)


I've never figured out how to redirect standard error on 
DOS or Windows.

Regards,
   Rob Craig
   Rapid Deployment Software
   http://www.RapidEuphoria.com

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

8. Re: eval() function

The problem I am now having in my server error logs is 'exu command not found'
and 'DEL command not found'.
Has anyone come across these before?

Thanks,
 Alex

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

9. Re: eval() function

Alex Chamberlain wrote:
> The problem I am now having in my server error logs is 'exu command not found'
> and 'DEL command not found'.
> Has anyone come across these before?

On a Linux system, DEL doesn't exist. 
Use rm instead.

Your CGI programs are not run under your user id.
They are run by a system process that has a different user id
and knows nothing about your EUDIR or PATH variables.
You might have to place a copy of exu in your cgi-bin directory,
or give the full absolute path to exu on your #! line.

Regards,
   Rob Craig
   Rapid Deployment Software
   http://www.RapidEuphoria.com

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

10. Re: eval() function

Ok so I have sorted out the DEL, that was easy (Thanks Rob)! What about the exu
it's in the cgi-bin?

Thanks,
 Alex

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

11. Re: eval() function

Alex Chamberlain wrote:
> Ok so I have sorted out the DEL, that was easy (Thanks Rob)! What about the
> exu it's in the cgi-bin?

Linux doesn't normally search in the current directory,
so you probably need:

#!./exu

rather than #!exu

Regards,
   Rob Craig
   Rapid Deployment Software
   http://www.RapidEuphoria.com

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

12. Re: eval() function

Hi Alex,

sorry for the delay in replying, it took some time until I had a new
idea. blink

You wrote:

> Thanks Juergen - amazing mind! I don't think I made it clear that
> I need the script to evaluate full Euphoria programs!
> I have adapted your script to run it my way.

I see now, cool! blink

[snipped the code]

> The only problem is that the Windows program doesn't like redirecting
> its input (can others please try it!) and it hasn't been run on
> Linux/FreeBSD yet. It work on DOS fine so there you go. On the web very
> soon, and is running up to my CGI interpretor.

The problem on Windows seems to be, that the program now uses system()
instead of system_exec(). However, I think it actually must do so,
because system_exec() can't be used for redirection of output.

But the disadvantage  of system() is here, that -- at least on Windows
-- the Eu program *does not wait* until system() has finished its work.
So in function eval(), the program tries to read the contens of the file
EVAL_RES_NAME, before they are (completely) written to the file!!

My idea now is, that the *last lines* of the temporary program
additionally create another temporary file, which is used as a flag.
And in function eval() we add some code for waiting, until this file
exists. If it exists, we know that system() has finished its work, all
output is redirected, and we can continue with the main program.

Also in the meantime we have learned from Rob, that on Linux it must be
"rm" rather than "del". So here comes my current version of the program,
which runs fine on DOS and Windows 98:

-----------------[ demo.ex ]-----------------
include misc.e
include file.e

global constant
EVAL_PROG_NAME = "eval_prg.tmp",
EVAL_RES_NAME  = "eval_res.tmp",
FLAG_FILE_NAME = "eval_flg.tmp",
EVAL_ERR_RET = -1,
EVAL_WRITE_ERR = 1,
EVAL_READ_ERR  = 2

global integer EVAL_ERROR

EVAL_ERROR = 0

global function eval (sequence script)
   sequence plat, del, ret
   integer tmp_fn
   object line

   -- write a temporary program for evaluating the script,
   -- and for creating a "flag" file
   tmp_fn = open(EVAL_PROG_NAME, "w")
   if tmp_fn = -1 then
      EVAL_ERROR = EVAL_WRITE_ERR
      return EVAL_ERR_RET
   end if

   puts(tmp_fn, script)
   puts(tmp_fn, "\n\ninteger fn\n"
               & "fn = open(\"" & FLAG_FILE_NAME & "\", \"w\")\n"
               & "print(fn,123)\n"
               & "close(fn)\n")
   close(tmp_fn)

   -- run the temporary program,
   -- and wait until it has finished!
   if platform() = DOS32 then
      plat = "ex"
      del = "del"
   elsif platform() = WIN32 then
      plat = "exw"
      del = "del"
   elsif (platform() = LINUX) or (platform() = FREEBSD) then
      plat = "exu"
      del = "rm"
   end if
   system(plat & " " & EVAL_PROG_NAME & " > " & EVAL_RES_NAME, 2)
   while atom(dir(FLAG_FILE_NAME)) do
   end while

   -- read the content of the temporary result file
   tmp_fn = open(EVAL_RES_NAME, "r")
   if tmp_fn = -1 then
      EVAL_ERROR = EVAL_READ_ERR
      return EVAL_ERR_RET
   end if

   ret = {}
   while 1 do
      line = gets(tmp_fn)
      if atom(line) then
         exit
      end if
      ret &= line
   end while
   close(tmp_fn)

   -- delete temporary files
   system(del & " *.tmp", 2)

   return ret
end function
---------------------------------------------



-----------------[ demo.ex ]-----------------
include eval.e
include get.e

sequence script
object ret

-- Define the script contents - any Euphoria code!
script = "puts(1, \"This is the result of the demo eval script!\")"

procedure handleReturn(object ret)
   puts(1, "The script output the following:\n" & ret)
end procedure

ret = eval(script)

if atom(ret) then
   if EVAL_ERROR = 0 then
      handleReturn(ret)
   elsif EVAL_ERROR = EVAL_WRITE_ERR then
      puts(1, "Sorry, there was a write error whilst evaluating the script")
   elsif EVAL_ERROR = EVAL_READ_ERR then
      puts(1, "Sorry, there was a read error whilst evaluating the script")
   end if
else
   handleReturn(ret)
end if

abort(wait_key()*0)
---------------------------------------------


Working on this actually is fun. blink

Regards,
   Juergen

-- 
Have you read a good program lately?

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

13. Re: eval() function

Ok here's my reply...

--eval.e
include misc.e
include file.e

global constant
EVAL_RAND_NUM = sprint(rand(999999)),
EVAL_PROG_NAME = "eval_prg" & EVAL_RAND_NUM & ".tmp",
EVAL_RES_NAME = "eval_res" & EVAL_RAND_NUM & ".tmp",
EVAL_FLAG_NAME = "eval_flag" & EVAL_RAND_NUM & ".tmp",
-- EVAL_BATCH_NAME = "eval_batch" & EVAL_RAND_NUM & ".bat",
EVAL_ERR_RET = -1,
EVAL_WRITE_ERR = 1,
EVAL_READ_ERR  = 2,
EVAL_BATCH_ERR = 3

global integer EVAL_ERROR

EVAL_ERROR = 0

global function eval (sequence script)
	sequence plat, ret, del
	integer tmp_fn
	object line, eu

	-- write a temporary program for evaluating the expression and
	-- writing the result to another temporary file
	tmp_fn = open(EVAL_PROG_NAME, "w")
	if tmp_fn = -1 then
		EVAL_ERROR = EVAL_WRITE_ERR
		return EVAL_ERR_RET
	end if
	
--	puts(tmp_fn, "include get.e\n")
	puts(tmp_fn, script)
	puts(tmp_fn, "\n\ninteger eval_flag_fn\n"
		& "eval_flag_fn = open(\"" & EVAL_FLAG_NAME & "\", \"w\")\n"
		& "print(eval_flag_fn, 123)\n"
		& "close(eval_flag_fn)\n"
--		& "abort(wait_key()*0)"
		)
	close(tmp_fn)

	-- run the temporary program
	if platform() = DOS32 then
		plat = "ex"
		del = "DEL"
	elsif platform() = WIN32 then
		plat = "exwc"
		del = "DEL"
	elsif (platform() = LINUX) or (platform() = FREEBSD) then
		plat = "exu"
		del = "rm"
	end if
	
	eu = getenv("EUDIR")

	if equal(plat, "exu") and atom(eu) then
		system("./" & plat & " " & EVAL_PROG_NAME & " > " & EVAL_RES_NAME, 2)
--	elsif equal(plat, "exw") then
--		tmp_fn = open(EVAL_BATCH_NAME, "w")
--		if tmp_fn = -1 then
--			EVAL_ERROR = EVAL_BATCH_ERR
--			return EVAL_ERR_RET
--		end if
--
--		puts(tmp_fn, "@echo off\n")
--		puts(tmp_fn, "exw " & EVAL_PROG_NAME & " > " & EVAL_RES_NAME)
--
--		close(tmp_fn)
--
--		system(EVAL_BATCH_NAME, 2)
	else
		system(plat & " " & EVAL_PROG_NAME & " > " & EVAL_RES_NAME, 2)
	end if

	while atom(dir(EVAL_FLAG_NAME)) do
	end while

	-- read the content of the temporary result file,
	-- and convert it to a number
	tmp_fn = open(EVAL_RES_NAME, "r")
	if tmp_fn = -1 then
		EVAL_ERROR = EVAL_READ_ERR
		return EVAL_ERR_RET
	end if

	ret = {}
	while 1 do
		line = gets(tmp_fn)
		if atom(line) then
			exit
		end if
		ret &= line
	end while
	close(tmp_fn)

	system(del & " *" & EVAL_RAND_NUM & ".tmp", 2)

--	if equal(plat, "exw") then
--		system("DEL " & EVAL_BATCH_NAME, 2)
--	end if

	return ret
end function


The demo remains unchange, but what has changed about eval.e? Well now the
eval.e can be used by multiple scripts, or the same script running multiple
times, at the same time as a random number is added to the file name. On Windows
XP, redirection was not working. exw is not a console program, so I replaced the
command to exwc (I even tried a batch file - code included)! And it works on
Linux if exu is installed in the same directory instead of EUDIR.

This idea of working together on the same script, even though its only two or
three of us, is what I want to get over with my new website at
euphoria.yourpixels.co.uk (I own yourpixels.co.uk). Please visit but do
understand it is far off completion!

Thanks,
 Alex

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

14. Re: eval() function

Alex Chamberlain wrote:
> 
> Ok here's my reply...
> 
> --eval.e
> }}}
<eucode>
> include misc.e
> include file.e
> 
> global constant
> EVAL_RAND_NUM = sprint(rand(999999)),
> EVAL_PROG_NAME = "eval_prg" & EVAL_RAND_NUM & ".tmp",
> EVAL_RES_NAME = "eval_res" & EVAL_RAND_NUM & ".tmp",
> EVAL_FLAG_NAME = "eval_flag" & EVAL_RAND_NUM & ".tmp",
> -- EVAL_BATCH_NAME = "eval_batch" & EVAL_RAND_NUM & ".bat",
> EVAL_ERR_RET = -1,
> EVAL_WRITE_ERR = 1,
> EVAL_READ_ERR  = 2,
> EVAL_BATCH_ERR = 3
> 
> global integer EVAL_ERROR
> 
> EVAL_ERROR = 0
> 
> global function eval (sequence script)
> 	sequence plat, ret, del
> 	integer tmp_fn
> 	object line, eu
> 
> 	-- write a temporary program for evaluating the expression and
> 	-- writing the result to another temporary file
> 	tmp_fn = open(EVAL_PROG_NAME, "w")
> 	if tmp_fn = -1 then
> 		EVAL_ERROR = EVAL_WRITE_ERR
> 		return EVAL_ERR_RET
> 	end if
> 	
> --	puts(tmp_fn, "include get.e\n")
> 	puts(tmp_fn, script)
> 	puts(tmp_fn, "\n\ninteger eval_flag_fn\n"
> 		& "eval_flag_fn = open(\"" & EVAL_FLAG_NAME & "\", \"w\")\n"
> 		& "print(eval_flag_fn, 123)\n"
> 		& "close(eval_flag_fn)\n"
> --		& "abort(wait_key()*0)"
> 		)
> 	close(tmp_fn)
> 
> 	-- run the temporary program
> 	if platform() = DOS32 then
> 		plat = "ex"
> 		del = "DEL"
> 	elsif platform() = WIN32 then
> 		plat = "exwc"
> 		del = "DEL"
> 	elsif (platform() = LINUX) or (platform() = FREEBSD) then
> 		plat = "exu"
> 		del = "rm"
> 	end if
> 	
> 	eu = getenv("EUDIR")
> 
> 	if equal(plat, "exu") and atom(eu) then
> 		system("./" & plat & " " & EVAL_PROG_NAME & " > " & EVAL_RES_NAME, 2)
> --	elsif equal(plat, "exw") then
> --		tmp_fn = open(EVAL_BATCH_NAME, "w")
> --		if tmp_fn = -1 then
> --			EVAL_ERROR = EVAL_BATCH_ERR
> --			return EVAL_ERR_RET
> --		end if
> --
> --		puts(tmp_fn, "@echo off\n")
> --		puts(tmp_fn, "exw " & EVAL_PROG_NAME & " > " & EVAL_RES_NAME)
> --
> --		close(tmp_fn)
> --
> --		system(EVAL_BATCH_NAME, 2)
> 	else
> 		system(plat & " " & EVAL_PROG_NAME & " > " & EVAL_RES_NAME, 2)
> 	end if
> 
> 	while atom(dir(EVAL_FLAG_NAME)) do
> 	end while
> 
> 	-- read the content of the temporary result file,
> 	-- and convert it to a number
> 	tmp_fn = open(EVAL_RES_NAME, "r")
> 	if tmp_fn = -1 then
> 		EVAL_ERROR = EVAL_READ_ERR
> 		return EVAL_ERR_RET
> 	end if
> 
> 	ret = {}
> 	while 1 do
> 		line = gets(tmp_fn)
> 		if atom(line) then
> 			exit
> 		end if
> 		ret &= line
> 	end while
> 	close(tmp_fn)
> 
> 	system(del & " *" & EVAL_RAND_NUM & ".tmp", 2)
> 
> --	if equal(plat, "exw") then
> --		system("DEL " & EVAL_BATCH_NAME, 2)
> --	end if
> 
> 	return ret
> end function
> </eucode>
{{{

> 
> The demo remains unchange, but what has changed about eval.e? Well now the
> eval.e
> can be used by multiple scripts, or the same script running multiple times,
> at the same time as a random number is added to the file name. On Windows XP,
> redirection was not working. exw is not a console program, so I replaced the
> command to exwc (I even tried a batch file - code included)! And it works on
> Linux if exu is installed in the same directory instead of EUDIR.
> 
> This idea of working together on the same script, even though its only two or
> three of us, is what I want to get over with my new website at
> euphoria.yourpixels.co.uk
> (I own yourpixels.co.uk). Please visit but do understand it is far off
> completion!
<snip>

Expression evaluation could be useful, you should post this on the archive. It
looks like it works simular to my dynamic inclusion system, though mine has a
sophisticated scanning system. Among other goodies, I plan to release another
major update to it very soon that adds support for nested dynamic & conditional
including, and automatic current file detection. In addition it will have an
improvement with the scanning system, another example program, and slightly
better documentation.


Regards,
Vincent

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

15. Re: eval() function

Alex Chamberlain wrote:
> 
> This idea of working together on the same script, even though its only two or
> three of us, is what I want to get over with my new website at
> euphoria.yourpixels.co.uk
> (I own yourpixels.co.uk). Please visit but do understand it is far off
> completion!

Alex, how are you getting the Euphoria code to run from the HTML? Have you
instructed the HTML server to run Euphoria when it encounters a certain tag
or what? Just curious, as my web sites are served by Euphoria as well, and I
also call my programs Euphoria Server Pages (ESP)! :)

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

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

Search



Quick Links

User menu

Not signed in.

Misc Menu