[comp.sys.handhelds] Good ways to...

b2676870@soph.cs.ubc.ca (wilson w ma) (04/21/91)

Hello. I've got two questions about RPL.

How is one suppose to delete elments from a list? I.e., if I've a list of
say 10 items and want to delete the 5th item, how do I do it? I've RTFM over
and over and can't find any command that does this. You can use + to add to
a list but there is no such command for removing. I've cooked up the following
but is this optimal?

\<<
  \-> l n
  \<< 
    l OBJ\-> m
    \<<
      IF n 1 \>= n m \<= AND THEN
        m n - 1 + ROLL DROP m 1 - \->LIST
      ELSE
        m \->LIST
      END
    \>>
  \>>
\>>

My second question is about converting strings from mixed case to uppercase
only. I've written the following but it's too slow. Is there anyway to speed
it up? (Would it be too much to ask of any one of the ML hotshots to redo 
this? ;) I've tried to replace the IF DUP THEN sequence with an IFERR but 
that was slower.

\<<
  DUP SIZE 1 SWAP
  FOR i
    DUP i DUP SUB
    "ABCDEFGHIJKLMNOPQRSTUVWXYZ"
    "abcdefghijklmnopqrstuvwxyz"
    ROT POS
    IF DUP THEN
      DUP SUB i SWAP REPL
    ELSE
      DROP2
    END
  NEXT
\>>

Any suggestions on the above would be appreciated.

George

rouben@math16.math.umbc.edu (Rouben Rostamian) (04/21/91)

In article <1991Apr20.222545.12776@soph.cs.ubc.ca> b2676870@soph.cs.ubc.ca (wilson w ma) writes:
>How is one suppose to delete elments from a list? I.e., if I've a list of
>say 10 items and want to delete the 5th item, how do I do it?

...[Program deleted]

Here is a shorter program to remove a given element from a list. 
\<< 	DUP2 
	1 SWAP 1 - SUB
	3 ROLLD
	1 + OVER SIZE SUB
	+
\>>

Example:
  2:  { 1 2 3 4 5 6 }
  1:                2

Efter evaluating the program you will have:

  1:  { 1 3 4 5 6 }

Hope that this helps.

Regarding your other qustion on converting mixed strings to uppercase, have
you tried using NUM?  Although I have not tried, I would think that it would
be rather easy to write a program using NUM for this purpose.

--
Rouben Rostamian                          Telephone: (301) 455-2458
Department of Mathematics and Statistics  e-mail:
University of Maryland Baltimore County   bitnet: rostamian@umbc.bitnet
Baltimore, MD 21228,  U.S.A.              internet: rouben@math9.math.umbc.edu

sburke@jarthur.Claremont.EDU (Scott Burke) (04/22/91)

And here's a stack-based approach to removing an object from a list, which 
executes about 25% faster than the one using SUB:

Input:

2: list
1: index

\<< SWAP OBJ\-> DUP DUP 3 + ROLL - 2 + ROLL DROP 1 - \->LIST \>>

If you're looking for something more elegant, however, you're out of luck--
there is no specific command to do what you want.

Scott.
sburke@jarthur.claremont.edu

@vms3.macc.wisc.edu:KAUFMAN@ETHL.DecNet (KAUFMAN) (04/22/91)

On 20 Apr 91 22:25:45 GMT b2676870@soph.cs.ubc.ca (wilson w ma) writes:

>My second question is about converting strings from mixed case to uppercase
>only. I've written the following but it's too slow. Is there anyway to speed

[program deleted]

How about this?

STRUP [4E04]

<< DUP SIZE 1 SWAP
   FOR i DUP i DUP
	SUB NUM DUP DUP 96 >
	SWAP 123 < AND
		IF
		THEN 32 - CHR
		SWAP DUP 1 i 1 - SUB
		SWAP DUP SIZE i 1 +
		SWAP SUB 3 ROLLD
		SWAP + SWAP +
		ELSE DROP
		END
    NEXT
>>

This of course was written on an HP28S and typed in manually. I do not think
there are any typos (famous last words). On my 28S it goes at approximately 
.1 s/char with a string of all lowercase (.05 s/char with all uppercase).
I don't know if this is fast or slow, you be the judge. Have fun!

                                                        TheSeeker            
                                                           DAK               
                                                     ______________________  
                                                    /       . _____ .      \ 
 ____________________________________________________     .   |<__|/  .    | 
 |  Internet:  dkaufman@vms.macc.wisc.edu           |    .    |  |/    .   | 
 |  Bitnet:    dkaufman@wiscmacc                    |   .     ---/-     .  | 
  \ SnailMail: 1820 Summit Avenue Madison, WI 53705 |   .     __/__     .  | 
   \--\    'Two shift keys? That's stupid.'         |    .    |/_>|    .   | 
       \ HP /--\ 28S /--\ IS /--\ THE /-\ KEY /------     .   /|  |   .    | 
        \__/    \___/    \__/    \___/   \___/      |      . /-----. .     | 
                                                    \______________________/ 

