Factor 0.99 now available
Thursday, August 24, 2023
“I hear and I forget. I see and I remember. I do and I understand.” - Confucius
I’m very pleased to announce the release of Factor 0.99!
OS/CPU | Windows | Mac OS | Linux |
---|---|---|---|
x86 | 0.99 | 0.99 | |
x86-64 | 0.99 | 0.99 | 0.99 |
Source code: 0.99
This release is brought to you with over 4,100 commits by the following individuals:
Abtin Molavi, Ales Huzik, Alex
null
Maestas, Alexander Ilin, Alexandre Rousseau, Aleksander Sabak, Arnaut Daniel, Ashish Kurmi, Benjamin Pollack, Cat Stevens, Cecilia Knäbchen, Chris Double, Craig Allen, Dave Carlton, David Flores, David Mindlin, Doug Coleman, Dusk Banks, Fred Alger, Giftpflanze, Ikko Ashimine, Jack Lucas, John Benediktsson, Jon Harper, Justin Hill, KUSUMOTO Norio, Keldan Chapman, Kevin Cope, Konrad Hinsen, Kye Shi, Mark Sweeney, Mohamed Akram, Nandeeka Nayak, Niklas Larsson, Raghu Ranganathan, Rudi Grinberg, Samuel Tardieu, Sebastian Strobl, Sergii Fesenko, Silvio Mayolo, Steve Ayerhart, Zoltán Kéri, @Capital-EX, @inivekin, @mariari, @nicolas-p, @nomennescio, @timor
Besides some bug fixes and library improvements, I want to highlight the following changes:
- Added a Guided Tour of Factor
- Upgraded to Unicode 15
- The
fixups
vocabulary makes upgrading easier when words are renamed - Windows binaries now include OpenSSL 3.1.2 and SQLite 3.42.0 for convenience
- Re-added some support for FreeBSD
- Improved non-English text entry on macOS
- Removed support for 32-bit macOS
- File editors are now specified using
EDITOR:
syntax - Switched to newer
ucrtbase.dll
on Windows - Support disassembly using Capstone in addition to Udis86
- String literals must be separated by whitespace –
"hello"length
and"foo""bar"append
are no longer accepted by the parser - The
fry
andlocals
syntax words are now insyntax
for use in all vocabularies - Any word can be referred to by it’s fully-qualified name (e.g.,
math:+
orxml.writer:pprint-xml
) - The Emacs “FUEL” and VIM plugins have been updated
Some possible backwards compatibility issues:
- Moved
colors.constants
andcolors.hex
tocolors
vocabulary - Merged
io.binary.fast
intoio.binary
- Merged
io.directories.{hierarchy,search}
intoio.directories
- Merged
io.encodings.utf16n
intoio.encodings.utf16
- Renamed
math.ranges
toranges
- Renamed
ranges
words from[a,b]
to[a..b]
- Changed
FUNCTION:
syntax to not require a semi-colon at the end - Renamed
exists?
tofile-exists?
- Renamed vector dot product from
v.
tovdot
- Renamed
short
toindex-or-length
- Renamed various sorting words to be more simple
- Improved icons and other UI images on retina displays
- URL query strings only split on ampersand (
?a=b&c=d
) not semi-colon (?a=b;c=d
) - Renamed some words in
interval-sets
to prefixinterval-
… - Renamed
contents
toread-contents
- Renamed
lines
toread-lines
- Renamed
selections
toall-selections
- Renamed
intersection
tointersect-all
- Merged
json.reader
andjson.writer
intojson
vocabulary - Merged
bson.reader
andbson.writer
intobson
vocabulary - Moved
talks
to separate factor-talks repository - Renamed
ui.backend.gtk
toui.backend.gtk2
to prepare for newer GTK support
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:
- L-system: brought back from unmaintained
- aws: support for the Amazon Web Services API
- bare: support for Binary Application Record Encoding format
- base16: implements “Base 16 encoding” from RFC 4648
- base24: implements Base 24 encoding
- base32: implements “Base 32 encoding” from RFC 4648
- base32-crockford: implements Douglas’ Crockford’s Base 32 encoding
- base32hex: implements “Base 32 Encoding with Extended Hex Alphabet” from RFC 4648
- base36: implements Base 36 Encoding
- base58: implements Base 58 encoding
- base62: implements Base 62 encoding
- base91: implements Base 91 encoding
- bech32: implements Bech32 encoding
- binhex: support BinHex encoding scheme used on classic Mac OS
- bittorrent: beginning to support the BitTorrent protocol
- brain-flak: implementation of brain-flak esoteric language
- broadcast-server: network discovery udp broadcast client/server
- build-from-source: allow building dependent libraries from their source
- calendar.ranges: support for calendar ranges
- cbor: implement Concise Binary Object Representation format
- certs: for working with OpenSSL certificates
- chrome-tools: for copying curl/fetch commands from Chrome DevTools
- checksums.wyhash: implement wyhash hash function
- cocoa.statusbar: support for system-wide menu bars on macOS
- codebase-analyzer: tools for generating codebase statistics
- colors.contrast: implement WCAG color contrast criteria
- colors.hwb: support the HWB color model
- color-picker-game: demo game where the user tries to match a color with sliders
- command-loop: generic line-oriented command interpreters
- compression.bzip3: support BZip3, the “better and stronger spiritual successor to BZip2”
- compression.gzip: implementation of gzip algorithms
- compression.zstd: support Zstandard
- countries: various country codes and abbrevations
- cpu.arm: assembler backend for ARM 32-bit and 64-bit
- crypto.jwt: encode/decode of JSON Web Tokens
- csexp: reading/writing from Canonical S-expressionss
- db.mysql: prototype of a MySQL database backend
- did-you-mean: prototype of a “did you mean?” restarts when tokens aren’t found
- discord: implement the Discord API
- discord.chatgpt-bot: a ChatGPT bot for Discord
- editors.10x: support 10x Editor
- editors.acme: support Acme text editor
- editors.aquamacs: support Aquamacs
- editors.bluefish: support Bluefish editor
- editors.cudatext: support CudaText code editor
- editors.espresso: support Espresso web editor
- editors.kakoune: support Kakoune code editor
- editors.kate: support Kate text editor
- editors.lapce: support Lapce text editor
- editors.lite-xl: support Lite XL editor
- editors.nova: support Nova code editor
- editors.pulsar: support Pulsar text editor
- editors.smultron: support Smultron text editor
- editors.subethaedit: support SubEthaEdit
- editors.visual-studio-code-exploration: support Visual Studio Code Exploration builds
- editors.visual-studio-code-insiders: support Visual Studio Code Insiders
- editors.visual-studio-codium: support VSCodium
- editors.zed: support Zed text editor
- elevate: cross-platform privilege escalation
- escape-strings.ui: demo user interface for escape-strings vocabulary
- fixups: help provide restarts for word renamings
- format-using: experimental tool for formatting
USING:
blocks differently - gamelib: generic game library with some fluent demos including sokoban and tic-tac-toe
- gemini: support for Project Gemini
- gemini.cli: Project Gemini command-line interface
- gemini.server: Project Gemini file server
- gemini.ui: Project Gemini user interface
- generators: prototype of generator routines
- geohash: implement Geohash geocode system
- gir: parser for GIR files
- github: wrapper for the GitHub API
- glfw: wrapper for GLFW library
- gravatar: support Gravatar API
- help.tour: added a Guided Tour of Factor
- hetzner: wrapper for the Hetzner Cloud API
- hipku: implement the Hipku algorithm
- html5: beginning of HTML5 parser
- http.websockets: support for HTTP WebSockets
- http2: beginning of HTTP/2 implementation
- images.jpeg: brought back from unmaintained
- images.processing: brought back from unmaintained
- io.streams.counting: implementation of stream protocol that counts read/write of elements
- io.streams.escape-codes: support for
faint
,underline
, andblink
styles - iso-codes: support for getting Debian ISO files
- itunes: implements iTunes API
- json.http: utilities for working with JSON web services
- libclang: wrapper for libclang
- linux.input-events: support for
/dev/input/event*
devices for reading mouse and keyboard events - lint.vocabs: a vocabulary lint tool for detecting unused imports, etc
- lists.circular: wrapper to allow circular objects to be used in lists
- logic: implementation of logic programming techniques
- long-urls: expand short URLs to their long versions
- markov-chains: support for Markov chains
- math.matrices.extras:
- math.primes.brute-force: original “brute force” primality factoring
- math.primes.pollard-rho-brent: faster Pollard-Rho-Brent primality factoring
- math.runge-kutta: support for Runge-Kutta methods
- mediawiki.api: support for the MediaWiki API
- modern.html: prototype html parser
- multisets: beginning to support multisets
- notifications: support cross-platform notification APIs
- npm: support for working with the npm package manager
- openai: implement the OpenAI API
- papier: demo sprite-based game
- periodic-table: demo periodic table UI gadget
- pcre2: bindings to libpcre2
- proquint: implements Proquint encoding
- process-autopsy: rename from
ci.run-process
- punycode: support for international domain names
- quiz: flashcard-style quiz game
- random.passwords: random password generator
- random.pcg: support for PCG random number generators
- random.xoshiro: support for xoroshiro random number generators
- raygui: support for raygui user interface library
- raylib: support for raylib game programming library
- reservoir-sampling: implements reservoir sampling algorithm
- retries: vocab for trying code blocks multiple times
- rocksdb: support for RocksDB key-value store
- rosetta-code.multisplit: solution for Multisplit
- ryu: implementation of Ryū: fast float-to-string conversion
- semver: support for Semantic Versioning
- sequences.padded: virtual “padded” sequences
- solr: beginnings of Apache Solr support
- sorting.specification: rename from
sorting.slots
- stack-as-data: combinators for manipulating the data stack
- string-server: server for stress testing large network payloads
- syslog: client for the Syslog Protocol
- syntax.terse: prototype some terse syntax words
- tensors: prototype of typed-array programming library
- tftp: support for the Trivial File Transfer Protocol
- tinyvg: support for the TinyVG binary encoded vector graphics format
- tldr: implementation of the tldr pages
- tokencase: convert between various string tokenization methods
- toml: readers and writers for Tom’s Obvious Markup Language
- tools.disassembler.capstone: backend for Capstone disassembler
- totp: support Time-based one-time passwords
- ui.backend.cocoa.input-methods: support for typing letters in non-English languages
- ui.gadgets.flex-borders: a border gadget that doesn’t dictate the size of the contained gadget
- ui.theme.base16: support all base16 themes
- ui.theme.wombat: support the “wombat” theme
- ui.tools.button-list: a gadget with a list of active buttons
- ui.tools.listener.log: helper words to log to a UI listener
- ui.windows.drop-target: support dropping files on Windows
- ulid: Universally Unique Lexicographically Sortable Identifier
- unicode.control-pictures: convert ASCII control characters to their Unicode picture equivalents
- unicode.flags: conversion to-and-from unicode flag emojis
- unix.scheduler: some words from
sched.h
- unix.sysctl: support for
sysctl
primitives - unix.xattrs: support for extended file attributes
- verbal-expressions: more readable regular expressions
- vin: parsing VIN numbers
- visionect: support for Visionect
- vulkan: support for Vulkan library
- wasm: beginning to support WASM opcodes
- windows.drive-strings: support for
GetLogicalDriveStrings
- windows.hardware: support for enumerating display monitors
- windows.powrprof: support for power management policies
- windows.processes: support for snapshot APIs
- windows.shcore: support for per-monitor DPI scaling
- windows.version: support for file version info
- wipe: utility to overwrite a file with random data
- wipe.ui: windows user interface for wipe
- wordlet: implements a game similar to wordle
- yenc: support yEnc binary-to-text encoding format
- zealot.help-lint: adding help-lint to the zealot nightly builder
- zim: support for zim files
- zim.builder: support to build zim files
- zim.server: serve existing zim files from a web server
- zim.tools: command-line tools for working with zim files
- zoneinfo.update: make updating the zoneinfo files easier
Improved Libraries:
- alien.c-types: defined
u8
,u16
,u32
,u64
,s8
,s16
,s32
,s64
,f32
,f64
,isize
,usize
types - alien.libraries.finder.linux: more robust implementation using
ld
- alien.libraries.finder.windows: more robust implementation using
GetModuleFileName
- assocs: adding
zip-with
,collect-by
,?value-at
,?change-at
- assocs.extras: more words and tests
- base64: performance improvements and added urlsafe versions
- base85: performance improvements
- boolean-expr: add some more expression simplification rules
- bootstrap.image: add a
MAIN:
for-run=bootstrap.image [platform...]
- bootstrap.image.upload: more robust, use IPV4, use scp.exe on windows
- bson: unify reader/writer vocabulary
- cache: possibly workaround a UI issue using
assoc-filter
instead ofassoc-filter!
- calendar: improve docs, add words, improve consistency in cloning/modifying timestamps
- calendar.holidays.us: support more holidays
- classes.struct: improved
new
andboa
on struct classes - classes.union: faster predicate checks
- colors: merged in colors.constant and colors.hex
- color-picker: support picking more colors
- combinators.extras: more words and tests
- combinators.smart: adding
smart-loop
- command-line: run scripts and eval with auto-use on, allow non-empty data stack
- compiler.cfg.builder.alien.boxing: improved System V AMD64 API compliance
- compression.huffman: support for Huffman codes
- compression.inflate: adding gzip-inflate
- contributors: additional Factor developers
- core-foundation.fsevents: adding
kFSEventStream
flags - core-text: improve retina text layout
- core-text.fonts: switch default monospace font from “Monaco” to “Menlo”
- crontab: fix some leap day issues and non-standard day-of-week fractions
- db.postgresql: improve unit testing when sharing a single database instance
- db.tuples: adding
reject-tuples
- debugger: integrate fixups
- decimals: better
DECIMAL:
prettyprinting - delegate: learned how to consult on
HOOK:
generics - documents.elements: adding paragraph-elt for paragraph level cursor movement
- editors: allow loading all editors after selecting the one you want to use, add
EDITOR:
syntax - editors.ultraedit: support macOS version
- endian: merge io.binary.fast versions
- escape-strings: support a lot of wild string escaping techniques
- eval: adding
eval-with-stack
words - farkup: only
nofollow
absolute urls - functors: fix to use
with-words
for more robust parsing - furnace.actions: support
PUT
andPATCH
methods - furnace.recaptcha: update to reCAPTCHA2
- game.input.gtk: support mouse and keyboard events on linux
- gdbm: prefix words with
gdbm-
… - git: more features for working with git and GitHub repositories
- gopher.server: adding
MAIN:
- gopher.ui: adding
MAIN:
- grouping.extras: more words and tests
- hacker-news: more pages and better color support
- hashcash: improved Hashcash cryptographic proof-of-work system
- heaps: fix for
heap-delete
bug - help.html: support dark mode, some aesthetic improvements, qualified searching
- help.syntax: adding easy help syntax
- html.templates.chloe: adding
<script>
and<meta>
tag templates - http.client: support
PATCH
requests - http.parsers: support more characters in cookie keys
- images.loader.cocoa: support more image types on macOS 11+
- images.loader.gdiplus: support RGBA pixel format
- init: add
STARTUP-HOOK:
syntax - inverse: fix swapped inverse of
+
and/
- io.crlf: adding
stream-read-crlf
, someignoring-crlf
words, and acrlf-stream
- io.directories: merge in words from io.directories.search and io.directories.hierarchy
- io.files.info: support mount points
- io.monitors.macosx: support add/remove/rename file system events
- io.pathnames: adding
canonicalize-path
,canonicalize-path-full
,>windows-path
- io.sockets.secure.openssl:
- io.streams.ansi: faster by caching styles, support blink
- io.streams.byte-array.fast: faster when writing a
byte-array
- io.streams.256color: faster by caching styles, support blink
- io.styles: fix nested streams
- ip-parser: adding
ipv6-ntoa
andipv6-aton
- json: unify reader/writer vocabulary
- listener: adding
-q
quiet startup - lists: adding list literals
L{
,2leach
,lreduce
,2lreduce
- lru-cache: adding
fifo-cache
,lifo-cache
- machine-learning.data-sets: adding mnist data
- mason: improvements for nightly builders, code signing, notarization
- math: adding
until-zero
- math.bitwise: adding
d>w/w
,w>h/h
,h>b/b
- math.combinatorics: adding
unique-permutations
,combination-with-replacement
,selection
combinators - math.extras: more words and docs
- math.floats.half: improve roundtrip of subnormal float16
- math.functions: adding
e^-1
,logit
,lgamma
- math.intervals: cleanup and bug fixes
- math.matrices: cleanup and interface improvements
- math.parser: support underscore number separators, e.g.
1_000_000
- math.primes.factors: switch to pollard-rho-brent-factors
- math.statistics: new words:
dcg
,ndcg
,quartiles
,sum-of-squares
,sum-of-cubes
,sum-of-quads
,spearman-corr
,rank-by-avg
,rank-by-min
,rank-by-max
- math.text.english: support larger numbers, AP style
- math.vectors: adding
l1-norm
,cross
,normal
,proj
,perp
,angle-between
- maze: support mouse clicks
- metar: improvements to wind and visibility parsing, adding
MAIN:
- mime.multipart: improve error when decoding runs out of bytes
- modern: improved experimental lexer
- multiline: remove
HEREDOC:
, adding lua-style strings[=[
- numbers-game: simplify for readability
- peg: improve compile performance
- peg.ebnf: adding
EBNF-PARSER:
,PARTIAL-EBNF:
syntax - peg.javascript: support more javascript features
- peg.parsers: make
range-pattern
more efficient for single characters - project-euler: solutions for problems 64, 87, 463, and 508
- prettyprint.backend: print some special floats differently, like -0.0, 0.0, 1/0., -1/0., etc.
- python: update to python 3+
- random: implement
binomial-random
distribution, fasterrandoms
usingrandom*
generic - random.mersenne-twister: slightly faster
random-32*
- readline-listener: support pathname completion
- redis: support
SCRIPT
commands - regexp: fix case-insensitive lookahead and lookbehind
- sequences.deep: adding
flatten1
- sequences.extras: more words and tests
- sequences.generalizations: adding
?firstn
- sequences.product: adding
product-find
- sequences.repeating: support repeating elements and repeating sequence
- shuffle: adding more shufflers like
2pick
,5roll
,6roll
,7roll
,8roll
,2reach
,nipdd
… - smtp: fix issues sending email to some SMTP servers requiring HELO after TLS auth
- sodium: support more crypto techniques
- sorting: renamed
natural-sort
tosort
,sort
tosort-with
,sort-with
tosort-by
, etc. - splitting.extras: adding
split-head
,split-tail
- splitting.monotonic: performance improvements to
monotonic-split
- stack-checker.dependencies: fix depends on
struct-class
- stack-checker.transforms: implement
boa
onstruct-class
- strings.parser: support octal escapes
- strings.tables: implement box format
- system-info: adding
username
word - system-info.linux: implement
username
- system-info.macosx: new OS codenames, implement
username
- terminal: fix typo in name of
terminal-height
- tetris: some cleanup, background color showing running or paused
- timers: improve timers to re-use threads when restarted
- tools.annotations: optionally re-annotate silently, add
reset-all
convenience word - tools.completions: add
pathname
completions, improve qualified word name completions - tools.dns: handle dns aliases
- tools.dns.public: add more known nameservers
- tools.hexdump: adding
M\ string hexdump
. - tools.scaffold: improve scaffolding of unit tests
- tools.test: adding
long-unit-test
,must-not-fail
,test-root
,refresh-and-test
,MAIN:
command-line - tools.wc: better support for files not found
- ui.backend.cocoa: supporting dynamic light/dark theme switching
- ui.backend.cocoa.views: supporting preedit input methods for language support
- ui.backend.windows: some bug fixes and cleanup
- ui.gadgets.editors: adding readline-bindings, preedit support
- ui.gadgets.glass: fix popups off screen
- ui.gadgets.panes: better nested stream style support
- ui.gadgets.tabbed: modernized the tab style
- ui.tools.inspector: improve non-printable string inspection
- ui.tools.listener: improve font-size adjustments
- ui.tools.operations: adding copy-object support
- unicode: support Unicode 15.0.0
- units: adding
d^
andd-cube
- units.si: more units (quetta, ronna, ronto, quecto)
- unix.ffi.macosx: adding xattr support
- unix.process: adding
posix_spawn
support - urls: adding
redacted-url
for log files, IPV6 support, lots of test cases - urls.encoding: removing “;” query string separators, adding
encode-uri
anddecode-uri
- uuid: adding support for versions 6, 7, and 8.
- vocabs.cache: fix to not reset disk cache when forgetting a single vocab
- vocabs.loader: fix a restarts issue
- vocabs.metadata: adding
vocab-metadata-paths
- vocabs.platforms: adding some experimental syntax
- webapps: some style improvements, light/dark mode support
- webbrowser: adding
MAIN:
- websites.concatenative: support cgit.factorcode.org
- wikipedia: adding
MAIN:
- windows.com: more COM interfaces
- windows.errors: utility words for error handling
- windows.kernel32: adding
GetLogicalDriveStrings
andGetDynamicTimeZoneInformation
- windows.ole32: more constants
- windows.psapi: adding
GetProcessImageFileNameA
andGetModuleFileNameExW
- windows.registry: adding
query-registry
word - windows.shell32: add
shell32.dll
functions - windows.uniscribe: transparency improvements
- windows.user32: adding DPI awareness words
- windows.winsock: more socket constants
- xdg: adding support for
XDG_STATE_HOME
- xml.data: better support CDATA tags
- xmode: update XMODE files, support newer syntax
- zoneinfo: update to 2023c, improved rule parsing
VM Improvements:
- Increase codeheap default to 96 MB
- Set
current-directory
when launching Factor.app - More work on ARM backend
- Faster
file-exists?
on Windows - Some work on FreeBSD support