Releases: bendlang/bend
Release list
Bend 2.0.27
bendreads nobunfig.tomlor.envfrom the directory it runs in
(#1018): the executable was a Bun program built with Bun's defaults, so a
project it checked could preload its own code before bend's (and print a
forgedAll terms check.), or setBEND_HUB,BEND_ORIGINorBEND_LIB
for you: your Bender key went to its server on--publish <name>@…and
bend link,bend updateran its script, and its own copies of hub
packages, named ones included, were checked in place of the real ones. The
release is now built with that loading off (package.jsonand
tsconfig.jsontoo), and the ping gate runs the installedbendin such a
project (#1023).bun bend2/main.tsfrom a checkout still reads both, as
any Bun program does: check a project you did not write withbend.- A package can carry a license (#1013):
--publishtakes every file
named exactlyLICENSEbeside a published file, at the same path, and the
hash covers it. A package without one is MIT-0 under BendHub's terms, and
the publish warns so. Every publish first prints, on stderr, that the hub is
public and permanent under https://bend-lang.com/bender/terms#s18, and the
license the hub will show: theSPDX-License-Identifierof the shallowest
LICENSE, elsesee <path>. A directory namedlicensein any case is
refused before mining, since it clashes with aLICENSEon a disk that
ignores case. ALICENSEadded to a published package changes its hash:
publish it as a new version (bend-tensors@0.0.0.2 is 0.0.0.1 plus MIT). - Requests to the hub and bend-lang.com carry
User-Agent: bend/<version>
(#1013): publish, publish-check, link, name lookups, package reads, the
login and the daily check, so the hub's log shows which bend sent each. - Datatypes name each other in any order: every datatype is declared up
front, so two datatypes (aTreeand aForest), or a def above the
datatypes it returns, need no forward law. A forwardD<..>spells every
parameter. Base'sWord,PairandIOlose their laws. - An
@unsafedef may call a def written below it, anddef f?(..)is
sugar for@unsafe def f(..), so two mutually recursive unsafe defs need no
law. Safe code is as strict as before: a live call to a def below, or a
mutual pair, is refused as an unfilled law, which is how a forward
reference is now reported (it was an undefined name).
Install: curl -fsSL https://bend-lang.com/install.sh | sh (or Homebrew: brew install bendlang/bend/bend, or Nix: nix profile install github:bendlang/bend).
sha256:
- de1f0a8b8db18c336edfb9385234b34f7da60fa4c79a4261e3be4a9674a2ffd7 bend-2.0.27-darwin-arm64.tar.gz
- fcde1f2a17939b1cbef1369a32c13ffdb7cef53a8355e9cf3887b119c79fa17a bend-2.0.27-darwin-x64.tar.gz
- 2535c11bf554639cd90e634248915c597a06f40753ce28dea5fc71f7a6cf9703 bend-2.0.27-linux-arm64.tar.gz
- 58adc86af6605ed0c48f7d84e4c23028f78893ce4a867a20a4f004b11582687b bend-2.0.27-linux-x64.tar.gz
Bend 2.0.26
- A package has a name on the hub (#996):
import <name>@<version>/file.bend as Pasks hub.bend-lang.com once what the name and version name, keeps the
answer under~/.bend/lib/names, and loads the package by that hash as
before, so a version never moves and a cached name works offline.bend <file> --publish <name>@<version>publishes and names in one run, after
the hub confirms the name is yours or free and the version goes up;bend link <name>@<version> 0x<hash>names a package already published;bend loginlogs in to Bender for both. A name is a-z, 0-9 and -, 12 to 64
characters; a version is four numbers like 1.0.0.0. The first:
import bend-tensors@0.0.0.1/bend_tensors.bend as T. - The effects guide calls
io_nodeandio_wait_onas the runtime
declares them (#947):io_nodetakes four arguments andio_wait_on
five, the fourth an absoluteio_tick()deadline, 0 for none, so an
effect written from the guide compiles. - A second book compiled in one process starts from a fresh probe list
(#976): the bun loader andio_runno longer retain the binder variables
of every previous compilation. - Simpler compiler, same output: the channel runtime lives in
effs/chan.candeffs/chan.jsbesideChan.new,send,recvand
close, so a program carries it only when it uses a channel, and both
match emitters share their table and arms; emitted C and JS are
byte-identical except the channel programs' requests. - The README links the standalone
bend2-lsp(#953, by don2e4).
Install: curl -fsSL https://bend-lang.com/install.sh | sh (or Homebrew: brew install bendlang/bend/bend, or Nix: nix profile install github:bendlang/bend).
sha256:
- a340f4f004860921fb9697e185a05bb1cd4398c74c6192d0b43fc91a36f329ab bend-2.0.26-darwin-arm64.tar.gz
- d904aafdb9999a2c57dd4328d4f86b56b7ba368c302151dab946f7d095f7e3ca bend-2.0.26-darwin-x64.tar.gz
- 0818627723b4ebde029be7aadb5a66ebb842917aa9b058301bb574b67642d373 bend-2.0.26-linux-arm64.tar.gz
- 5edcc8e5c12d525655431ab02659ddf88e362aafbe7c7bb7f783a1ffaeb6165c bend-2.0.26-linux-x64.tar.gz
Bend 2.0.25
- A literal is a
NatorStringby name only where the datatype is
Base's: a file that declares its ownNatchecks a literal
structurally again, sotype Nat: Succ{e: Empty}no longer admits1n
and a closedEmpty(#941). An array count past the nat cap is refused
instead of making a fractional literal that defeats termination (#954). - A wide record compiles: any field list past 255 words has its
multi-word fields boxed, for constructor layouts, nodes and def
signatures alike, so a 512-word record no longer dies "an arity over
255" (#944). A recursive datatype hidden behind a type family is boxed
instead of overflowing the compiler (#959). A datatype named
__proto__,constructorortoStringcompiles (#948). Still open: a
join holding several wide results, or a wide value held across a
non-tail call, is refused with the same message. - An annotated lambda or match applied where it stands compiles on both
lanes, as its let-bound form did (#956). - A read parked on a FIFO sees its end on macOS (#928, PR #932 by
PedroVIOliv): both IO loops wait withselect, since Darwin'spoll
never reports a named pipe's close. - A foreign effect's scheduling helper cannot be overwritten by an
effect namedX_need, in either discovery order (#946, PR #951 by
tachytelicdetonation). - A generated C local carries a
_prefix (PR #926 by nood-co1), so a
host macro such as macOS'sts_32cannot capture it; emitted C grows by
1 to 5 %. - The Node and Bun loaders report unsafe and foreign dependencies on
stderr, as the CLI does (PR #933 by vicmcorrea), and two books compiled in
one process no longer share layout memos (PR #961 by vicmcorrea). - Simpler compiler and effects, same output: the layout packer assigns
offsets once (PR #945 by tachytelicdetonation), the array intrinsics share
one cell path (PR #955 by PedroVIOliv), the facts fixpoint compares set
sizes (PR #960 by byronbenharris), the JS emitter keeps one descriptor per
native constructor (PR #952 by ramonzx6), oneBEND_RTCmacro serves the
device compilers (PR #963 by costamatheus97), and the file and audio
effects share one source each (PRs #950 and #939 by tachytelicdetonation
and tontontimiro).
Install: curl -fsSL https://bend-lang.com/install.sh | sh (or Homebrew: brew install bendlang/bend/bend, or Nix: nix profile install github:bendlang/bend).
sha256:
- c5bb22ba029d5909da9c6db82aa037278a66d1cf8a5572f433879f7dcd866c31 bend-2.0.25-darwin-arm64.tar.gz
- 78e70cda4068f83736649c760575f4382259d5817be96d2eb04b9d078d943af0 bend-2.0.25-darwin-x64.tar.gz
- c7cce7508fd13201d544180cca531a87a89c41829876c431cdfa0ea7f5308481 bend-2.0.25-linux-arm64.tar.gz
- 91c0e2640f8d2e3e73fd3dd62ed4d178ce9a6f7ce8f8980b4dc4abf7a6f9ccd4 bend-2.0.25-linux-x64.tar.gz
Bend 2.0.24
- A string or nat literal is one
Litnode in the checker (PRs #907 and
#924 by MattCozendey): a literal unfolds one constructor at a time when it
is compared, matched or checked, so 50 defs of 1000-char strings check in
0.14 s and 74 MB instead of 4 s and 2.6 GB, a 200k-char literal checks
instead of overflowing the stack, 2000 defs of200ncheck in 0.18 s
instead of 1.06 s, a self-call on a nat literal past 256 passes the
termination check, and1n+0nis1n. The compiled output is unchanged. - The device hands no leaf off: a fork-free leaf reached from a forking
def inside a bang runs on heap continuations on the GPU again, as in
2.0.21, so ado Resultloop of hundreds of turns under a parallel tree no
longer dies with "memory fault". The host keeps PR #876's handoff and its
gains; symreg on Metal stays at 0.32 s (#930).
Install: curl -fsSL https://bend-lang.com/install.sh | sh (or Homebrew: brew install bendlang/bend/bend, or Nix: nix profile install github:bendlang/bend).
sha256:
- b17380ac7b8fce5c5c0250d23c9bb6d99cc9737bfca8a9e5428e051325926e1e bend-2.0.24-darwin-arm64.tar.gz
- 2ec76dd0ad295f4966cf46318ad87ff59a070195a7ede7560cafc564db232015 bend-2.0.24-darwin-x64.tar.gz
- b33e4d5669fad72acc161f35c9ff851ee369391d1af9af2ab2f0258195bf3f93 bend-2.0.24-linux-arm64.tar.gz
- a05c1b5ecab1393f3dd5d67fedbeb83d5dd244c4187c7b36378b6a67a719ac2a bend-2.0.24-linux-x64.tar.gz
Bend 2.0.23
Array.mapwalks the block: Base's map reads each cell and writes the
result into a fresh array instead of splitting and rebuilding the tree, so
16M U32 map in 15 ms instead of 176 ms at a fifth of the memory. Its
elements areDatanow; a map over affine elements is written from the
tree by hand (#911, #913).- A template refuses a second
~binder of one name, in a def or a law's
for ~Tclauses; the two became one opaque constant in the generic check
and let a closedEmptythrough (#905). - The C lane heats a stuck family's type argument at every instantiation, so
a record carried throughF(n, RT)is opened as the record it is (#916). - Inside an imported module, a local named like one of the module's own defs
binds, in a let, a+let, a pattern, a+pattern and a lambda (#915). - A right spine of forks under
!runs on the GPU at any depth the cores
take: the device grow pass no longer stops after 128 turns (#918). - The JS lane names a def from a hyphenated or absolute import path legally,
--checkupopens an absolute import as the run does, and-o out.cjs
emits the CommonJS program (#904, #906, #908, #910).
Install: curl -fsSL https://bend-lang.com/install.sh | sh (or Homebrew: brew install bendlang/bend/bend, or Nix: nix profile install github:bendlang/bend).
sha256:
- dd76241c59b5d01af080512cb32e8d49af94a894a769c5a7372b45f358fe1c0f bend-2.0.23-darwin-arm64.tar.gz
- 90b9a08d09809f1cfc5f7dc15d838dd18595752962ddbe10c44f9d610a472db5 bend-2.0.23-darwin-x64.tar.gz
- acdfdac6633f0bc116b5eefcb639a6fbde242e8a0a7f46dc0ae4cb1df7f3f898 bend-2.0.23-linux-arm64.tar.gz
- 85d1e172082551e64699f98e41f709d6f4dc0b7d687f93814360dc618228a337 bend-2.0.23-linux-x64.tar.gz
Bend 2.0.22
- An
@unsafedef forks an array:Array.forkgives two handles to one
block,Array.joinmerges them back, andArray.atomic.*(add, sub, and,
or, xor, min, max, cas, fadd) act on the shared block from the cores and the
GPU. A match on a shared handle copies its part, as a clone does (#885). - Two
@unsafedefs recurse into each other through their laws: an unsafe
body may call a law that is not yet filled, as it may call itself without
descent. - A typed let,
x : T = v, bindsxto{v : T}; a let with a pattern
takes no type (destructure in the body). - A
doblock of one statement is typed by its header, and the header's
leading quantities are filled once forbind,pureand the annotation:
do Result<String, U32>:with a bind now checks (#900). - A word match compares the whole word: a string, char, U32 or F32 literal
pattern is one equality and its default one else, so three string arms
compile to 291 KB of C, not 16.7 MB (#892). - An Array cell is its element datatype's open layout, so a generic body over
Array<Boxed<A>>and its callers agree on the block class; the C lane no
longer takes the ANode arm for a leaf (#893). - A node shared through a family with two or more indices is opened with
ctr_takeon the C lane, instead of read and freed as owned (#901). - A C table's F32 row is the constant's own bits: a signalling NaN keeps its
payload (#897). - A constructor refuses a repeated field name; the JS lane keyed both fields
on one property (#899). - A module imported through
../or a dot directory works inside an annotated
operator: an operator is the name whose only dot leads it (#903). - A GPU out-of-heap reports at once instead of after seconds of aliased
allocation, a--gpuspan under the fixed region fails with its message
instead of a segfault, and a lane's stack ends at the static image: its
2049th word no longer overwrites a constant (#889). - Fork-free leaves run sequentially and CPU ring work is dealt across workers
(PR #876 by nicolas-abril): binarytrees 0.31 → 0.20 s and symreg on the GPU
0.56 → 0.32 s on an M4 Max. On the GPU a fork-free leaf reached from a
forking def now runs on its lane's 2048-word stack, as a fork kid does.
Install: curl -fsSL https://bend-lang.com/install.sh | sh (or Homebrew: brew install bendlang/bend/bend, or Nix: nix profile install github:bendlang/bend).
sha256:
- 65901150b8abed447c478cbcb1830a99624a810719dcadb94a3a70b35b499a0f bend-2.0.22-darwin-arm64.tar.gz
- 05e85e31e9ad362a0ed34096e032b63e77577bc7c019e72d81eacbebaf9ed65c bend-2.0.22-darwin-x64.tar.gz
- e0f628d73a5e9868c2072acabf082f440ed90df8560f70dffac42b008b23498c bend-2.0.22-linux-arm64.tar.gz
- e2fadbb7d0821d278ad308ade41d5da046285785cc4aa1d0892687b2a689bebb bend-2.0.22-linux-x64.tar.gz
Bend 2.0.21
- A template instance that calls back into an instance whose body is
still being checked is refused as a self-call that does not decrease:
loop(~k, u) = bounce(~loop(~k), u)withbounce(~f, u) = f(u)once
checked, and inhabitedEmpty(#902).
Install: curl -fsSL https://bend-lang.com/install.sh | sh (or Homebrew: brew install bendlang/bend/bend, or Nix: nix profile install github:bendlang/bend).
sha256:
- 688e7c40f5f8729614a2bb8652c265f5151f53d4f9d22cf359d8a86a930e0bfd bend-2.0.21-darwin-arm64.tar.gz
- 55d889deff1f0d9c74d6be07e6aef5a22145b4d26110cda43dcde6483c9e1d26 bend-2.0.21-darwin-x64.tar.gz
- e7cf47ac8d14e14a26463fe07af0ae16618c4a1f5f26561d9cbd9721f3c60b41 bend-2.0.21-linux-arm64.tar.gz
- 7efce68d47239d5859653deedb2615fd2e048e531ba7025cdcf09e884aca577c bend-2.0.21-linux-x64.tar.gz
Bend 2.0.20
- A
U32match whose arm is a hand-written bit pattern answers that arm:
since 2.0.19 the lookup table filled its gaps with the last default, so
case U32{WCon{True{}, r}}(every odd word) between literal cases read
the_case on every lane (#867). - An erased let binds erased names only:
-y +z = a bis a parse error at
the+, not a let that erases the+zit was told to keep. - The arena's page cap is published with a release store and read with an
acquire load, so a core that sees the new cap also sees the banks at
their new place (#881).
Install: curl -fsSL https://bend-lang.com/install.sh | sh (or Homebrew: brew install bendlang/bend/bend, or Nix: nix profile install github:bendlang/bend).
sha256:
- e8da8e28ea963e4d3956b4ab80f1c1df9a8c5208dbd6ef1e3e49bb913ed0f374 bend-2.0.20-darwin-arm64.tar.gz
- 89b95a5de78cf3c9e76ab649ca62ee66b3e2e6e168b2baf862a0ad4e7e57f2e7 bend-2.0.20-darwin-x64.tar.gz
- 0ca9183003ea2d5d52834fe4fbe36577f13254739cf32b1455888518914e8df4 bend-2.0.20-linux-arm64.tar.gz
- dca589832e1645500ad258d27171ed6b5a30812bcc3088c9aedf437059be41e1 bend-2.0.20-linux-x64.tar.gz
Bend 2.0.19
- A Bend binary starts in 2 ms, not 12: the runtime reserves 8 GiB and
grows it in place when a program needs more, instead of mapping the whole
8 TiB address space at every run (#881). - A record of records compiles: a datatype past 256 machine words is a heap
node, the way a recursive type already was, and a constant the compiler
folds emits once. Seven levels of an eight-field record took 50 s, 19 GB
and 97 MB of C; it now takes 0.06 s, 122 MB and 82 KB (#843). - A
matchon denseU32literals compiles to a lookup table, as one on
Natalready did: 256 cases took 1.46 MB of C and 3.5 GB, and now take
80 KB and 1.6 GB (#867). - The Metal lane computes
sin,cosandtanwith the GPU's fast trig
(#887). - A
-local is erased again: its name is dead in the body, and its value
is checked dead, so it may spend a variable twice. Since 2.0.16 the mark
was lost on both counts.
Install: curl -fsSL https://bend-lang.com/install.sh | sh (or Homebrew: brew install bendlang/bend/bend, or Nix: nix profile install github:bendlang/bend).
sha256:
- 9b3b7da0919e345ffe0f7c81059593bd45e533571dbaaedac45b5362ddb27779 bend-2.0.19-darwin-arm64.tar.gz
- 41fdd494425f79746d78bbc2ee11279f199cd216c723de210fe1a2ad64375266 bend-2.0.19-darwin-x64.tar.gz
- 388b3c1f98468ad7cc508b67044c842fc24c1527962cecd6a68c956ab6f92e5e bend-2.0.19-linux-arm64.tar.gz
- 4f50d0a34283bb4e9ad6277a36fd91ef20c5d8992ca857c8185e605b866425b9 bend-2.0.19-linux-x64.tar.gz
Bend 2.0.18
- A dot inside a field name is a character on the JS lane too:
Outer{a: Inner, a.b: U32}read itsInner's field, not its own (#868). - A value sent through a channel is never read as a parked receiver on the
JS lane: sending an erased proof reported a deadlock (#871). - A name the compiler encodes itself is refused, not miscompiled: no file
may defineClo.apply, and a file withoutimport Basethat declares
its ownNat,Bool,Arrayor another of base.bend's types checks and
runs, but does not compile (#870, #875). - The verdict names the defs that rely on a foreign def, as it names the
ones that rely on@unsafe: the checker reads a foreign def's type,
never its code (#874). - A datatype whose arguments are written in
{}says to write them in
<>(#864).
Install: curl -fsSL https://bend-lang.com/install.sh | sh (or Homebrew: brew install bendlang/bend/bend, or Nix: nix profile install github:bendlang/bend).
sha256:
- e994cdbc008300c0a95cf146591e4ff947e74b31ec73b3f8a8e2cc88dddf422e bend-2.0.18-darwin-arm64.tar.gz
- b333b8468bb00f80f70a197e0907bd31d2f218f2d2e41ec1c92c3aaef14f9478 bend-2.0.18-darwin-x64.tar.gz
- 61a4b963e496f109b0d63fb51cbe5dc3c99ff02c7500f30881caf1525e24e685 bend-2.0.18-linux-arm64.tar.gz
- e55c564fa784a5428392fce57e1a81a7ae472bb9fa3bb2a5e745d6e6295dc22a bend-2.0.18-linux-x64.tar.gz