Hur kolla om värde är inom ett spann?

Tråden skapades och har fått 11 svar. Det senaste inlägget skrevs .
1
  • Medlem
  • 2011-10-14 11:27

Hur tar jag reda på om ett numeriskt värde ligger inom ett intervall utan att säga "är större än X och är mindre än Y"?
Hur får jag dialogen "true" här:

set A to 10
if A is in (5 thru 15) then
	display dialog "true"
end if

Vad skulle nyttan av det vara? Du kommer inte undan med mindre än tre operationer ändå, även om det kanske finns nåt syntaktiskt socker för att göra det snyggare.

  • Medlem
  • 2011-10-14 12:13

Nyttan skulle väl vara "snyggare" kod. Jämför

if A ≥ 5 and A ≤ 10 then
   --
else if A is in (5 thru 10)
   --
end

Jag bara undrade...

För att "5 thru 15" ska vara definierat behöver du nog ha en lista med hela populationen. Nedanstående exempel fungerar bara om A är ett heltal i valt intervall.

set bigList to {}
set bigListRef to a reference to bigList
repeat with n from 1 to 100
	copy n to the end of bigListRef
end repeat

set A to 10
if A is in items 5 thru 15 of bigList then
	display dialog "true"
end if
  • Medlem
  • 2011-10-15 13:23

Jo, det finns ju en rad lösningar för att åstadkomma ungefär det jag vill, men då är nog min ursprungliga bäst hittills.

Vad är grejen med "reference to" i ditt exempel?

Om du med din ursprungliga menar koden i första inlägget så funkar den inte alls för mig. Jag får syntaxfel: thru:15 får inte hamna efter 5.

Av någon anledning går det snabbare att bygga listor via en referens till listan än att anropa en lista direkt. I exemplet ovan spelar det ingen roll men om man vill bygga en lista med hundratusentals värden så uppges det göra stor skillnad.

  • Medlem
  • 2011-10-15 14:13
Ursprungligen av M. Sundbom:

Av någon anledning går det snabbare att bygga listor via en referens till listan än att anropa en lista direkt. I exemplet ovan spelar det ingen roll men om man vill bygga en lista med hundratusentals värden så uppges det göra stor skillnad.

Intressant!

  • Medlem
  • 2011-10-15 14:09

Förlåt, jag menade det första exemplet som fungerar, dvs det jag nämner i inlägg #3:

set A to 10
if A ≥ 5 and A ≤ 10 then
-- your code here
end

Tja, det går väl kanske att göra något i den här stilen

set A to 5


if false is not in {A ≥ 5, A ≤ 10} then
	return true
else
	return false
end if

Men, det är ju både fult och dumt

Skälet til att du tycker den riktiga (vanliga) syntaxen är "ful" är att du inte använder parenteser. Om du i stället tar för vana att omge varje uttryck med parentes så blir det mycket lättare att skumma igenom koden

if (A ≥ 5) and (A ≤ 10) then…

Då förstår man också bättre vad evalueringsordningen är, dvs. innehållet i den första parentesen, innehållet i den andra, och därefter sammantaget. Är man då dessutom så systematisk att man sätter det mest sannolika uttrycket i den första parentesen så får man också en optimering (mikroskopisk i dagens datorer), i och med att bara den utvärderas om innehållet är falskt

  • Medlem
  • 2011-10-15 21:04

Enters RR...

Jag brukar faktiskt sätta mina delar inom parentes, men det var inte problem med att läsa jag hade, utan när jag skrev "snyggare" menade jag att jag tycker att det hade varit snyggare om man faktiskt kunde få AS att förstå frågan om något är finns i ett spann. Med ful menar jag styltig eller "ointelligent", lite trubbigt uttryckt, inte svårläst.
Jämför frågan "Är 10 i spannet 5-15?" med "Är 10 större än 5 och 10 är mindre än 15?"

Men du tänker fel

Alla programmeringsspråk (de flesta iaf) bygger på att saker kan brytas ner till sant eller falskt, eller rättare sagt 1 eller 0 (prova f.ö. uttrycket '1 as boolean' resp '0 as boolean' ).

De här enkla matematiska operatorerna är så entydiga att det blir lättare att skriva saker som faktiskt fungerar. Ta ditt exempel 5-15, ska det betyda "till" eller "till och med", dvs. är 15 utanför spannet (till) eller innanför (till och med)

Men, det är också dumt för att det är inflexibelt. Om du jämför med min konstruktion så kan u den slänga in t.ex. undantag

{A ≥ 5, A≠7, A ≤ 10}

eller vilket villkor som helst du vill ha uppfyllt.

Mao, kombinationen av vedertagna operatorer (>< &) eller om man så önskar, "in" (list) är både extremt kraftfullt, mindre tvetydigt och enklare att hålla i minnet. Så, varför vill du ha något annat?

Ett större problem är i så fall sånt som t.ex. frånvaron av XOR (exclusive OR) som verkligen är yxigt.

  • Medlem
  • 2011-10-17 15:08

Haha, jag förstår precis vad du säger och har inga problem med det. Men eftersom applescript är ganska generöst med hur man formulerar tänkte jag att det kanske fanns utrymme för en mer generell formulering i det specifika.

Ursprungligen av Richard Rönnbäck:

Men du tänker fel

Du går visst i Thorilds fotspår, min gode vän...

1
Bevaka tråden