Factor 0.100 now available
Wednesday, September 11, 2024
“Life can only be understood backwards; but it must be lived forwards.” — Kierkegaard
I’m very pleased to announce the release of Factor 0.100!
OS/CPU | Windows | Mac OS | Linux |
---|---|---|---|
x86 | 0.100 | 0.100 | |
x86-64 | 0.100 | 0.100 | 0.100 |
Source code: 0.100
This release is brought to you with over 1400 commits by the following individuals:
Aditya Aryaman Das, Alex
null
Maestas, Alexander Ilin, Andy Kluger, Bhargav Shirin Nalamati, Charlie Weismann, Dave Carlton, David Enders, Doug Coleman, Evgenii Petrov, Giftpflanze, Ikko Eltociear Ashimine, J. Ryan Stinnett, Jean-Marc Lugrin, John Benediktsson, Keldan Chapman, Limnanthes Serafini, Marc Michael, Michael Raitzam, Michael Thies, Pragya Pant, Raghu Ranganathan, Rebecca Kelly, Rudi Grinberg, Sandesh Pyakurel, Sebastian Strobl, Shruti Sen, Surav Shrestha, Val Packett, @Capital-EX, @Smoothieewastaken, @TheWitheredStriker, @TryAngle, @chunes3, @inivekin, @nomennescio, @olus2000.
Besides some bug fixes and library improvements, I want to highlight the following changes:
- Upgraded to Unicode 15.1
- Fix some
xmlns
that were accidentally changed tohttps
- Improved the printing of shortest decimal representation of floating-point numbers
- Some early support for ARM64 in the non-optimizing compiler, more to do for full support
- Automatic light/dark theme detection works on Microsoft Windows
- Support for compressed images, useful when reducing file size is important
Some possible backwards compatibility issues:
- ui:
focusable-child*
now returnsf
to indicate parent should be focused - peg: change to compile-time
PEG:
andPARTIAL-PEG:
forms, not delay to first invocation - system: renamed
macosx
tomacos
- math.trig: moved
deg>rad
andrad>deg
to math.functions vocabulary - math.functions: fix
divisor?
to support mixed numbers (floats and integers) - math.functions.integer-logs: moved
integer-log10
andinteger-log2
to math.functions vocabulary - ranges: fixed exclusive range to be more correct for non-integer types
- http.client: moved some download words to
http.download
vocabulary - rosetta-code: moved solutions to the factor-rosetta-code git repository
- json:
read-json
returns a single object, useread-jsons
to read multiple - base32: now contains all of the words from the
base32-crockford
andbase32hex
vocabularies
I would also like to bring particular recognition to Raghu Ranganathan, also known as @razetime, who was an incredible developer with an incredibly good attitude and contributing member to many technical communities including code golfing and various programming languages including Factor. We are very sad that he passed away a couple of months ago and would like to have this moment dedicated in his memory.
What is Factor
Factor is a concatenative, stack-based programming language with high-level features including dynamic types, extensible syntax, macros, and garbage collection. On a practical side, Factor has a full-featured library, supports many different platforms, and has been extensively documented.
The implementation is fully compiled for performance, while still supporting interactive development. Factor applications are portable between all common platforms. Factor can deploy stand-alone applications on all platforms. Full source code for the Factor project is available under a BSD license.
New libraries:
- base45: adding support for Base45 Data Encoding (RFC 9285)
- bend: features from the Bend programming language
- checksums.khash: implementation of k-hash
- command-line.parser: experimental command-line argument parser
- containers: experimental high-level container words across sequences, sets, dlists, and assocs.
- drunken-bishop: implements OpenSSH Drunken Bishop algorithm
- editors.chime: support Chime editor
- editors.focus: support Focus Editor
- editors.notepadnext: support NotepadNext editor
- gilded-rose: adds the Gilded Rose Refactoring Kata
- golden-section: recovers an old UI demo that uses processing for rendering
- hex-strings: words for changing bytes to hex strings and back
- http.download: collection of various
download
words - io.streams.tee: adding a “tee’ing” stream utility
- images.viewer.scaling: adding a “scaling image” gadget
- kaggle: wrapper for the Kaggle API
- lazy: renamed from
promises
- leb128: implements LEB128 or Little Endian Base 128 encoding
- math.statistics.running: implement “running statistics” and “running regression” tuples
- math.vectors.ranges: more efficient vector operations on range objects
- models.combinators: some extensions to models
- models.combinators.templates: a functor for generating model objects
- persistency: simple wrapper for db.tuples, possibly a little redundant
- project-euler.061: solution for Cyclical Figurate Numbers
- project-euler.098: solution for Anagramic Squares
- quoted-printable.rfc2047: implementation of RFC2047 strings
- random.xorshift: simple Xorshift random number generator
- recipes: recovers an old UI demo of a recipe browser
- scryfall: extensive library for working with MtG cards on Scryfall
- sequences.prefixed: virtual “prefixed” sequence
- sequences.suffixed: virtual “suffixed” sequence
- stomp: client library for the STOMP protocol
- stomp.cli: command-line interface for STOMP
- sudokus: a graphical Sudoku game and solver
- tools.image: common code for working with Factor image files
- tools.image.analyzer: renamed
tools.image-analyzer
- tools.image.compressor: working with compressed Factor image files
- tools.image.uncompressor: working with compressed Factor image files
- ui.gadgets.alert: UI elements to prompt user and popup alerts
- ui.gadgets.cartesian: three-axis coordinate system
- ui.gadgets.comboboxes: UI elements for a combo box
- ui.gadgets.controls: recovers some old UI support code
- ui.gadgets.layout: recovers some old UI support code
- ui.gadgets.slate: recovers some old UI support code
- msgpack.rpc: implementation of MsgPack-RPC
Improved libraries:
- alien.c-types: added
ssize_t
- alien.data: adding
stream-read-c-ptr
andread-c-ptr
- assocs: merged some useful words from
assocs.extras
, removedwith-assoc
- assocs.extras: demoted
set-of
fromassocs
- base85: added Ascii85, Adobe85, and Z85 variants
- calendar: added
sunrise
,sunset
, andsolar-noon
- classes.algebra: fix
class<=
foranonymous-predicate
- cocoa.statusbar: some cleanup, additional words
- codebase-analyzer: handle owner and version files, print clickable links
- colors.contrast: adding
contrast-text-color
to select white/black text on dark/light backgrounds - combinators.extras: adding
sequence-case
, fix3tri*
- command-line: adding
command-line-options
for easy options parsing - contributors: added
contributors.
and make the changelog respect.mailmap
file - crontab: adding support for “~” randomization
- curses: added
nodelay
- db.tuples: adding
LIKE" column"
syntax - debugger: fixed error description for
bad-escape
- discord: some improvements to the Discord bot library
- dns: adding some more DNS types
- formatting: split out a
format-directive
EBNF word - game-of-life: small performance improvements
- geo-ip: fix database download link
- github: implement more of the GitHub REST API
- globs: added
rglob
for recursive glob - gpu.shaders: change two tuples used in errors to be error classes
- html.templates.chloe: improve
<t:meta>
tag to be able to specific any meta attributes - http.server.responses: adding all the real and joke response codes
- http2.hpack.huffman: simplify implementation using
nths
- interpolate: adding
I"
interpolated string syntax, allow format directives to be used - inverse: adding
under
- io.directories: added
?move-file
- io.directories.windows: fixed
move-file
to properly replace existing files - io.files: added
if-file-exists
combinators and(file-writer-secure)
- io.files.temp.macosx: allow
default-cache-directory
to work in MacPorts environment - io.files.unique: added
safe-replace-file
andsafe-modify-file
- io.pipes: added
<connected-pair>
- io.streams.256color: formatting ANSI string tables properly
- io.streams.ansi: formatting ANSI string tables properly
- io.streams.escape-codes: added
strip-ansi-escapes
andformat-ansi-tables
- json: renamed
read-json
toread-jsons
, addedread-json
that reads a single object - ldcache: fix to work on platforms that don’t have
/etc/ld.so.cache
(such as NixOS) - libc: added some
setlocale
support - libclang: working on header parsing to factor source
- machine-learning.functions: added
gelu
,stable-softmax
, andstable-log-softmax
- mason.release.archive: build tar file without xattrs
- math.bits: adding a
binary-bits
tuple - math.combinatorics: fix
<k-permutations>
for k=0 - math.distances: added
squared-euclidian-distance
andnormalized-squared-euclidian-distance
, aliases fortaxicab-distance
andchessboard-distance
- math.extras: added
weighted-randoms-as
- math.functions: moved math.trig words in (
deg>rad
andrad>deg
), math.functions.integer-logs, andinteger-sqrt
, addedfma
(fused-multiply-add) - math.matrices: fixed stack effect for
<matrix-by>
- math.parser: implement Dragonbox algorithm, added
>digits
anddigits>
- mirrors: changed to display all assocs like hashtables, all sets like hash-sets.
- modern.html: added some XML traversal works
- msgpack: added
?read-msgpack
andread-msgpacks
- oauth2: simplify using the
json.http
vocabulary - openai: adding
<cheapest-chat-completion>
for ease-of-use with “gpt-4o-mini”, add timestamps to the list-models api - opengl: adding OpenGL 4+ extensions and demos, better support for
multi-texture
scaling - peg.ebnf: reset ebnf words properly
- pong: fix issue when pressing
N
for new game a lot - prettyprint.config: adding
qualified-names?
to allow word names to be prettyprinted as fully-qualified - quotations: added
compose-all
- random: rename
random-bits*
torandom-bits-exact
, rename the*-random-float
distributions to*-random
, add*-distribution
types, added more of them, defined abase-random
that allows a betternot-a-random-generator
error to be produced in some cases - random.c: fixed to guarantee
rand()
is used to generate full range of 32-bit numbers - ranges: support some set operations more efficiently
- raylib: added extensive documentation
- reddit: fix
domain-stats
- sequences.extras: adding
count=
, fasterlongest-subseq
- sequences.generalizations: adding
lastn
,?lastn
,set-lastn
- sequences.parser: rename
get+increment
toconsume
, and changenext
to return the next element - sequences.product: making
product-each
,product-map
, andproduct-find
significantly faster - serialize: added
deep-clone
- shuffle: added
dupdd
- splitting: break on more line separators
\r\n\v\f\x1c\x1d\x1e\x85\u002028\u002029
- system: renamed
macosx
tomacos
- syntax: adding
VOCAB:
syntax - toml: fix issue with sub-tables being defined first
- tools.completion: added completion for
VOCAB:
syntax - tools.disassembler.capstone: support Capstone 4 and Capstone 5
- ui: adding
close-all-windows
- ui.backend.gtk2: check for non-empty
DISPLAY
os-var for graphical capability - ui.backend.windows: support horizontal mouse wheel, detect light/dark theme on startup
- ui.backend.x11: check for non-empty
DISPLAY
os-var for graphical capability - ui.commands: adding
update-command-map
- ui.gadgets: fix
f focusable-child
busy loop - ui.tools.listener.history: saving and restoring UI listener history to a
~/.factor-history
file - units.imperial: add area units, change “fingerbreadth” unit
- units.si: adding
km^2
and more aliases - vocabs.loader: make
vocab-exists?
no longer throwbad-vocab-name
- vocabs.refresh.monitor: fix warnings for non-vocab-like files
- xml: fix xml namespace
- webapps.mason: improve build farm dashboard
- websites.concatenative: allow use of
<t:meta>
in child templates - words: adding
uninterned-word
predicate,undefined-word
error class - xmode.catalog: adding
qdoc
andsparql
modes - zeromq: change
zmq-error
to be an error class - zoneinfo: updated to tzdata version
2024b
VM Improvements:
- Improved ARM64 bootstrap assembly to allow small forms to execute successfully and natively in the non-optimizing compiler. This continues to be a work-in-progress to fully support ARM64.
- Tentative support for compressed images, allowing Factor images to be as much as 8x smaller in size with run-time uncompression overhead.
- Improved console I/O on windows to work in environments such as cygwin and GitHub Actions.