Sometimes I do think of brev as a programming language.

It’s a maximalist Lisp derived from Scheme, with focus on implicitness, do-what-I-mean, magic, metaprogramming, expressiveness, batteries, brevity, and lack of weird grawlix ("$#{}[]+%%:;").

Here is hello world:

That’s it. That’s the whole file.

Here is hello world with extra steps:

Again, that’s the whole file.

Other times, I don’t think of it as a programming language. Because it wouldn’t exist if it weren’t for Chicken Scheme and all the hard work those developers have made over the last twenty years and hopefully many more to come.

That’s why brev’s programs compile into Chicken Scheme programs, brev’s libraries compile into Chicken Scheme libraries, and any of brev’s facilities and magics are usable from Chicken Scheme via extensions.

That’s also why brev was so easy to make—it’s just a bunch of extensions, most of which already existed, and a way to automatically import them since I’m lazy and hate boilerplate.

brev

Scheme is a beautiful minimalist language, the barest of building blocks that can make anything.

So let’s make anything.

I just want to sand down every edge. I’m sick of boilerplate and of re-typing things that the compiler should do.

In other words, I love anaphora, clojurian, miscmacros and similar. I sometimes wish I could use a language where all that stuff was just built-in right away.

Hence brev.

It depends on and reexports the following extensions as is:

From sxml-transports it reexports pre-post-order* and pre-post-order-splice*, from sxpath it rexeports the eponymous sxpath procedure, and from bi-combinators it reexports the exceptionally useful bi-each combinator.

From uri-common it reexports everything but from some (not all!) of the procedures it removes “uri-” or “-uri” from the name, as follows:

From srfi-1, to prevent collisions with sequences, it adds a -list suffix to filter, take-while, drop-while and span.

From sequences, in order to match srfi-1, it renames take and drop to take-while and drop-while respectively, and split to span. It renames index to seq-index to remove a collision with SRFI-42. It also changes the semantics of filter to have both a triadic variant (like the upstream sequences egg) and a biadic variant (to match srfi-1). It removes is? and empty? in favor of the ones from brev-separate.

This egg also contains the mdg extension (short for “match define generics”), which imports define-dx from match-generics and renames it define, so you can have the fanciest define of all time.

The fanciest define of all time

It’s a separate extension to work around a since-fixed bug in older versions of Chicken. It’ll become oart of brev instead (and the mdg extension deprecated) when the new Chicken becomes part of Debian stable.

Compiling brev code

.brev files are scheme files that have an implicit (import brev mdg) at the start of them.

On zsh you can use

to compile them.

On POSIX, you can use this shell script:

This is provided in the egg repo with the name brev. It also passes through any other flags you add, like -O3 or whatever. brev -O3 your-file-name.brev

This is great for quick little apps and pocs and explorations.

If you are making modules (especially if you are making eggs), instead please just make them as normal .scm files that import only the modules they actually need, including brev-separate if needed. There is a brev2scm program included that helps you do that.

.brev files in Emacs

Just add (add-to-list ‘auto-mode-alist ’(“\.brev$” . scheme-mode))

in your init file to load .brev files with scheme-mode. (Or change to taste if you like other modes for your scheming.)

Source code git clone https://idiomdrottning.org/brev

License

Brev is just a meta package so it’s up to the license of stuff it links in. The meta-package itself is just public domain. The new stuff in brev-separate is BSD 1-clause.

Proxied content from gemini://idiomdrottning.org/brev (external content)

Gemini request details:

Original URL
gemini://idiomdrottning.org/brev
Status code
Success
Meta
text/gemini; lang=en
Proxied by
kineto

Be advised that no attempt was made to verify the remote SSL certificate.