|
From: Robert J. B. <ru...@bb...> - 2004-11-19 04:33:01
|
Tim,
I would certainly vote for this solution. To me it seems strange to
think that the presence of a leading 0 changes the interpretation of a
string as a number.
--Rusty
Timothy J Hickey wrote:
>
> On Nov 18, 2004, at 7:52 PM, Ken Anderson wrote:
>
>> Yes.
>>
>>> (string->number "077")
>>
>> 77
>> However, because he is a JScheme user, he has several alternatives
>> to choose from:
>>
>>> (string->expr "077")
>>
>> 63
>> a JScheme built in, which uses the JScheme reader.
>>
>>> (Integer. "077")
>>
>> 77
>> that uses a Java reflector.
>
>
> True....
> It seems that there is plenty of room for confusion...
> We can always use Javadot to convert from different bases...
>
>> > (Integer.parseInt "77" 8)
>> 63
>> > (Integer.parseInt "FF77" 16)
>> 65399
>> > (Long.parseLong "FF77" 16)
>> 65399L
>
>
> I suppose we could jettison the octal and hex notation for integers
> and longs and require
> users to go to javadot if they want to use octal/hex numbers....
>
> ---Tim---
>
>
>>
>> What i'd propose now it to change the error message to be
>> informative, something like
>> 081 is an invalid octal number.
>>
>> What really worried Rusty and i is that we need to read
>> "0770304" as 77 degrees 3 minutes and 4 seconds. to specify a
>> latitude or longitude. We compute these lat/lons for our customers.
>> We do it correctly, but getting it wrong could be life threatiing.
>>
>> If nothing else we need to change the error and update the JScheme
>> spec (where ever it is).
>>
>> Though bases other than 10 are pretty strange for our customers and
>> users, so backing a Java thing that probably goes back to a C thing
>> for writing device drivers, might be wrong. There has been plenty of
>> discussion of this feature of JScheme, maybe it should be removed.
>>
>> k
>>
>>
>> At 07:23 PM 11/18/2004 -0500, Timothy J Hickey wrote:
>>
>>> This brings us back to an early thread from June of 2004 ...
>>> in which we decided to disallow Java octal notation in
>>> (string->number x)
>>> invocations, but to allow it in JScheme code to ease the interaction
>>> with Java ...
>>>
>>> On Nov 18, 2004, at 6:25 PM, Robert J. Bobrow wrote:
>>>
>>>> This lef to my trying the following test:
>>>>
>>>>> (- 0777 777)
>>>>
>>>> -266
>>>
>>>
>>>> (- (string->number "0777") 777)
>>>
>>> 0
>>>
>>>> (.getClass (read))
>>>
>>> 081
>>> class jsint.Symbol
>>>
>>>> Is it required that numbers starting with 0 be treated as octal?
>>>> --Rusty
>>>>
>>>>
>>>>
>>> .
>>>
>>> The idea was that JScheme literals should be the same as Java literals
>>> whenever possible to enhance the transparency of the javadot interface.
>>> In standard Scheme code, octal is not very important because you rarely
>>> deal with 32 or 64 bit integers. Java is a different story, e.g.
>>> converting from
>>> long bits to double its nice to have a hex representation of
>>> integers....
>>>
>>> ---Tim---
>>>
>>>
>>>
>>>> Begin forwarded message:
>>>>
>>>>> From: Ken Anderson <kan...@bb...>
>>>>> Date: June 7, 2004 10:24:02 AM EDT
>>>>> To: Timothy John Hickey <tim...@ma...>
>>>>> Cc: JScheme Developers <jsc...@li...>
>>>>> Subject: Re: [Jscheme-devel] string->number
>>>>>
>>>>> So the remaining issue is what should (string->number "08")
>>>>> return. It currently returns #f. i was hoping it would return 8.
>>>>>
>>>>> At 07:27 PM 6/6/2004 -0400, Timothy John Hickey wrote:
>>>>>
>>>>>> I've modified string->number so that in the base 10 case it
>>>>>> allows leading zeroes...
>>>>>> The following Unit tests all pass in the current version of
>>>>>> JScheme...
>>>>>>
>>>>>> "06/06/2004" ;; literal syntax, TJH
>>>>>>
>>>>>> ;; Default literal syntax is for Java literals,
>>>>>>
>>>>>> ;; but string->number will treat leading zeroes as decimal if
>>>>>> base 10 is specified
>>>>>>
>>>>>> (equal? (.getClass '081) jsint.Symbol.class)
>>>>>>
>>>>>> (equal? (.getClass '0123Dig) jsint.Symbol.class)
>>>>>>
>>>>>> (equal? (.getClass '0123) java.lang.Integer.class)
>>>>>>
>>>>>> (equal? (string->number "081" 10) 81)
>>>>>>
>>>>>> (equal? (string->number "010") 10)
>>>>>>
>>>>>> (equal? (string->number "010" 8) 8)
>>>>>>
>>>>>> (equal? (tryCatch (string->number "081" 8) (lambda(e) 'error))
>>>>>> 'error)
>>>>>>
>>>>>> (equal? (string->number "08") #f)
>>>>>>
>>>>>> (equal? (string->number "08" 10) 8)
>>>>>>
>>>>>> (equal? (string->number "10") 8)
>>>>>>
>>>>>> (equal? (string->number "10" 10) 10)
>>>>>>
>>>>>> The implementation of string->number in the base 10 case is
>>>>>>
>>>>>>> public static Object schemeStringToNumber(String tok, int rdx) {
>>>>>>> try { return U.toNum(Long.parseLong(tok, rdx)); }
>>>>>>> catch (NumberFormatException e) {
>>>>>>> try {
>>>>>>> if (rdx!=10)
>>>>>>> return U.FALSE;
>>>>>>> else return new Double(tok); }
>>>>>>> catch (NumberFormatException e2)
>>>>>>> { return U.FALSE; }
>>>>>>> }
>>>>>>> }
>>>>>>
>>>>>>
>>>>>> ---Tim---
>>>>>>
>>>>>>
>>>
>>>
>>> </blockquote></x-html>
>>
>>
>
>
|