Bug i if-sats?

Tråden skapades och har fått 8 svar. Det senaste inlägget skrevs .
1
  • Medlem
  • International user
  • 2004-04-30 14:26

Detta måsta vara en rejäl bugg i AppleScript:

set the_list to {}
repeat with n in {1, 2, 3, 4, 5}
	if n = 3 then
		exit repeat
	end if
	set the_list to the_list & n
end repeat
the_list

the_list borde ha värdet {1, 2}, men får värdet {1, 2, 3, 4, 5}
Byter man ut '=' till '>' eller '<' funkar det som det ska:

if n > 3 then ger {1,2,3}

En major-bugg?

  • Medlem
  • Stockholm
  • 2004-04-30 14:52
Ursprungligen av Wire:

Detta måsta vara en rejäl bugg i AppleScript:

set the_list to {}
repeat with n in {1, 2, 3, 4, 5}
	if n = 3 then
		exit repeat
	end if
	set the_list to the_list & n
end repeat
the_list

the_list borde ha värdet {1, 2}, men får värdet {1, 2, 3, 4, 5}
Byter man ut '=' till '>' eller '<' funkar det som det ska:

if n > 3 then ger {1,2,3}

En major-bugg?

Det är onekligen märkligt!

Skicka en bugrapport till Apple.

Ursprungligen av Wire:

Detta måsta vara en rejäl bugg i AppleScript:

set the_list to {}
repeat with n in {1, 2, 3, 4, 5}
	if n = 3 then
		exit repeat
	end if
	set the_list to the_list & n
end repeat
the_list

the_list borde ha värdet {1, 2}, men får värdet {1, 2, 3, 4, 5}
Byter man ut '=' till '>' eller '<' funkar det som det ska:

if n > 3 then ger {1,2,3}

En major-bugg?

Om du gör så här funkar det :

set the_list to {}
repeat with n in {1, 2, 3, 4, 5}
	if n as integer is 3 then
		exit repeat
	end if
	set the_list to the_list & n
end repeat
the_list
  • Medlem
  • 2004-04-30 17:22

Hade samma problem själv för ett tag sedan och var bergis på att det här är en bug. Men efter att skärskådat dokumentationen så kunde jag konstatera att jag hade fel. Detta är förväntat beteende.

Det här fungerar inte

repeat with x in {1,2,3,4,5}
    if x = 2 then 
      display dialog "2"
    end if
end repeat

Faktum är att x aldrig är 2, x är referensen till till det andra elementet i listan {1,2,3,4,5}
Rätt syntax är att referera till värdet av x istället för referera till elementet i listan.

repeat with x in {1,2,3,4,5}
  if contents of x = 2 then
      display dialog "2"
  end if
end repeat

Mvh
/Ulf

  • Medlem
  • International user
  • 2004-05-01 12:29
Ursprungligen av Ulf H:

Hade samma problem själv för ett tag sedan och var bergis på att det här är en bug. Men efter att skärskådat dokumentationen så kunde jag konstatera att jag hade fel. Detta är förväntat beteende.

Faktum är att x aldrig är 2, x är referensen till till det andra elementet i listan {1,2,3,4,5}
Rätt syntax är att referera till värdet av x istället för referera till elementet i listan.

repeat with x in {1,2,3,4,5}
  if contents of x = 2 then
      display dialog "2"
  end if
end repeat

Mvh
/Ulf

x blir 2. Se själv. Har lagt in 'display dialog' i exemplet:_

set the_list to {}
repeat with x in {1, 2, 3, 4, 5}
display dialog x
if x is 3 then
exit repeat
end if
set the_list to the_list & x
end repeat
the_list

Det måste vara en bug i AppleScripts datatype coercion.

  • Medlem
  • International user
  • 2004-05-01 12:57

För den som orkar tar jag det hela ett steg vidare.

set x to 0
set the_list to {}
repeat with n in {"1", 2, "3", 4, 5}
	set x to x + n
	display dialog x
	if n = 3 then
		exit repeat
	end if
	set the_list to the_list & n
end repeat
the_list

Observera att jag blandat datatyper i 'the_list'. Addering med 'set x to x + n' fungerar med 'n'. Tack vare data type coercion. 'n' är talen i 'the_list'. Men i 'if'-satasen blir aldrig 'n' 3.

