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
nullMaestas, 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
xmlnsthat 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 returnsfto indicate parent should be focused - peg: change to compile-time
PEG:andPARTIAL-PEG:forms, not delay to first invocation - system: renamed
macosxtomacos - math.trig: moved
deg>radandrad>degto math.functions vocabulary - math.functions: fix
divisor?to support mixed numbers (floats and integers) - math.functions.integer-logs: moved
integer-log10andinteger-log2to math.functions vocabulary - ranges: fixed exclusive range to be more correct for non-integer types
- http.client: moved some download words to
http.downloadvocabulary - rosetta-code: moved solutions to the factor-rosetta-code git repository
- json:
read-jsonreturns a single object, useread-jsonsto read multiple - base32: now contains all of the words from the
base32-crockfordandbase32hexvocabularies
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
downloadwords - 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-ptrandread-c-ptr - assocs: merged some useful words from
assocs.extras, removedwith-assoc - assocs.extras: demoted
set-offromassocs - 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-colorto select white/black text on dark/light backgrounds - combinators.extras: adding
sequence-case, fix3tri* - command-line: adding
command-line-optionsfor easy options parsing - contributors: added
contributors.and make the changelog respect.mailmapfile - 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-directiveEBNF word - game-of-life: small performance improvements
- geo-ip: fix database download link
- github: implement more of the GitHub REST API
- globs: added
rglobfor 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-fileto properly replace existing files - io.files: added
if-file-existscombinators and(file-writer-secure) - io.files.temp.macosx: allow
default-cache-directoryto work in MacPorts environment - io.files.unique: added
safe-replace-fileandsafe-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-escapesandformat-ansi-tables - json: renamed
read-jsontoread-jsons, addedread-jsonthat reads a single object - ldcache: fix to work on platforms that don’t have
/etc/ld.so.cache(such as NixOS) - libc: added some
setlocalesupport - 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-bitstuple - math.combinatorics: fix
<k-permutations>for k=0 - math.distances: added
squared-euclidian-distanceandnormalized-squared-euclidian-distance, aliases fortaxicab-distanceandchessboard-distance - math.extras: added
weighted-randoms-as - math.functions: moved math.trig words in (
deg>radandrad>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
>digitsanddigits> - mirrors: changed to display all assocs like hashtables, all sets like hash-sets.
- modern.html: added some XML traversal works
- msgpack: added
?read-msgpackandread-msgpacks - oauth2: simplify using the
json.httpvocabulary - 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-texturescaling - peg.ebnf: reset ebnf words properly
- pong: fix issue when pressing
Nfor 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-floatdistributions to*-random, add*-distributiontypes, added more of them, defined abase-randomthat allows a betternot-a-random-generatorerror 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+incrementtoconsume, and changenextto return the next element - sequences.product: making
product-each,product-map, andproduct-findsignificantly 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
macosxtomacos - 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
DISPLAYos-var for graphical capability - ui.backend.windows: support horizontal mouse wheel, detect light/dark theme on startup
- ui.backend.x11: check for non-empty
DISPLAYos-var for graphical capability - ui.commands: adding
update-command-map - ui.gadgets: fix
f focusable-childbusy loop - ui.tools.listener.history: saving and restoring UI listener history to a
~/.factor-historyfile - units.imperial: add area units, change “fingerbreadth” unit
- units.si: adding
km^2and 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-wordpredicate,undefined-worderror class - xmode.catalog: adding
qdocandsparqlmodes - zeromq: change
zmq-errorto 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.