Skip to content

Bend 2.0.38

Choose a tag to compare

@Lorenzobattistela Lorenzobattistela released this 20 Oct 22:16
0a57ca0
  • A compiled program's runtime options go between +RTS and -RTS
    (#1466, PR #1530 by viridale). Breaking: ./main --threads 4 now
    passes --threads 4 to the program (IO.args); write ./main +RTS --threads 4 -RTS. A trailing -RTS may be left off, BENDRTS holds
    options too (the command line wins), -- stops option reading and
    reaches the program, and an unknown option inside the bracket is an
    error. --threads takes digits, --gpu takes on, off or a size in
    GB or MB.
  • JS modules keep their names apart. Breaking for JS hosts: a
    constructor's JS tag is its name in the file that declares it, so a
    value crosses modules and matches the right arm (#1105, PR #1488 by
    oxura); imported export keys and foreign JS def ids keep their :
    (#1758, #1759, #1766, PR #1760 by oxura).
  • TCP.send and TCP.try_send hand back unsent bytes, a
    List<&2, U32> to resume with TCP.send_bytes, so a write cut inside a
    UTF-8 character loses nothing (#1764, PR #1765 by oxura). Breaking
    for code that read the residue as a String.
  • Native windows emit Text events with the typed characters on
    Linux and macOS (#1019, PR #1441 by oxura).
  • A Char holds any u32 on every lane; a non-scalar becomes U+FFFD
    only where text leaves Bend (#1080, PR #1411 by oxura).
  • --verdict:
    • The verdict says why each def it lists relies on unsafe or foreign
      code (PR #1531 by MattCozendey), and hints when those defs come only
      through unused imports (#1463, PR #1558).
    • A def specialized at a finite ~ parameter is checked by the kernel
      over each value, so an empty type no longer passes unchecked (#1186,
      PR #1225 by nicolas-abril); a ~ constant takes its model from the
      template's instances (PR #1580 by nicolas-abril).
    • The kernel accepts a self-call on a constructor rebuilt around a
      smaller part of its input, as the checker does (#1167, PR #1200 by
      nicolas-abril).
    • Fixes: annotations under η and let inlining (#1665, #1669, PR #1666 by
      aaaxn); a bare constructor in a type (#1619, PR #1620 by ScottMoore0);
      shared group prefixes (PR #1704 by sebastian-griego); kernel failures
      show their details (#1535, PR #1536 by viridale).
  • Faster:
    • A GPU bang chains its rounds on the device, three command buffers in
      flight, with no host round trip per stage (PR #1447 by nicolas-abril).
    • A flat generic def's spin takes words at its instance's layouts
      (#1195, PR #1588).
    • String.order walks both strings once: 8x on C, and String.eq of
      long strings no longer overflows the JS lane (PR #1459 by aldeni);
      String.contains is linear on JS (PR #1628 by sebastian-griego).
    • Emission allocates 40% less on large files (PR #1617 by
      nicolas-abril); word matches with many literals compile faster (PR
      #1387 by Iann29).
    • U32.pow by squaring and F32.show without a second conversion on C
      (PRs #1567 and #1591 by sebastian-griego); F32.read rejects bad input
      in linear time (PR #1625 by toprameen); expired channel waiters leave
      in constant time (PR #1671 by sebastian-griego).
    • CUDA keeps its L1 cache in bend_dev (PR #1602 by wakamex).
  • Fixes:
    • Metal: a full lane stack spills to the heap, so non-tail recursion
      under ! no longer faults at 1023 frames (#1393, #1394, PR #1439 by
      totaland).
    • C: a shared word is written back to its fork frame slot (PR #1615 by
      viridale); a recursive spine is freed cell by cell (#1307, PR #1438 by
      oxura); native channels free their rows and unread values (#1268, PR
      #1532 by oxura); Nat powers and bit widths take checked paths (#1709,
      #1710, PR #1713 by oxura); functions only an effect calls stay
      reachable (#1711, #1712, PR #1714 by oxura); the crash trap is
      async-signal-safe (PR #1655 by adeerkhan).
    • IO: ready effects yield to other computations every 64 (#1719, PR
      #1723 by oxura); IO.exit flushes buffered output (PR #1519 by
      vicmcorrea); file and JS stream writes fail on zero progress (#1445,
      PRs #1446 by oxura and #1747 by vicmcorrea); nested JS IO schedulers
      are isolated and resume their own channel waiters (#1524, #1761,
      #1770, PRs #1525 and #1762 by oxura); UDP receive buffers are bounded
      (#1695, PR #1698 by oxura); TCP.connect checks its arguments on JS
      (PR #1618 by vicmcorrea); JS Audio.write counts whole frames and
      paces on monotonic time (PRs #1683 by toprameen and #1597 by
      vicmcorrea).
    • Base: List.any, all, contains and find stop once the answer is
      known (#1726-#1729, PR #1730 by oxura); prefix checks stop at the
      prefix (#1640, PR #1645 by EpsilonPhoenix); F32.round keeps negative
      zero and rounds once (#1611, PRs #1613 by oxura and #1547 by
      vicmcorrea); F32.lerp stays finite and keeps its endpoints (#1607,
      #1749, PRs #1608 and #1754 by oxura); F32.to_nat keeps wide values
      (#1636, PR #1642 by oxura); JS U32.to_f32 keeps zero positive and
      scalar F32 host inputs are rounded (#1692, #1568, PRs #1693 and #1569
      by oxura).
    • Effects: CID/FID are scanned with the source's own comment rules
      (#1604, PR #1653 by adeerkhan); a bad Nat from a JS host says its range
      (#1634, PR #1656 by oxura).
  • CLI:
    • bend page.html -o <dir> never overwrites its own page (PR #1690 by
      toprameen); inline HTML modules stay apart from real assets and from
      each other (#1752, #1753, #1767, PRs #1756 and #1768 by oxura); decoded
      module paths are classified right (#1570, PR #1571 by oxura).
    • Output finishes after short writes to a pipe (PR #1691 by toprameen);
      a failed update check keeps the command's status (PR #1603 by
      vicmcorrea); filtered Base output keeps @unsafe (PR #1538 by
      toprameen).
  • Tools: the formatter keeps column-pinned blocks, nested match arms,
    inline bodies and mixed line endings (PRs #1302 by dearlordylord, #1755,
    #1672 by oxura, #1583, #1584, #1590, #1757 by vicmcorrea and
    sebastian-griego); the LSP keeps match scopes across forall bodies (PR
    #1791 by vicmcorrea). Breaking for bend-lint rule authors: option
    constructors are OptionNum, OptionFlag and OptionText (PR #1565
    by vicmcorrea); bend-lint also fixes new buffers, cancelled runs and
    downloaded checkouts (PRs #1745, #1746 by oxura, #1587, #1605 by
    vicmcorrea).

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:

  • 9d5331d01e82dac40dd012953e78221f533f7df7ad7e16b07f1f7bd0dcd088dd bend-2.0.38-darwin-arm64.tar.gz
  • 870be3b91290e14259dba432788c71d7190d8984f8606255e5333c3a03896d5a bend-2.0.38-darwin-x64.tar.gz
  • 1f7c6e74a6ef7412cf08eee0e4d45fe5960f89d66fdaca2466f6a4856f0d400a bend-2.0.38-linux-arm64.tar.gz
  • f19d088b079c9e1a8834ecd153b7d58c11a5f8f9ab1bdb78dbc96a6bf49aaa81 bend-2.0.38-linux-x64.tar.gz