[Prev][Next][Index][Thread]
multiple values in a return from function
I'm not sure what I'm doing wrong here. I wanted to return two values from
a function that computes solar positions--the right ascension and
declination of the sun. Both are <floats>. When I tried interactively
testing this function, it would only return 1 value. I must be missing
something simple, but I don't get it. If I change the function to return
an object that contains a right ascension slot and a declination slot, it
works fine. If I return a list of the right ascension and declination, it
works too.
What Dylan concept do I need to bone up on?
I've included the source for illustration:
**** This one works when tested interactively ****
define method compute-solar-position( epoch-day :: <integer> ) =>
( results :: <astro-position>)
// Now pre-compute the important values based on epoch day
ecliptic-obliquity := 23.4393 - 3.563e-7 * epoch-day;
solar-eccentricity := 0.016709 - 1.151E-9 * epoch-day;
solar-mean-anomaly := 356.0470 + 0.9856002585 * epoch-day;
solar-arg-perihelion := 282.9404 + 4.70935E-5 * epoch-day;
// compute eccentric anomaly in radians
let eccentric-anomaly = solar-mean-anomaly + (solar-eccentricity *
sin( solar-mean-anomaly ) *
( 1.0 + solar-eccentricity *
os( solar-mean-anomaly )));
// compute x and y component of true anomaly position
let x-true-anom = cos( eccentric-anomaly ) - solar-eccentricity;
let y-true-anom = sqrt( 1.0 - solar-eccentricity ^ 2 ) *
in( eccentric-anomaly );
let true-anomaly = atan2( y-true-anom , x-true-anom );
// assume this is in AU?
let solar-distance = sqrt( x-true-anom ^ 2 + y-true-anom ^ 2);
// compute solar true longitude
let solar-true-long = true-anomaly + solar-arg-perihelion;
// compute solar ecliptic rectangular coordinates
let x-sun = solar-distance * cos( solar-true-long );
let y-sun = solar-distance * sin( solar-true-long );
// now convert these to equatorial, rectangular coordinates
let eq-x-sun = x-sun;
let eq-y-sun = y-sun * cos( ecliptic-obliquity );
let eq-z-sun = y-sun * sin( ecliptic-obliquity );
let suns-pos = make( <astro-position> );
// Finally, compute right ascension and declination
suns-pos.right-ascension := atan2( eq-y-sun, eq-x-sun );
suns-pos.declination := atan2( eq-z-sun, sqrt( eq-x-sun ^ 2 +
eq-y-sun ^ 2));
suns-pos;
end method;
**** This one doesn't ****
define method compute-solar-position( epoch-day :: <integer> ) =>
( results :: false-or( <astro-position>))
// Now pre-compute the important values based on epoch day
ecliptic-obliquity := 23.4393 - 3.563e-7 * epoch-day;
solar-eccentricity := 0.016709 - 1.151E-9 * epoch-day;
solar-mean-anomaly := 356.0470 + 0.9856002585 * epoch-day;
solar-arg-perihelion := 282.9404 + 4.70935E-5 * epoch-day;
// compute eccentric anomaly in radians
let eccentric-anomaly = solar-mean-anomaly + (solar-eccentricity *
sin( solar-mean-anomaly ) *
( 1.0 + solar-eccentricity *
os( solar-mean-anomaly )));
// compute x and y component of true anomaly position
let x-true-anom = cos( eccentric-anomaly ) - solar-eccentricity;
let y-true-anom = sqrt( 1.0 - solar-eccentricity ^ 2 ) *
in( eccentric-anomaly );
let true-anomaly = atan2( y-true-anom , x-true-anom );
// assume this is in AU?
let solar-distance = sqrt( x-true-anom ^ 2 + y-true-anom ^ 2);
// compute solar true longitude
let solar-true-long = true-anomaly + solar-arg-perihelion;
// compute solar ecliptic rectangular coordinates
let x-sun = solar-distance * cos( solar-true-long );
let y-sun = solar-distance * sin( solar-true-long );
// now convert these to equatorial, rectangular coordinates
let eq-x-sun = x-sun;
let eq-y-sun = y-sun * cos( ecliptic-obliquity );
let eq-z-sun = y-sun * sin( ecliptic-obliquity );
// Finally, compute right ascension and declination
let right-ascension = atan2( eq-y-sun, eq-x-sun );
let declination = atan2( eq-z-sun, sqrt( eq-x-sun ^ 2 + eq-y-sun ^
2));
values( right-ascension, declination );
end method;
Follow-Ups: