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 .. '' )...