📖Factor: an extensible interactive language
- authors
- Pestov, Slava
- year
- 2008
- url
- https://youtu.be/f_0QlhYlS8g
- Factor is functional, but not purely functional (functions are first-class). Object-oriented (dynamic dispatch).
- Factor has development environment
- allows stepping through words execution
- Factor allows objects on stack (is it GC? yes)
{ }
pushes array of data (as a single stack item)[ ]
pushes code into stack (quotation)- combinators operate on quotations (on code)
if
takes then/else branch from the stack10 dup 0 < [ 1 - ] [ 1 + ] if .
times
(counted looping)10 [ "Hello" print ] times
- support typing (but not shown in this talk)
- Factor decouples methods from data (Common Lisp Object System, Clojure multi-methods?)
Create class (data)
TUPLE: rectangle width height ; TUPLE: circle radius ; rectangle new ( initialized with f ) 100 200 rectangle boa ( width 100, height 200 ) ( "Build? Order of Arguments") 300 >>width ( update width ) GENERIC: area ( shape -- n) M: rectangle area [ width>> ] [ height>> ] bi * ; M: circle area radius>> sq pi * ; : <circle> ( r -- c ) circle boa ; ( constructor ) 10 <circle> rectangle? ( check if it's an instance of rectangle ) ( mixins ) MIXIN: shape INSTANCE: rectangle shape INSTANCE: circle shape 13 <circle> shape? M: shape tell-me "My area is " write area . ;
- Compiler checks stack usage. If anything is wrong, you get a compile error.
- no separation between int/float stacks
- have distinct boolean type (t/f)
- integer, array are built-in classes
- object system is implemented in Factor
- generic, classes, slots
- purely-functional collections
- (does it support fractions? 10+6/13)
- strings are 21-bit unicode code points (optimized as ASCII if possible)
- different encodings. binary is supported
::
lambdas. not anonymous function. looks rather like it takes arguments ({ }
in Forth/gforth): +- [ + ] [ - ] 2bi ; inline :: discriminant ( a b c -- d ) b sq 4 a c * * - sqrt ; :: quadratic ( a b c -- x y ) [let | d [ a b c discriminant ] | b neg d +- [ 2 a * / ] bi@ ] ;
[let
creates lexical closuresExample memoization (
MEMO:
is a parsing word defined as a library):MEMO: fib ( m -- n) dup 1> [ [ 1 - fib ] [ 2 - fib ] bi + ] when ;
EBNF:
a parsing words for grammars- has full-featured web framework
- compiler
- optimizing compiler
- runtime VM written in C
- generational GC
- multiple passes of optimizations, dead code elimination, inlining, etc.
- uses SSA (single static assignment)
- all the project infrastructure (main website, etc) are written in Factor
Backlinks
- 📝 Factor