# Factor

Factor ist eine freie Programmiersprache, die von Slava Pestov entworfen und seit 2003 entwickelt wird. Sie übernimmt Konzepte aus Forth, Lisp und Smalltalk-80. Sie ist als praxisorientierter Nachfolger von Joy gedacht und eine Implementierung ist unter BSD-Lizenz erhältlich.

## Words und Stack

Alle Funktionen lesen ihre Argumente vom Stack, schreiben ihre Ergebnisse auf den Stack und werden als words bezeichnet. Ein Programm ist eine Abfolge von Lexikalen für Objekte, die auf den Stack abgelegt werden und words, die auf den Stack angewendet werden.
Zuerst werden 2 und 3 auf den Stack abgelegt. + nimmt zwei Zahlen vom Stack und legt die Summe der beiden auf dem Stack ab. . nimmt das oberste Objekt vom Stack und gibt es aus. Kommentare beginnen mit ! und gehen bis zum Ende der Zeile.
Neue words werden mit : definiert. add2 addiert 2 zur obersten Zahl auf dem Stack.
Words werden in vocabularies zusammengefasst. Mit USE: wird angegeben, in welchem vocabulary words gesucht werden sollen und mit IN: in welchem vocabulary alle folgend definierten words gespeichert werden.
Es können beliebige Objekte wie Zahlen, Sequences (Arrays, Vectors, Strings, …) usw. auf dem Stack abgelegt werden. Für alle Objektarten ist eine lexikalische Darstellung definiert.
Namen für Variablen werden mit SYMBOL: definiert, mit set gesetzt und mit get ausgelesen und auf den Stack abgelegt. Speicher für die Objekte wird automatisch alloziert und durch die Garbage Collection wieder freigegeben.

## Funktionales Programmieren

Anonyme Funktionen werden in eckigen Klammern geschrieben und als quotations bezeichnet.
map nimmt ein Array und eine quotation vom Stack. Die quotation wird auf jedes Element des Arrays angewendet und die Ergebnisse wieder in einem Array auf dem Stack abgelegt. times nimmt eine Zahl n und eine quotation vom Stack. Die quotation wird dann n-mal hintereinander ausgeführt. bi nimmt ein Objekt und zwei quotations vom Stack. Beide quotations werden auf das Objekt angewendet und die beiden Ergebnisse auf dem Stack abgelegt. if nimmt einen Wahrheitswert und zwei quotations vom Stack. Ist der Wert true wird die erste quotation ausgeführt, ansonsten die zweite quotation.

## Objektorientierung

Bei der Objektorientierung übernimmt Factor Konzepte aus Common Lisp Object System. Klassen und Methoden werden unabhängig voneinander definiert.
Zur Datenkapselung wird eine Tuple-Klasse mit dem Namen rectangle und den beiden Slots width und height definiert. Das darauf folgend definierte construction-word <rectangle> liest zwei Zahlen vom Stack und belegt die beiden Slots damit. Die für rectangle definierte Methode area nimmt ein rectangle-Objekt vom Stack und berechnet die Fläche. Liegt ein Tuple-Objekt auf dem Stack, können mit slot>> die Daten ausgelesen und mit >>slot die Daten in den Slot des Objekts geschrieben werden.

## Library

In Factor ist eine umfassende Bibliothek mit vordefinierten Funktionen enthalten. Für Erweiterungen existiert eine Schnittstelle zu C-Bibliotheken.

## Listener

Der Listener ist die interaktive Entwicklungsumgebung von Factor. Alles was man eingibt wird eingelesen, kompiliert und gegebenenfalls gleich ausgeführt. Mit Steuerung-h gelangt man zu einer umfassenden Hilfe und mit Steuerung-w kann man jede Zeile im Single-Step-Verfahren schrittweise durchlaufen. Alle zurzeit im Speicher befindlichen Definitionen und der kompilierte Code werden mit save in einer Image-Datei gespeichert.

## Implementierung

Die VM von Factor ist in C++ geschrieben. Der größte Teil von Factor, wie der Parser und der Compiler, sind selbst in Factor geschrieben. Es existieren Implementierungen für FreeBSD, Linux, macOS und Windows sowie die Prozessoren x86, x86-64 und PowerPC. Am Anfang des Projektes war die VM in Java geschrieben. Diese wurde aufgrund technischer Unterlegenheit zunächst durch eine Implementierung in C ersetzt.

## Self-Hosting

Da Factor hauptsächlich selbst in Factor geschrieben ist, muss zuerst das Basissystem mit einem Boot-Image erstellt werden. Ein passendes Boot-Image findet man auf der Homepage von Factor.
Das dabei erstellte factor.image ist vom System abhängig und enthält das bei jedem Start geladene Basissystem von Factor.