bson@wheat-chex.ai.mit.edu (Jan Brittenson) (04/22/91)

In a posting of [22 Apr 91 02:49:00 GMT]
   @vms3.macc.wisc.edu:KAUFMAN@ETHL.DecNet (KAUFMAN) writes:

 > How about this?
 > STRUP [4E04]
 > << DUP SIZE 1 SWAP
 >    FOR i DUP i DUP
 > 	SUB NUM DUP DUP 96 >
 > 	SWAP 123 < AND
 >		IF
 >		THEN 32 - CHR
 >		SWAP DUP 1 i 1 - SUB
 >		SWAP DUP SIZE i 1 +
 >		SWAP SUB 3 ROLLD
 >		SWAP + SWAP +
 >		ELSE DROP
 >		END
 >     NEXT
 > >>

   Doesn't work for the entire ISO 8859-1 character set,
unfortunately. The best thing would probably be to use a 256-character
translation table. Fortunately, converting HP-48 characters to
uppercase is identical to converting ISO 8859-1 to uppercase. Here is
such a translation table, used by the STAR assembler, in C. (Notice
the German double-S exception, it translates to itself.) It should be
trivial to write an Emacs macro (or what tools are being used) to
transform this into an HP-48 string, or STAR assembler. (The table
version probably *will* run faster than explicitly checking for all
odds and ends of ISO 8859-1. It will probably use more memory,
though.)


/* ISO 8859-1 uppercase conversion table */
unsigned char upper_table[0400] =
{
  '\000', '\001', '\002', '\003', '\004', '\005', '\006', '\007',
  '\010', '\011', '\012', '\013', '\014', '\015', '\016', '\017',
  '\020', '\021', '\022', '\023', '\024', '\025', '\026', '\027',
  '\030', '\031', '\032', '\033', '\034', '\035', '\036', '\037',
  '\040', '\041', '\042', '\043', '\044', '\045', '\046', '\047',
  '\050', '\051', '\052', '\053', '\054', '\055', '\056', '\057',
  '\060', '\061', '\062', '\063', '\064', '\065', '\066', '\067',
  '\070', '\071', '\072', '\073', '\074', '\075', '\076', '\077',
  '\100', '\101', '\102', '\103', '\104', '\105', '\106', '\107',
  '\110', '\111', '\112', '\113', '\114', '\115', '\116', '\117',
  '\120', '\121', '\122', '\123', '\124', '\125', '\126', '\127',
  '\130', '\131', '\132', '\133', '\134', '\135', '\136', '\137',
  '\140', 'A', 'B', 'C', 'D', 'E', 'F', 'G',
  'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O',
  'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X',
  'Y', 'Z', '\173', '\174', '\175', '\176', '\177',
  '\200', '\201', '\202', '\203', '\204', '\205', '\206', '\207',
  '\210', '\211', '\212', '\213', '\214', '\215', '\216', '\217',
  '\220', '\221', '\222', '\223', '\224', '\225', '\226', '\227',
  '\230', '\231', '\232', '\233', '\234', '\235', '\236', '\237',
  '\240', '\241', '\242', '\243', '\244', '\245', '\246', '\247',
  '\250', '\251', '\252', '\253', '\254', '\255', '\256', '\257',
  '\260', '\261', '\262', '\263', '\264', '\265', '\266', '\267',
  '\270', '\271', '\272', '\273', '\274', '\275', '\276', '\277',
  '\300', '\301', '\302', '\303', '\304', '\305', '\306', '\307',
  '\310', '\311', '\312', '\313', '\314', '\315', '\316', '\317',
  '\320', '\321', '\322', '\323', '\324', '\325', '\326', '\327',
  '\330', '\331', '\332', '\333', '\334', '\335', '\336', '\337',
  '\300', '\301', '\302', '\303', '\304', '\305', '\306', '\307',
  '\310', '\311', '\312', '\313', '\314', '\315', '\316', '\317',
  '\320', '\321', '\322', '\323', '\324', '\325', '\326', '\367',
  '\330', '\331', '\332', '\333', '\334', '\335', '\336', '\377' };

						-- Jan Brittenson
						   bson@ai.mit.edu