Newbie questions about Pliant

Newbie questions about Pliant

strange problem or bug

squaring a zero doesn't work for some reason.
Message posted by maybe Boris Reitman on 2005/12/09 19:23:28
----------------8<----------------
type Point
  field Float x y
method p dump
  arg Point p
  console "(" + string:(p:x) + ", " string:(p:y) ")" eol
function do_something a
  arg Point a
  a dump
  console (a:x)^2
function point x y -> a
  arg Float x y ; arg Point a
  a:x := x ; a:y := y

do_something (point 0.1 0.1)
console eol
do_something (point 0 0)
----------->8----------------------

Here is the run,
----------8<-----------------------
(0.1, 0.1)
0.01
(0, 0)
?
---------->8-----------------------

Why is the ? mark there, instead of 0 ? 
Message posted by hubert.tonneau on 2005/12/09 22:29:11
Because 0.0^2 is undefined, and undefined is displayed as a question mark.

Just try:
pliant command 'console 0^2 eol'
then:
pliant command 'console 0.0^2 eol'
Message posted by maybe Boris Reitman on 2005/12/10 11:38:29
Why is such behaviour desirable ?  Here I want to implement the distance squared
function between two points. I had to do the squaring by repeating the terms, 
instead of using ^2 for squaring, which is inconvenient.

function distance2 a b -> d
  arg Point a b ; arg Float d
  d := (a:y - b:y) * (a:y - b:y) + (a:x-b:x) * (a:x-b:x)

Message posted by hubert.tonneau on 2005/12/10 13:15:27
Let's imagine that we want to define:

function '^' x y
  arg Float x arg Int y

What is the code for it ?

Do we define at as a loop, so that x<=0 is allowed, but with potencial
unresonable computation time, or do we define it as using exponencial,
so that x<=0 is not allowed ?

What I believe is that Pliant current behaviour is just the one you will
find in any other language.
Message posted by pom on 2005/12/10 15:35:48
The code should be soething like:

if x>0
  return (exp y*log:x)
eif x=0
  if y>0
    return 0
  eif y=0
    return 1 # usual
  else
     ??
eif ((y cast Int)=y and y>0)
  if (y cast Int)%2=1
     return -(exp y*(log -x))
  else
     return (exp y*(log -x))
else
  ??
Message posted by pom on 2005/12/10 15:36:08
The code should be soething like:

if x>0
  return (exp y*log:x)
eif x=0
  if y>0
    return 0
  eif y=0
    return 1 # usual
  else
     ??
eif ((y cast Int)=y and y>0)
  if (y cast Int)%2=1
     return -(exp y*(log -x))
  else
     return (exp y*(log -x))
else
  ??