Skip to content

Releases: bendlang/bend

Bend 2.0.27

Choose a tag to compare

@Lorenzobattistela Lorenzobattistela released this 23 Sep 21:50
63bee70
  • bend reads no bunfig.toml or .env from 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
    forged All terms check.), or set BEND_HUB, BEND_ORIGIN or BEND_LIB
    for you: your Bender key went to its server on --publish <name>@… and
    bend link, bend update ran 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.json and
    tsconfig.json too), and the ping gate runs the installed bend in such a
    project (#1023). bun bend2/main.ts from a checkout still reads both, as
    any Bun program does: check a project you did not write with bend.
  • A package can carry a license (#1013): --publish takes every file
    named exactly LICENSE beside 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: the SPDX-License-Identifier of the shallowest
    LICENSE, else see <path>. A directory named license in any case is
    refused before mining, since it clashes with a LICENSE on a disk that
    ignores case. A LICENSE added 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 (a Tree and a Forest), or a def above the
    datatypes it returns, need no forward law. A forward D<..> spells every
    parameter. Base's Word, Pair and IO lose their laws.
  • An @unsafe def may call a def written below it, and def 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

Choose a tag to compare

@Lorenzobattistela Lorenzobattistela released this 23 Sep 13:20
  • A package has a name on the hub (#996): import <name>@<version>/file.bend as P asks 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 login logs 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_node and io_wait_on as the runtime
    declares them
    (#947): io_node takes four arguments and io_wait_on
    five, the fourth an absolute io_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 and io_run no longer retain the binder variables
    of every previous compilation.
  • Simpler compiler, same output: the channel runtime lives in
    effs/chan.c and effs/chan.js beside Chan.new, send, recv and
    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

Choose a tag to compare

@VictorTaelin VictorTaelin released this 21 Sep 17:52
  • A literal is a Nat or String by name only where the datatype is
    Base's
    : a file that declares its own Nat checks a literal
    structurally again, so type Nat: Succ{e: Empty} no longer admits 1n
    and a closed Empty (#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__, constructor or toString compiles (#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 with select, since Darwin's poll
    never reports a named pipe's close.
  • A foreign effect's scheduling helper cannot be overwritten by an
    effect named X_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's ts_32 cannot 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), one BEND_RTC macro 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

Choose a tag to compare

@VictorTaelin VictorTaelin released this 21 Sep 05:01
  • A string or nat literal is one Lit node 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 of 200n check in 0.18 s
    instead of 1.06 s, a self-call on a nat literal past 256 passes the
    termination check, and 1n+0n is 1n. 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 a do Result loop 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

Choose a tag to compare

@VictorTaelin VictorTaelin released this 21 Sep 01:25
  • Array.map walks 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 are Data now; 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 ~T clauses; the two became one opaque constant in the generic check
    and let a closed Empty through (#905).
  • The C lane heats a stuck family's type argument at every instantiation, so
    a record carried through F(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,
    --checkup opens 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

Choose a tag to compare

@VictorTaelin VictorTaelin released this 20 Sep 21:07
  • An @unsafe def forks an array: Array.fork gives two handles to one
    block, Array.join merges them back, and Array.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 @unsafe defs 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, binds x to {v : T}; a let with a pattern
    takes no type (destructure in the body).
  • A do block of one statement is typed by its header, and the header's
    leading quantities are filled once for bind, pure and 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_take on 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 --gpu span 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

Choose a tag to compare

@VictorTaelin VictorTaelin released this 20 Sep 13:46
  • 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) with bounce(~f, u) = f(u) once
    checked, and inhabited Empty (#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

Choose a tag to compare

@VictorTaelin VictorTaelin released this 20 Sep 03:55
  • A U32 match 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 b is a parse error at
    the +, not a let that erases the +z it 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

Choose a tag to compare

@VictorTaelin VictorTaelin released this 20 Sep 02:00
  • 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 match on dense U32 literals compiles to a lookup table, as one on
    Nat already 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, cos and tan with 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

Choose a tag to compare

@VictorTaelin VictorTaelin released this 19 Sep 23:45
  • A dot inside a field name is a character on the JS lane too: Outer{a: Inner, a.b: U32} read its Inner'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 define Clo.apply, and a file without import Base that declares
    its own Nat, Bool, Array or 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