Pooh program example 01-complex.p
# test complex number library - complex.inc include 'complex.inc' n = make_rect_complex( ~re 0 ~im 1 ) m = make_rect_complex( ~re 0 ~im 1 ) res = n . mult( ~num m ) println( ~msg 'square of i is' ) res . print() res = res . add( ~num res ) println( ~msg ' twice i is' ) res . print() println( ~msg ' absolute is [ res . absolute () ]' )
# make a complex number in polar coordinates
sub make_polar_complex( rad, theta )
   return {
	    # complex number mode - polar coordinates
	    'mode' : 'polar',
	    # radius
	    'rad' : rad,
	    # angular value
	    'thet' : theta,
	    'add'   : sub( num )
			r = this.torect()
			res = r.add( ~num num )
			return res.topolar()
		      end,
	    'sub'   : sub( num )
		        r = this.torect()
		        res = r.add( ~num num )
			return res.topolar()
		      end,		       
	     'mult' : sub( num )
		        r = this.torect()
		        res = r.mult( ~num num )
			return res.topolar()
		      end,
	     'div'  : sub( num )
		        r = this.torect()
		        res = r.div( ~num num )
			return res.topolar()
		      end,		       
	       # returns the absolute number of this value (length of vector)
             'absolute' : sub() 
			    r = this.torect()
	  		    return r.absolute()
			  end,
	     # convert to rectangular coordinate
	     'torect' : sub()
			 make_rect_complex( ~re this.rad * cos( ~num this.theta ) ~im this.rad * sin( ~num this.theta ) )
			end,
	    			
	     'topolar' : sub()
			    return this
			end,
    # print the number
	    'print' : sub() 
			print( ~msg 'rectangular-polar: radius [ this.rad ] theta [ this.theta ]' )
		      end
	  }
end		  
# make a complex number in rectangular coordinates
sub make_rect_complex( re, im )
    return { 
	     # complex numer mode - rectangular/Cartesian coordinates
	     'mode' : 'rectangular',
	     # real value
	     're' : re,
	     #imaginairy value; return new object that is the result  
	     'im' : im,
	      # add this to argument num and return the result; return new object that is the result 
             'add' : sub( num )
			if num.mode ne 'rectangular'
			    num = num.torect()
			end
			return make_rect_complex( ~re this.re + num.re  ~im this.im + num.im )
		     end,
	      # multiply this by argument num and return the result; return new object that is the result 
	      'mult' : sub( num )
			if num.mode ne 'rectangular'
			    num = num.torect()
			end
		        return make_rect_complex( ~re this.re * num.re - this.im * num.im ~im this.im * num.re + this.re * num.im )
		     end,
	      # print the number
	      'print' : sub() 
			    print( ~msg 'rectangular-complex: real [ this.re ] imaginary [this.im]' )
		      end,
	      # divide this by the argument num; return new object that is the result
	      'div'   : sub( num )
			    if num.mode ne 'rectangular'
				num = num.torect()
			    end
		            sq = this.re * num.re + this.im * num.im 
			    re = ( this.re * num.re + this.im * num.im) / sq
			    im = ( num.im * this.re - this.re * num.im) / sq
			    return make_rect_complex( ~re re ~im im )
			end,
	       # returns the absolute number of this value (length of vector)
	       'absolute' : sub() 
				return sqr( ~num 3 ) #this.re * this re + this.im * this im )
			    end,
	       # convert to rectangular coordinates - return this object.
	       'torect' : sub()
			    return this
	  		  end,					
	       # convert to polar coordinates
	       'topolar' : sub()
			     rad = sqr( ~num this.re * this.re + this.im * this.im )
			     thet = atan2( ~x this.im ~y this.re )
			     return make_polar_complex( ~rad rad ~theta thet )
			   end
	   }			    
