r3wp [groups: 83 posts: 189283]
  • Home
  • Script library
  • AltME Archive
  • Mailing list
  • Articles Index
  • Site search
 

World: r3wp

[Core] Discuss core issues

Sunanda
10-Feb-2007
[7051]
Happens to me all the time......:-(
Ladislav
10-Feb-2007
[7052x5]
Robert: the following approach is better:
a-function: func [] [return make error! "problem"]
error? a-function ; == true
or: error? the-error: a-function
etc.
Graham
10-Feb-2007
[7057x4]
I want to create a little spreadsheet application where users have 
access to the mathematical functions in rebol and nothing else.
Is there some way to constrain 'do to work within a specific context 
of some mathematical functions, and nothing else?
Or, do I have to write a little mini parser ?
There's a little parser here http://www.rebol.com/docs/core23/rebolcore-15.html
Ladislav
10-Feb-2007
[7061x2]
you don't have to write a parser. The approach using my SAFE-EVAL 
function may be faster:

safe-eval: func [
	stm-block [block!]
	/local stm
] [
	stm: make block! (length? stm-block) * 2 + 1
	insert stm first stm-block
	while [stm-block: next stm-block not tail? stm-block] [
		insert tail stm :first
		insert/only tail stm stm-block
	]
	first do/next stm
]
(before using SAFE-EVAL you should test the first element of the 
STM-BLOCK to find out whether it is one of the functions you are 
willing to evaluate)
Graham
10-Feb-2007
[7063x2]
so, use example?
Do I have to check each value in the block for safety?
Ladislav
10-Feb-2007
[7065x3]
error? try [safe-eval [square-root print "gotcha!"]] ; == true
...check each value in the block for safety?
 - no
just the first one
Graham
10-Feb-2007
[7068x2]
Ok, I'm going to use this example first : 0.56 * sqrt(tender28) + 
0.28 * sqrt(swollen28) + 0.70 * ln(ESR) + 0.014 * GH
turn that into Rebol first ... and then only check the first value?
Ladislav
10-Feb-2007
[7070]
it looks, like you want to use any expression, not just function 
evaluation?
Graham
10-Feb-2007
[7071]
yes ..
Ladislav
10-Feb-2007
[7072]
then it is not for you, this was just for a function evaluation
Graham
10-Feb-2007
[7073]
Ok, so looks like it will have to be a parser
Ladislav
10-Feb-2007
[7074]
yes
Graham
10-Feb-2007
[7075]
but it would be nice to be able to use the rebol parser do evaluate 
words within a mathematical context only
Ladislav
10-Feb-2007
[7076]
when using a parser, you can even use operator precedence rules and 
such
Graham
10-Feb-2007
[7077x6]
A non parse based solution ( ie. parse = too hard! )
eval-math: func [ exp [string!]
	/local t allowed okay
][
	allowed: [ + - / square-root log-e * ]
	t: to block! exp
	bind t '+
	okay: true
	allowed: [ + - / square-root log-e * ]
	foreach e t [
		switch/default type?/word e [
			paren! [ eval-math form e ]
			word! [ if not find allowed e [ okay: false break ]]
			decimal! []
			integer! []
		][ okay: false break ]
	]
	either okay [
		do t
	][ none ]
]
Hmm.  Needs debugging
eval-math: func [ exp [string!]
	/local t allowed
][
	allowed: [ + - / square-root log-e * ]
	t: to block! exp
	bind t '+
	foreach e t [
		switch/default type?/word e [
			paren! [ if none? eval-math form e [ return none ]	]
			word! [ 
				if not find allowed e [ 
					print [ "not allowed is : " e ]
					return none
				]
			]
			decimal! []
			integer! []
		][ return none ]
	]
	do t
]
How does one access the parts of a function?
eg; func [face /local var][print face/text] 
how do I get to the [print face/text ] part?
Ladislav
10-Feb-2007
[7083]
second func [face /local var] [print face/text] ; == [print face/text]
Graham
10-Feb-2007
[7084x2]
oh?  and third is the locals ?
I was thinking it should be after third and not before :(
Ladislav
10-Feb-2007
[7086]
first is the simplified spec, third is the complete spec
Graham
10-Feb-2007
[7087]
ah ...
Ladislav
10-Feb-2007
[7088]
third was added later than first and second IIRC
Graham
10-Feb-2007
[7089x2]
What was pekr talking about regarding alpha r3 core release?
Do you know?
Ladislav
10-Feb-2007
[7091]
no
Graham
10-Feb-2007
[7092]
too much beer?
Ladislav
10-Feb-2007
[7093]
fiction writer, maybe
Graham
10-Feb-2007
[7094x2]
porkies ?
Seems I have enough clues now to write my little spreadsheet :)
Pekr
11-Feb-2007
[7096]
Graham - it was a joke. And I thought as maybe ppl would not understand, 
if I would post it in Announce group, I posted it rather in Humour 
group :-)
Gabriele
11-Feb-2007
[7097x2]
graham: why are you using to-block there? (my assumption is that 
you wanted to avoid the binding of load, but then you manually bind 
to the global context, so you can just use load)
a different approach is to create a context with only the words you 
want to allow, then use to-block, then bind it to your context only, 
then do it.
Ladislav
11-Feb-2007
[7099]
yes, the transformation to string and to block back and forth looks 
a bit messy
Volker
11-Feb-2007
[7100]
in-shadow-context: use first system/words['some-word]

then bind to 'some-word. somewhat  expensive, but you do it only 
on input. 

Escapes: it  does not go into #[object![..]]. I have  a function 
which does  that too.  ifthe user can do a  stringwith a new word, 
that  word is still global.