Her vil jeg give en introduktion til programmerinssproget Factor.
Factor har en lille kerne i C, men ellers er alt Factor skrevet i Factor. Factor er ca. 5 år gammel men har allerede et stort bibliotek og er pænt hurtig. Factor er stakbaseret, men i modsætning til mange andre stakbaserede sprog (f.eks. Forth) er Factor høj-niveau. Den er en Garbage Collector, optimiserende compiler, og en ikke optimiserende compiler når man skriver sin kode i
listeneren som vil blive nævnt senere. Den har en nem binding til C (FFI); med en linie kan man lave en binding til en C funktion. Den har et objekt-orienteret system, omend lidt anderledes end det man er vant til hvis man kommer fra C++, Java eller lign.. Den støtter de mest populære platforme som Windows, Linux og Mac. Man kan 'deploye' sin applikationer så de kan køre uden Factor installeret. Kort sagt man kan bruge Factor til de samme projekter som man kan med andre sprog som C#, Java osv..
For at gøre det nemmere at følge med i den følgende introduktion anbefales det at du henter Factor her
http://www.factorcode.org/. Hvis du bruger en 32bit platform så hent den ud for x86 (lige pt. er der ingen 64bit til windows så hent 32bit). Jeg bruger x86 Windows versionen (som fylder 20,3MB) men det burde ikke give nogen problemer med at følge denne introduktion. Factor kræver ingen installation, blot udpakning af den fil du henter. Udpak den et sted hvor du ved du kan finde den igen. Inde i mappen du udpakker ligger der en ekserkverbar fil kaldet factor.exe (på windows), start den. Det der gerne skulle komme frem nu er
listeneren. Her kan man interaktivt teste sin kode og køre den. Man kan se information om objekter på stakken ved at klikke på dem og en
inspector vindue kommer frem. Ved at trykke på F1 kan man få
browseren frem, hvor man kan se dokumentation samt søge i den.
Factor er stakbaseret. Dette betyder at værdier ligger i en stak. Det kan sammenlignes med en liste (array, vector osv.) hvor man kun kan tage fra toppen. Der er dog måde at manipulere data der er dybere i stakken. Dette er den primære måde at føre data rundt i ens program på. Man kan godt binde data til variabler som man er vant fra andre sprog, int tal = 20;. Men dette betragtes ikke som god stil, og når man er blevet vant til Factor vil jeg vove at sige det ligefrem komplikerer ens kode og derfor om muligt (hvilket det er 99% af tiden) bør undgås. På stakken kan man udføre operationer. Dette gøres typisk med
words som minder meget om funktioner. Et
word tager nogle værdier fra stakken og gør noget med dem. Factor bruger
postfix notation. Fra andre sprog er du typisk vant til
infix notation når du bruger de simple aritmetiske operatorer. Infix er når du skriver 5 + 4. Factor er som nævnt postfix (post betyder efter), og her skriver du 5 4 +. Nogle sprog har
prefix hvor du skriver + 5 4. Lads os se lidt på hvordan man arbejder med stakken. Det der står efter (scratchpad) er det der skal skrives i listeneren, og der kan være flere steder der skal skrives noget i de eksempler jeg giver. Tryk enter når linien slutter.:
( scratchpad ) 1
--- Data stack:
1
( scratchpad ) 2
--- Data stack:
1
2
( scratchpad ) 3 4 5 6 7 8 9
--- Data stack:
1
2
3
4
5
6
7
8
9
( scratchpad ) +
--- Data stack:
1
2
3
4
5
6
7
17
( scratchpad ) -
--- Data stack:
1
2
3
4
5
6
-10
( scratchpad ) *
--- Data stack:
1
2
3
4
5
-60
( scratchpad ) /
--- Data stack:
1
2
3
4
-1/12
( scratchpad ) *
--- Data stack:
1
2
3
-1/3
( scratchpad ) *
--- Data stack:
1
2
-1
( scratchpad ) +
--- Data stack:
1
1
( scratchpad ) -
--- Data stack:
0
( scratchpad ) drop
( scratchpad )
Som det kan ses behøver man ikke skrive en ting ad gangen. Faktisk kunne vi skrive alt dette i en linie hvis vi ville.
drop er et af de words der kaldes
shuffle words. Shuffle betyder at blande, så det er words som blander. De ændrer på
rækkefølgen og
højden af stakken. Højden er hvor mange objekter der er på stakken. Før vi skrev
drop var der et objekt på stakken. Før vi skrev minus var der 2 (1 og 1). Rækkefølgen af stakken kan som nævnt også ændres. Hvis vi har følgende stak:
( scratchpad ) 1 2 3
--- Data stack:
1
2
3
( scratchpad )
Så er 3 det øverste element. 2, er det andenøverste element og 1 er det tredje og sidste element. Hvis vi skrev + nu ville den tage de to øverste 2 og 3 og lægge dem sammen til 5 og putte 5 øverst på stakken og der ville stå 1 5. Men i stedet ville jeg vise nogle shuffle words. Her er nogen af dem, og hvad deres mnemonic står for, af dem jeg kan gætte mig frem til:
dup - duplicate - kopier - ( x -- x x )
2dup - duplicate - kopier 2 - ( x y -- x y x y )
drop - smid - ( x -- )
2drop - smid 2 - ( x y -- )
nip - ( x y -- y )
2nip - ( x y z -- z )
over - ( x y -- x y x )
tuck - "gem ind bag" - ( x y -- y x y )
swap - byt - ( x y -- y x )
Det virker måske som mange men faktisk er det kun lige under halvdelen. Og efter lidt brug sidder de på rygraden. Lads os se hvordan man kan bruge dem, jeg vil antage du har 1 2 3 på stakken:
--- Data stack:
1
2
3
( scratchpad ) dup
--- Data stack:
1
2
3
3
( scratchpad ) 2dup
--- Data stack:
1
2
3
3
3
3
( scratchpad ) 2drop
--- Data stack:
1
2
3
3
( scratchpad ) 2nip
--- Data stack:
1
3
( scratchpad ) over
--- Data stack:
1
3
1
( scratchpad ) tuck
--- Data stack:
1
1
3
1
( scratchpad ) swap
--- Data stack:
1
1
1
3
( scratchpad ) - - -
--- Data stack:
-2
( scratchpad ) clear
( scratchpad )
clear er et word som fjerner alt på stakken ligegyldigt hvor meget der er. Som nævnt kan det godt virke forvirrende i starten, men tro mig, efter et stykke tid vil disse shuffle words sidde på rygraden.
Indlæg senest redigeret d. 08.07.2009 14:13 af Bruger #14645