end
square of i is rectangular-complex: real -1 imaginary 0 twice i is rectangular-complex: real -2 imaginary 0 absolute is 1.732051e+00Trace output for 01-complex.p
004|... = make_rect_complex( ~re 0 ~im 1 )... 069| return { 'mode' : 'rectangular' , 're' : re:0 , 'im' : im:1 , 'add' : sub (~num) , 'mult' : sub (~num) , 'print' : sub () , 'div' : sub (~num) , 'absolute' : sub () , 'torect' : sub () , 'topolar' : sub () } 004|n = make_rect_complex( ~re 0 ~im 1 ):{ 'absolute' : sub , 'torect' : sub , 'topolar' : sub , 'mode' : -> 'rectangular', 'print' : sub , 'mult' : sub , 'div' : sub , 'im' : -> 1, 'add' : sub , 're' : -> 0 } 005|... = make_rect_complex( ~re 0 ~im 1 )... 069| return { 'mode' : 'rectangular' , 're' : re:0 , 'im' : im:1 , 'add' : sub (~num) , 'mult' : sub (~num) , 'print' : sub () , 'div' : sub (~num) , 'absolute' : sub () , 'torect' : sub () , 'topolar' : sub () } 005|m = make_rect_complex( ~re 0 ~im 1 ):{ 'absolute' : sub , 'torect' : sub , 'topolar' : sub , 'mode' : -> 'rectangular', 'print' : sub , 'mult' : sub , 'div' : sub , 'im' : -> 1, 'add' : sub , 're' : -> 0 } 007|... = n{'mult'}:sub ( ~num m:{ 'absolute' : sub (), 'torect' : sub (), 'topolar' : sub (), 'mode' : -> 'rectangular', 'print' : sub (), 'mult' : sub (~num), 'div' : sub (~num), 'im' : -> 1, 'add' : sub (~num), 're' : -> 0 } )... 089| if (num{'mode'}:'rectangular' ne 'rectangular'):false 090| end # if 092| return make_rect_complex( ~re ((this{'re'}:0 * num{'re'}:0):0 - (this{'im'}:1 * num{'im'}:1):1):-1 ~im ((this{'im'}:1 * num{'re'}:0):0 + (this{'re'}:0 * num{'im'}:1):0):0 )... 069| return { 'mode' : 'rectangular' , 're' : re:-1 , 'im' : im:0 , 'add' : sub (~num) , 'mult' : sub (~num) , 'print' : sub () , 'div' : sub (~num) , 'absolute' : sub () , 'torect' : sub () , 'topolar' : sub () } 092| return make_rect_complex( ~re ((this{'re'}:0 * num{'re'}:0):0 - (this{'im'}:1 * num{'im'}:1):1):-1 ~im ((this{'im'}:1 * num{'re'}:0):0 + (this{'re'}:0 * num{'im'}:1):0):0 ):{ 'absolute' : sub , 'torect' : sub , 'topolar' : sub , 'mode' : -> 'rectangular', 'print' : sub , 'mult' : sub , 'div' : sub , 'im' : -> 0, 'add' : sub , 're' : -> -1 } 007|res = n{'mult'}:sub ( ~num m:{ 'absolute' : sub (), 'torect' : sub (), 'topolar' : sub (), 'mode' : -> 'rectangular', 'print' : sub (), 'mult' : sub (~num), 'div' : sub (~num), 'im' : -> 1, 'add' : sub (~num), 're' : -> 0 } ):{ 'absolute' : sub , 'torect' : sub , 'topolar' : sub , 'mode' : -> 'rectangular', 'print' : sub , 'mult' : sub , 'div' : sub , 'im' : -> 0, 'add' : sub , 're' : -> -1 } 009|println( ~msg 'square of i is' )... 010|res{'print'}:sub ( )... 097| print( ~msg 'rectangular-complex: real ' .. this{'re'}:-1 .. ' imaginary ' .. this{'im'}:0 .. '' )... 013|... = res{'add'}:sub ( ~num res:{ 'absolute' : sub (), 'torect' : sub (), 'topolar' : sub (), 'mode' : -> 'rectangular', 'print' : sub (), 'mult' : sub (~num), 'div' : sub (~num), 'im' : -> 0, 'add' : sub (~num), 're' : -> -1 } )... 081| if (num{'mode'}:'rectangular' ne 'rectangular'):false 082| end # if 084| return make_rect_complex( ~re (this{'re'}:-1 + num{'re'}:-1):-2 ~im (this{'im'}:0 + num{'im'}:0):0 )... 069| return { 'mode' : 'rectangular' , 're' : re:-2 , 'im' : im:0 , 'add' : sub (~num) , 'mult' : sub (~num) , 'print' : sub () , 'div' : sub (~num) , 'absolute' : sub () , 'torect' : sub () , 'topolar' : sub () } 084| return make_rect_complex( ~re (this{'re'}:-1 + num{'re'}:-1):-2 ~im (this{'im'}:0 + num{'im'}:0):0 ):{ 'absolute' : sub , 'torect' : sub , 'topolar' : sub , 'mode' : -> 'rectangular', 'print' : sub , 'mult' : sub , 'div' : sub , 'im' : -> 0, 'add' : sub , 're' : -> -2 } 013|res = res{'add'}:sub ( ~num res:{ 'absolute' : sub (), 'torect' : sub (), 'topolar' : sub (), 'mode' : -> 'rectangular', 'print' : sub (), 'mult' : sub (~num), 'div' : sub (~num), 'im' : -> 0, 'add' : sub (~num), 're' : -> -1 } ):{ 'absolute' : sub , 'torect' : sub , 'topolar' : sub , 'mode' : -> 'rectangular', 'print' : sub , 'mult' : sub , 'div' : sub , 'im' : -> 0, 'add' : sub , 're' : -> -2 } 015|println( ~msg ' twice i is' )... 018|res{'print'}:sub ( )... 097| print( ~msg 'rectangular-complex: real ' .. this{'re'}:-2 .. ' imaginary ' .. this{'im'}:0 .. '' )... 021|println( ~msg ' absolute is ' .. res{'absolute'}:sub ( )... 115| return sqr( ~num 3 )... 115| return sqr( ~num 3 ):1.732051e+00 021|println( ~msg ' absolute is ' .. res{'absolute'}:sub ( ):1.732051e+00 .. '' )...