Re: eval() function

new topic     » goto parent     » topic index » view thread      » older message » newer message

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 thread      » older message » newer message

Search



Quick Links

User menu

Not signed in.

Misc Menu