Problemet har en fungerande "workaround" (n as integear), men jag anser det vara en bugg.

  • Medlem
  • 2004-04-30 17:30

För att förtydliga det där med referensen till listan så kan Ni kolla in följande exempel.

Vad tror Ni resultatet blir av följande kod:

set Lista1 to {1,2,3,4,5}
set Lista2 to {}
repeat with x in Lista1
    set end of Lista2 to x
end repeat

Svar:

item 5 of {1, 2, 3, 4, 5}

vilket inte är det samma som integer 5

Mvh
/Ulf

  • Medlem
  • International user
  • 2004-05-01 11:38

Aha. Men då kan man ju fråga sig varför '<' och '>' fungerar och inte '=' ?

  • Medlem
  • 2004-05-01 16:46

Problemet är bara att dialog inte visar hela sanningen...

Om jag använder en construct enligt

repeat with variable name in list

Exempel:

repeat with x in {1,2,3}
..
end repeat

Så är det inte siffran 1,2,3 jag tittar på det är innehållet i listan
dvs

item 1 (of {1,2,3})
item 2 (of {1,2,3})
item 3 (of {1,2,3})

repeat with <variableneme> in <list> är beskriven som

"This construct is like a repeat, but the variable <variablename> is assigned
successively a reference to each item of the list"

När du gör display så ser du referensen dvs item 1 visas som 1 men det är
inte det integer värde som du jämför med i din lista. Det är därför man i
detta fall (vilket jag håller med om är inkonsekvent) måste kolla på innehållet
i listan i stället för referensen till innehållet i listan.

dvs if x is 3 then

Ska utläsas som

if "item 3 of {1,2,3}" is 3 then , vilket är false,

inte som man skulle tro (eller vill att det ska vara)

if "cast(item 3 of {1,2,3}) to integer" is 3

och därför fungerar istället

if n as integer is 3

eller alternativt

if contents of x

Att vi pratar om referenser och inte faktiska värden dvs integer
Går faktiskt att visa. Via Apples Discussion Forums hittade jag en bra
metod att kunna testa detta i AppleScript.

Genom att använda en liten "debugger" metod kan man testa om
man jobbar med referenser eller faktiska värden. Denna method
kallar vi isRef()

(* This method test if we are using a reference to a value or not *)

on isRef(TestIfRef)
try
TestIfRef as reference
return true
on error
return false
end try
end isRef

repeat with x in {1, 2, 3}
display dialog isRef(x)
end repeat

Detta problem är tydligen också
dokumenterat som förväntat beteende i "Applescript The
Definitive Guide" från O'Reilly. Jag har inte boken själv
men tipset ovan med isRef() som jag fick via någon person
från Apple's Discussion Forum refererade till denna bok.
Någon som kanske har boken kan verifiera om detta är
sant eller inte.

Men det hindrar ju inte på något sätt att Du kan rapportera
detta som ett dåligt beteende i AppleScript. Jag funderar
själv på att göra det. Det är ju ett bra sätt att se till att
Applescript blir bättre och mer ur användares ögon mer
lätt använt. Eller att dokumentationen fås en genomgång.

Jag vet att Sal Soghoian (Applescript Product Manager) har
sagt att han är medveten om att dokumentationen inte
är i fas med själva funktionaliteten. Men att man internt
många gånger måste fokusera på att i första hand få
funktionaliteten att fungera och därmed blir ibland dokumentationen
lidande.

Referenser är faktiskt ett litet helvete i AppleScript för det är rätt
inkonsekvent när Applescript själv kan göra en implicit derefernce
(normalt vad man kallar cast) mellan en datatyp till en annan
och att man inte dokumenterar detta. Det behöver således inte
vara en "bug" i ordets rätta bemärkelse utan kass dokumentering.

Jag håller fullständigt med om
att det är tokigt att '>' , '<' fungerar annorlunda än '='. Konsekvent sett
så skulle ingen av ovanstående fungera utan att man
själv gör en explicit dereference till innehållet om man utgår från
det resonemang som jag lärt mig är det rätta.

Mvh
/Ulf

1
Bevaka tråden