The Racket repository
Go to file
Matthew Flatt b7392a688e hash-iterate-value & co.: add an optional bad-index result
The new argument to `hash-iterate-value` and most other
`...-hash-iterate-...` functions determines a result to be returned in
place of raising a "bad index" exception.

For most kinds of hash tables, a "bad index" exception will only
happen when the provided index is wrong or when a hash table is
mutated during an iteration. Mutation during iteration is generally a
bad idea, but in the case of a weak hash table, a potential background
mutation by the garbage collector is difficult to suppress or ignore.
Adding an option to control bad-index behavior makes it easier to
write loops that defend against uncooperative tables, including loops
where a hash-table key disappears asynchronously.

Racket's printer was already using this functionality internally, so
the change to `hash-iterate-value` and company mostly exposes existing
functionality.

The `in-hash` form and related sequence constructors similarly support
a bad-index alternate value so iterations can handle that case
explicitly. They do not use the new bad-index support implicitly to
skip missing entries, because that idea does not play well with the
iteration API. A hash-table index can go bad after `in-hash` has
selected the index and determined that it should be used for the next
iteration, and a sequence can't take back that decision.
2018-07-31 10:14:07 -06:00
pkgs hash-iterate-value & co.: add an optional bad-index result 2018-07-31 10:14:07 -06:00
racket hash-iterate-value & co.: add an optional bad-index result 2018-07-31 10:14:07 -06:00
.gitattributes Don't include git files in archives. 2010-05-12 01:46:05 -04:00
.gitignore gitignore: vim swapfiles 2017-07-29 11:53:06 -04:00
.mailmap mailmap updates & fixes. 2013-04-03 18:10:22 -04:00
.travis.yml Disable pkg tests on Travis. 2017-06-22 13:33:03 -04:00
appveyor.yml use VS 2013 on AppVeyor 2018-05-15 11:07:06 -06:00
INSTALL.txt io: repairs for Windows path maniplation 2018-03-23 10:37:59 -06:00
Makefile makefile: add cs-base and cs-in-place targets 2018-07-03 09:11:07 -06:00
README.md switch to a new, Racket-implemented expander & module system 2018-02-26 13:19:53 -07:00

This is the source code for the core of Racket. See "INSTALL.txt" for full information on building Racket.

To build the full Racket distribution from this repository, run make in the top-level directory. To build minimal Racket, run make base.

The rest of the Racket distribution source code is in other repositories, mostly under the Racket GitHub organization.

Contribute to Racket by submitting a pull request, joining the development mailing list, or visiting the IRC channel.

License

Racket Copyright (c) 2010-2018 PLT Design Inc.

Racket is distributed under the GNU Lesser General Public License (LGPL). This implies that you may link Racket into proprietary applications, provided you follow the rules stated in the LGPL. You can also modify Racket; if you distribute a modified version, you must distribute it under the terms of the LGPL, which in particular states that you must release the source code for the modified software.

See racket/src/COPYING_LESSER.txt for more information.