 Requesting ELSEIF - Printable Version +- HP Forums (https://www.hpmuseum.org/forum) +-- Forum: HP Calculators (and very old HP Computers) (/forum-3.html) +--- Forum: HP Prime (/forum-5.html) +--- Thread: Requesting ELSEIF (/thread-8026.html) Requesting ELSEIF - toml_12953 - 03-24-2017 05:30 PM If you're taking suggestions for additions to HPPL, I'd like to propose the addition of ELSEIF (or ELIF). With lengthy IF-THEN structures, it can tighten up the code considerably. Tom L Current way (greatly trivialized example): Code: ```IF x>7 THEN   PRINT("TOO HIGH"); ELSE   IF X<4 THEN     PRINT("TOO LOW");   ELSE     PRINT("JUST RIGHT");   END; END;``` Now improved with ELSEIF Code: ```IF x>7 THEN   PRINT("TOO HIGH"); ELSEIF X<4 THEN   PRINT("TOO LOW"); ELSE   PRINT("JUST RIGHT"); END;``` RE: Requesting ELSEIF - Han - 03-24-2017 05:38 PM (03-24-2017 05:30 PM)toml_12953 Wrote:   Code: ```IF x>7 THEN   PRINT("TOO HIGH"); ELSE   IF X<4 THEN     PRINT("TOO LOW");   ELSE     PRINT("JUST RIGHT");   END; END;``` Now improved with ELSEIF Code: ```IF x>7 THEN   PRINT("TOO HIGH"); ELSEIF X<4 THEN   PRINT("TOO LOW"); ELSE   PRINT("JUST RIGHT"); END;``` CASE blocks have similar logic to nested ELSE-IF blocks (exiting the block once a condition is met and relevant actions are executed). It doesn't make your code any shorter but can provide improved legibility. Code: ```CASE   IF x>7 THEN PRINT("TOO HIGH"); END;   IF x<4 THEN PRINT("TOO LOW"); END;   PRINT("JUST RIGHT"); END;``` RE: Requesting ELSEIF - compsystems - 03-24-2017 06:21 PM I like the version ELSEIF. instead of using CASE now with IFTE functional command version PHP Code: `EXPORT elif(x)BEGIN  IFTE(x>7,print("TOO HIGH"),IFTE(x<4,print("TOO LOW"),print("JUST RIGHT")));END; ` A small survey. you need an IFT() functional command? (without ELSE block) PHP Code: `EXPORT ift(x)BEGIN  IFTE(x>7,print("TOO HIGH"),IFT(x<4,print("TOO LOW")));END; ` RE: Requesting ELSEIF - toml_12953 - 03-24-2017 06:52 PM (03-24-2017 06:21 PM)compsystems Wrote:  I like the version ELSEIF. instead of using CASE now with IFTE functional command version A small survey. you need an IFT() functional command? I'm all for anything that makes my job easier. I actually make a living converting old programs (mostly BASIC) to run on Prime. I'd share them with the group but my employer owns everything I write relating to their business (even after hours!) I'd like both ELSEIF and IFTE. I'd also like user-defined datatypes (like records), printing and a whole bunch more. We can dream, can't we? Tom L RE: Requesting ELSEIF - compsystems - 03-24-2017 07:16 PM What kind toml_12953 of programs are you converting and where can you test them? RE: Requesting ELSEIF - toml_12953 - 03-24-2017 07:33 PM (03-24-2017 07:16 PM)compsystems Wrote:  What kind toml_12953 of programs are you converting and where can you test them? I convert environmental programs. These were used for by our field workers for years on laptops and even some BASIC handhelds. We're equipping them with Primes now and I convert programs that monitor and analyze climate data (yes it really IS changing!) and do things like calculate how fast the liquid level in different shaped tanks such as underground tanks used by abandoned gas stations will go up or down based on the input or leakage (a lot of differential equations there). We also keep track of changing migratory patterns of birds and other animals. It's a lot of fun at times but sometimes converting the spaghetti code makes me want to hit the sauce! Gee, C, Pascal and other languages have GOTO. Why can't Prime? Tom L RE: Requesting ELSEIF - Carlos295pz - 03-24-2017 07:45 PM (03-24-2017 06:21 PM)compsystems Wrote:  you need an IFT() functional command? (without ELSE block) IFTE can be defined without ELSE RE: Requesting ELSEIF - compsystems - 03-24-2017 08:16 PM (03-24-2017 07:45 PM)Carlos295pz Wrote:   (03-24-2017 06:21 PM)compsystems Wrote:  you need an IFT() functional command? (without ELSE block) IFTE can be defined without ELSE but only HOME PRG, for CAS fails PHP Code: `EXPORT iftHOME(x)BEGIN IFTE(x>7,print("true")); return "Done";END;#casiftCAS(x):=BEGIN IFTE(x>7,print("true")); return "Done";END;#end ` iftHOME(8); returns "Done" iftCAS(8); returns "when(x>7,print(""true"")) in iftCAS(5) instruction #1 error, try debug(iftCAS(5)) Error: Bad Argument Type" RE: Requesting ELSEIF - toml_12953 - 03-25-2017 11:43 AM (03-24-2017 05:38 PM)Han Wrote:  CASE blocks have similar logic to nested ELSE-IF blocks (exiting the block once a condition is met and relevant actions are executed). It doesn't make your code any shorter but can provide improved legibility. Just to show you, here's the actual ANSI/ISO BASIC statement statement I'm converting: PHP Code: `IF (t = 1) OR (t = 2) OR (t = 3) THEN! circle, ellipse, or hyperbola   LET Xo = -Dr/(2*Ar)   LET Yo = -Er/(2*Cr)   PRINT "translation = {"; USING\$("-%.####",Xo); ", "; USING\$("-%.####",Yo); "}"   LET r(1) = Ar/(Ar*Xo*Xo + Cr*Yo*Yo - Fr)   LET r(3) = Cr/(Ar*Xo*Xo + Cr*Yo*Yo - Fr)   LET r(6) = -1.0   IF ABS(r(1)) < ABS(r(3)) THEN    ! foci on x-axis      LET a2 = ABS(1 / r(1))      LET b2 = ABS(1 / r(3))      IF t = 2 THEN                 ! ellipse         LET c1 = SQR( a2 - b2 )         PRINT "foci = {±"; USING\$("-%.####",c1); ", 0.0000}"         PRINT "eccentricity ="; USING\$("-%.#####",c1 / SQR(a2))      ELSEIF t = 3 THEN            ! hyperbola         LET c1 = SQR( a2 + b2 )         PRINT "foci = {±"; USING\$("-%.####",c1); ", 0.0000}"         PRINT "eccentricity ="; USING\$("-%.#####",c1 / SQR(a2))      END IF   ELSE                             ! foci on y-axis      LET a2 = ABS(1 / r(3))      LET b2 = ABS(1 / r(1))      IF t = 2 THEN                 ! ellipse         LET c1 = SQR( a2 - b2 )         PRINT "foci = {0.0000, ±"; USING\$("-%.####",c1); "}"         PRINT "eccentricity ="; USING\$("-%.#####",c1 / SQR(a2))      ELSEIF t = 3 THEN            ! hyperbola         LET c1 = SQR( a2 + b2 )         PRINT "foci = {0.0000, ±"; USING\$("-%.####",c1); "}"         PRINT "eccentricity ="; USING\$("-%.#####",c1 / SQR(a2))      END IF   END IFELSEIF t = 4 THEN                   ! parabola   IF ABS(Ar) > ABS(Cr) THEN        ! form: x² - 4·p·y = 0      LET Xo = Dr/(2*Ar)      LET Yo = (Fr - Dr*Dr/(4*Ar))/Er      PRINT "translation = {"; USING\$("-%.####",Xo); ", "; USING\$("-%.####",Yo); "}"      LET r(1) = 1      LET r(5) = Er / Ar      LET p = -r(5)/4      PRINT "focus = {0, "; USING\$("-%.####",p); "}"   ELSE                            ! form: y² - 4·p·x = 0      LET Xo = (Fr - Er*Er/(4*Cr))/Dr      LET Yo = Er/(2*Cr)      PRINT "translation = {"; USING\$("-%.####",Xo); ", "; USING\$("-%.####",Yo); "}"      LET r(3) = 1      LET r(4) = Dr / Cr      LET p = -r(4)/4      PRINT "focus = {"; USING\$("-%.####",p); ", 0}"   END IFEND IF `