Re: NULL value anyone?
- Posted by Shian_Lee Mar 31, 2015
- 1364 views
First of all Tom, please accept my apology.
I did not mean to underestimate you in any way. I was rude and it's not the first time.
Your work here is extremely important. Without good documentation the languages is totally useless.
About the stack example:
Testing for atoms vs sequences is an idiomatic Euphoria concept. It does hide the idea that "no stack" has been given the reasonable looking value 0 zero instead of a glaring (here it is idiot!) value like NULL, NOTANUBMER, NAN, FAIL, EXCEPTION which is used in Another_Language.
-- elementry stack push and pop subroutines include std/console.e function push( object stack, object x ) if atom(stack) then return {x} -- new stack from underflow condition end if return append(stack, x ) end function function pop( object stack ) if length(stack) = 0 then return { 0, 0 } -- next pop will be underflow else return { stack[1..$-1], stack[$] } end if end function
A sample run looks like:
object sk = 0 -- new "underflow" stack -- uninitiated object x -- unspecified item sk = push(sk,"cats") sk = push(sk,"dogs") display( " [1]", {sk} ) {sk,x} = pop(sk) if atom(sk) then display( "Underflow" ) else display(x) end if display( " [1]", {sk} ) {sk,x} = pop(sk) if atom(sk) then display( "Underflow" ) else display(x) end if display(sk) display( " [1]", {sk} )
Could be modified, for example, to (not debugged):
-- it's faster to call append(stack, x) directly. function push(sequence stack, object x) return append(stack, x) end function function pop(sequence stack) integer len = length(stack) if len then return {stack[1..len - 1], stack[len]} else return {} -- return stack to its initial state. end if end function -- Example for modified push()/pop(): sequence stack = {} object item = "Shian is rude" stack = push(stack, item) --> or faster: append(stack, item) stack = pop(stack) if length(stack) then item = stack[2] stack = stack[1] end if
About using Booleans... Normally I use stacks in-line as a global/local/private sequence, for specific purpose, so in this case I can optimize the process by using an integer as a length counter, to avoid calling length(). Booleans can be used in many ways to optimize the code, for example: stack1_empty = not length(stack[1][4])
If I must test for an empty stack many times then it's better to code: if stack1_empty then...
instead of coding if not length(stack[1][4]) then...
There are many other ways to use Booleans, depends on what the stack is for. Booleans can be stored in a single integer and set/reset using or_bits()/and_bits() which is fast and convenient.
The important thing to remember is that NOVALUE modifies the behavior of Euphoria in a massive way, and the "Cost Vs Benefit" might be awful and truly not reasonable.