Rebol is a [[Apache v2]] licensed programming language written in [[3. Reference/Software/Programming Languages/C|C]]. - [Website](http://www.rebol.com/) (official but unmaintained) - [Wikipedia](https://en.wikipedia.org/wiki/Rebol) > Although it can be used for programming, writing functions, and performing processes, its greatest strength is the ability to easily create domain-specific languages or dialects ## Rebol 2 First released in 1999. Final official release in 2016 for eglibc Linux (2.7.8.4.10). Closed source and unmaintained since. - [Documentation](http://www.rebol.com/docs/docs.html) (Rebol 2) - [Builds](https://web.archive.org/web/20210901140209/https://www.maxvessi.net/rebsite/Linux/index.php) (unofficial Linux packages, archived 2013) - [Wikibooks](https://en.wikibooks.org/wiki/Rebol_Programming) - [Tutorials](https://web.archive.org/web/20121007020342/http://reboltutorial.com/) (archived 2012) - [Rebol Links](https://www.maxvessi.net/rebsite/wr/) ## Rebol 3 First released in 2008. Final official alpha release in 2012, last commit in 2014, but there are still active forks. Oldes' fork updates often. - [Website](https://oldes.github.io/Rebol3/) (Oldes' fork, active) - [Source](https://github.com/Oldes/Rebol3) (Oldes' fork) - [Source](https://github.com/rebol/rebol) (official, unmaintained since 2014) - [Builds](https://rebolsource.net/) (officially unofficial builds, unmaintained since 2014) - [Documentation](http://www.rebol.com/r3/docs/index.html) (official, unmaintained) >[!NOTE] > Most of this considers [[#Oldes' Rebol 3]] branch to be the direct successor to the last official release. # Notability Inspired [[JSON]]. # Thoughts Discussions about Rebol with [[Brian Hawley]] were hugely influential on my exploration into programming languages and subsequently on my own programming languages. It is essentially a [[Lisp]] that avoids most of its predecessor's parentheses, partially by taking some inspiration from [[Forth]] but mainly just by doing clever arity checking. The resulting language is cleaner and more interesting to me as a result. Has a rich set of core syntactic data types with literals that few other languages enjoy. Due to making s-expressions unnecessary, making DSLs is not only easy but they can look just about however you can imagine (as long as brackets match if you don't want to get into the [[Rebol Parse Dialect]]). While [[Raku]] has powerful grammars they're difficult to use and integrate and while [[Racket]] is designed for building DSLs it is still an s-expression language and cannot transparently switch between them. Rebol really beats everything, of any language perhaps only [[Forth]] and [[Ruby]] comes close but they have their own severe limitations. # Philosophy ## Speed & Compactness When Carl was working on the language, he prioritized speed and compactness over all else - with a strong nod to stability too. Rebol 2 was an incredibly tiny package with enormous capabilities. Rebol 3 was not quite as compact, possibly due to simply not having the time to optimize it, but its beta release was still very powerful and small relative to other languages - it's distribution measures in *kilobytes*. I distinctly remember a discussion where Carl decided not to update a dependency, [[Zlib]] I think, because the new version was larger and didn't have any security fixes that affected Rebol. ## License Rebol 2 was a commercial closed-source product. And used by a few consulting firms and a dedicated community. ## Forks There are various active forks and descendants of the language now. ### Oldes' Rebol 3 - Attempts to stick to the base principles and style of the original Rebol 3 release - Completely rewrote the build scripts - Actively developed and greatly improved from the initial open source release - Still relatively tight ### Ren-C `ren-c` by Hostile Fork - Originally intended for embedding as a scripting language in other programs - Apparently now it is being developed with the goal of targeting [[WASM]] - Heavily modified in style and function from the original - Very large and slow compared to the original or other forks - Re-licensed as LGPL v3 in 2020 for some reason - Primary developer lives up to their name - Technically started as a fork, but it's hard to call it that anymore ## Descendants - [[Red]] - An entirely new language inspired by Rebol, and bootstrapped from Rebol 2 - Attempts to return to a lot of the Rebol 2 paradigms, even when Rebol 3 made clear improvements over them - Funded by investors in China for some reason? - A pseudo-compiled language, even moreso than Go, it mostly just packages up the source with the binary (last I checked) - [[Rye]] - https://ryelang.org/ - A language written in [[Go]], inspired by Rebol - [[Arturo]] - A language written in [[Nim]], inspired by Rebol # Platform Support ## Rebol 3 For Oldes branch, the only fork really worth considering. | OS | AMD64 | IA-32 | ARM64 | ARMv7 | ARMv6 | RISCV | MIPS64le | | ------------ | ------- | ------- | ------- | ------- | ------- | ----- | -------- | | Linux | x, musl | x, musl | x, musl | x, musl | x, musl | x | \* | | FreeBSD | x | | | | | | | | DragonflyBSD | x | | | | | | | | OpenBSD | x | | | | | | | | Haiku | x | x | | | | | | | macOS | x | | x | | | | | | Windows | x | x | | | | | | - \* - not included with the official binaries, but supported according to the build scripts - `musl` - includes a separate [[musl]] build # Features # Data Types ## Errors See also: [[Rebol - Errors]] ## Numbers > Numbers are written as integers, decimals, or scientific notation. > And can also be written in European format ```r 1234 -432 3.1415 1.23E12 123,4 0,01 1,2E12 ``` ## Typesets A typeset is a set of datatypes. > A typeset is simply a compact, high-performance method of storing the datatype sets as a new kind of datatype. Typesets are important because the interpreter uses them to quickly validate function arguments. > > The **typeset!** datatype knows how to convert a block of datatype names such as `[integer! decimal! money!]` into an internal representation (similar to the bitset datatype). It can also convert the internal format back to a block for output or changes. > > The addition of typesets eliminates the need for the special REBOL pseudo-datatypes like **series!** and **number!**. These are now implemented as typesets, but you can use them the same way as before. They can be used in function argument specifications: ## Refinements A function refinement is defined by a leading slash in the spec block. Arguments listed after the refinement are additional arguments that the function requires if that refinement is applied at the callsite. ```r ;; rebol sum: func [ "Return the sum of two numbers." arg1 [number!] "first number" arg2 [number!] "second number" /times "multiply the result" amount [number!] "how many times" ][ either times [arg1 + arg2 * amount][arg1 + arg2] ] ``` ## Series Types See also: [[Rebol - Series]] A typeset composing a bunch of types which can be treated as an ordered series. ## Blocks See also: [[Rebol - Blocks]] ## Contexts See also: [[Rebol - Contexts]] ## Money Rebol has a dedicated money type. > It is defined as a high precision decimals with denomination (opt). > It is of the general type scalar. ```r $12.34 USD$12.34 CAD$123.45 DEM$1234,56 ``` ## Tuples > Tuples are used for version numbers, RGB color values, and network addresses. They are written as integers that range from 0 to 255 and are separated by dots. ```r 2.3.0.3.1 255.255.0 199.4.80.7 ``` ## Pairs > Pairs are used to indicate spatial coordinates, such as positions on a display. They are used to indicate both positions and sizes. Coordinates are separated by an x. ```r 100x50 1024x800 -50x200 ``` ## Issues > Issues are identification numbers, such as telephone numbers, model numbers, credit card numbers. ```clojure #707-467-8000 #0000-1234-5678-9999 #MFG-932-741-A ``` ## Binary > Binary values are byte strings of any length. They can be encoded directly as hexadecimal or base-64. ```clojure #{42652061205245424F4C} 64#{UkVCT0wgUm9ja3Mh} ``` ## Dates > Dates are written in either international format: day-month-year or year-month-day. A date can also include a time and a time zone. The name or abbreviation of a month can be used to make its format more identifiable in the United States. ```r 20-Apr-1998 20/Apr/1998 (USA friendly) 20-4-1998 1998-4-20 (international) 1980-4-20/12:32 (date with time) 1998-3-20/8:32-8:00 (with time zone) ``` ## Time > Time is written in hours and minutes with optional seconds, each separated by colons. > > Seconds can include a decimal sub-second. Times can also include AM and PM appended without intervening spaces ```r 12:34 20:05:32 0:25.345 0:25,345 12:35PM 9:15AM ``` # Tips ## Building Oldes Fork ```sh siskin ./make/rebol3.nest --clean --update rebol3-bulk-linux-x64 ``` ## Vim Syntax Vim actually ships with Rebol 2 syntax[^1] and filetype detection,[^2] although it looks for the `.r` file extension. So for basic usage with different extensions, all that is necessary is: ```sh set filetype=rebol ``` There is a third party repo for Rebol 3 syntax and filetype detection using the `.reb` extension, but it hasn't been updated since 2015.[^3] The script[^4] used for the former may be useful for updating the latter. # Resources - [Script Archive](http://www.rebol.org/index.r) "This is a site to promote collaboration between REBOL developers" # References - http://rebol.org/ (mostly dead site but has some historical archives) - http://rebol.net/ (mostly dead site but has some historical archives) - http://www.rebol.com/faq.html (old official Rebol FAQ) - https://stackoverflow.com/questions/14818324/what-is-the-summary-of-the-differences-in-binding-behaviour-between-rebol-2-and (2 vs 3) ## Rebol 3 - http://rebol.com/r3/docs/functions.html (incomplete alpha docs) - http://learnrebol.com/rebol3_book.html (Saphir fork) - http://www.rebol.net/r3blogs/0002.html (incomplete alpha blog) ## Rebol 2 - [A Quick Tour of Rebol (official)](http://www.rebol.com/docs/core23/rebolcore-3.html) - http://www.rebol.com/docs/core23/rebolcore-6.html - http://www.rebol.com/docs/core23/rebolcore-9.html#section-3.4 - http://www.rebol.com/docs/words/wcontext.html - http://www.rebol.com/docs/core23/rebolcore-3.html#section-2.4 - http://www.rebol.com/docs/words/win.html - https://en.wikibooks.org/wiki/Rebol_Programming/Advanced/Bindology - https://en.wikibooks.org/wiki/Rebol_Programming/Advanced/Identity - https://en.wikibooks.org/wiki/Rebol_Programming/Advanced/Interpreter - http://blog.revolucent.net/2009/07/deep-rebol-bindology.html [^1]: https://github.com/vim/vim/blob/master/runtime/syntax/rebol.vim [^2]: https://github.com/hexchain/vim/blob/bc6fcbe4ce52bc48c3d77b24086acc61ed3333bc/runtime/autoload/dist/ft.vim#L441 [^3]: https://github.com/Prosumma/vim-rebol [^4]: https://github.com/r3n/rebol-editors/blob/master/make-words-list.reb