Factor

Ajalugu

Slava Pestov lõi Factori aastal 2003 skriptimiskeelena arvutimängude jaoks. Algne implementatsioon, mida nüüd teatakse nimega JFactor, oli kirjutatud Javas ja töötas Java virtuaalmasinas. Kuigi see algne versioon sarnanes praeguse Factoriga süntaksi poolest, on praegune Factor suuresti teistsuguste põhimõtetega ning ka oluliselt kiirem.
Algselt keskendusid Factori programmid Java objektide manipuleerimisele Java refleksioonivahenditega. Üks läbivaid ideid on olnud kohandada keelt temas kirjutavatele programmidele. Ei JFactoris ega esimestes masinkoodiks kompileerivates kompilaatorites polnud objektisüsteemi, kus programmeerija saaks oma klasse defineerida; tänapäeval on objektisüsteem Factori keskne osa. Muud olulised võimalused nagu ennikuklassid, makrod ja kasutaja-defineeritud parsimissõnad lisati tükkhaaval, vastavalt sellele, kui palju ja mil viisil nende järele vajadust oli. Juba varastest aegadest peale on Factoril olnud liides C (programmeerimiskeel) keelde.
JFactor koosnes alguses ainult interpretaatorist, hiljem lisati kompilaator Java baitkoodi. See kompilaator töötas ainult osadel protseduuridel. Javas kirjutatud JFactor asendati C-s ja Factoris kirjutatud Factori implementatsiooniga. Aja jooksul on Factori implementatsioon oluliselt kiiremaks muutunud.

Programmeerimisparadigma

Factor on dünaamilise tüüpimisega, funktsionaalne ja objektorienteeritud programmeerimiskeel. Kood on struktureeritud väikeste protseduuride ümber, neid nimetatakse sõnadeks. Tavaliselt on nad 1–3 rida pikad, ja rohkem kui 7-realine sõna on väga haruldane. Mis oleks muus keeles üks protseduur, on Factoris tavaliselt mitu.
Iga sõna võtab konstantse arvu argumente ja tagastab konstantse arvu väärtusi. Argumente saadetakse sõnadesse magasini abil, kasutades tagurpidi prefikskuju. Seda magasini kasutatakse ainult sõnade väljakutsumiste korraldamiseks, mitte andmestruktuurina. Factori magasini kasutatakse sarnaselt Forthi omaga – neid mõlemaid nimetatakse magasinipõhisteks programmeerimiskeelteks. Näiteks selline näeb välja koodijupp, mis prindib väljundvoogu "hello world":
 "hello world" print
print on sõna io sõnastikus; ta võtab ühe stringi magasini pealt ega tagasta midagi. Ta prindib sõna käesolevasse väljundvoogu (milleks on vaikimisi kas terminal või graafiline kuular).
Mitte kõiki andmeid ei pea edastama magasiniga. Staatilise skoopimisega saab protseduurisiseselt ajutisi muutujaid väärtustada ja lugeda. Dünaamilise skoopimisega saab muutujaid magasini kasutamata protseduuride väljakutsumistele saata, näiteks töötavad nii sisend- ja väljundvoog.
Factoris on rõhk paindlikkusel ja keele laiendamise võimalustel. On olemas süsteem makrode ja suvaliste keelesüntaksimuutuste jaoks. Neid laiendusi kasutatakse sagedasti, et lubada uut tüüpi sõnadefinitsioone ja literaale andmestruktuuride jaoks. Neid kasutatakse ka näiteks XML-teegi jaoks. Näiteks järgmine sõna võtab argumendiks stringi ja loob XML-dokumendiobjekti:
 : make-html ( string – xml )
    dup
    <XML
        <html>
            <head><title><-></title></head>
            <body><h1><-></h1></body>
        </html>
    XML> ;
Sõna dup kloonib magasini pealmist elementi, <-> tähendab siin dokumendi selle osa täitmine magasini pealmise elemendiga.