The thing I find the most fascinating about Rebol and Red is their respective type (runtime tag?) systems, which are unusual for modern dynamically typed languages; today you'd expect such things as URLs and file paths to be represented in the language as either plain old strings or classes, not their own basic types. You can see Rebol's and Red's type systems at http://i.imgur.com/0XFuRmS.png (this is a slide from a presentation deck on Red's about page) and http://www.rebol.com/docs/core23/rebolcore-16.html respectively.
I think the word you're looking for is "literals", i.e. rebol has URL literals (cause there isn't much difference in many modern languages between "basic types" and classes).
You are probably right. The distinct literal notation for the datatypes (which is what the Rebol manual calls them) is their biggest draw for me.
Although the sequence! and the object! datatype in Rebol are not subtypes of each other they have similar semantics (pass by reference, explicit copying, mutation performed in place by built-in functions like sort).
Objects in Rebol and their literal representation are actually pretty interesting, too. Douglas Crockford cites Rebol as one of the inspirations for JSON, and you can see why when you look at an example:
>> example: make object! [
var1: 10
var2: var1 + 10
var3: now/time
set-time: does [var3: now/time]
calculate: func [value] [
var1: value
var2: value + 10
]
]
>> print mold/all example ; mold/all serializes data
#[object! [
var1: 10
var2: 20
var3: 21:42:34
set-time: #[function! [][var3: now/time]]
calculate: #[function! [value][
var1: value
var2: value + 10
]]
]]
I haven't read much Rebol application code but as far as I understand serializing objects and storing them on disk as plain text is the norm for configuration and persistence.
After reading up a little more about Red on Wikipedia, I came across the term "Homoiconicity"[1] which I hadn't encountered before (though the concept itself wasn't new to me, I wasn't aware there was a name for it). What homoiconicity refers to is where the language syntax mirrors the metadata markup - just as you described here with JSON / Javascript. In fact it's a common feature of LISP and it's descendants, Scheme obviously being one. So it's not that surprising that Javascript also inherited homoiconicity from Scheme.
The other interesting thing about my research on Wikipedia was the tangent it took me on. I started reading about other other homoiconicity languages that I hadn't heard of; and that lad me to a page about the programming language "Curl"[2] (not related to the cURL HTTP client that most Linux / UNIX sysadmins would be well versed in). Curl is very interesting as it merges the different stacks of web development (markup, style sheets and scripting engine) in a unified language that can still be abstracted separately if one so chooses. Baring the syntax, it was exactly the type of concept I was suggesting a little while back when myself and a few friends were discussing ideal world scenarios of how we'd reinvent the web-development stack.
Anyhow, Red is definitely an interesting language in itself. But it's always a bonus when one interesting post on HN leads you on a journey of a few other discoveries.
JavaScript is not a homoiconic language, because the important feature of homiconicity is not that the syntax "mirrors" the syntax of data, but that the syntax is actually represented as a piece of data that can be manipulated in the language.
For example, in Scheme, I can easily generate data structures and interpret them as code to be executed or as data to be manipulated. For example, here I can generate code corresponding to a given factorial, and also muck with it.
There is no analogous way of generating and manipulating JavaScript code using JavaScript. If all JS code could be understood as JSON that then could be fed back into JavaScript and manipulated there, then it would be homoiconic.
>So it's not that surprising that Javascript also inherited homoiconicity from Scheme.
Actually it didn't. Javascript is not homoiconic. JSON just happens to be almost like a homoiconic version of the Javascript array and dict data types, but that stops there.
For one, there are some restrictions to what can be valid JSON that are not the same for JS code. And then there are functions etc, which are not in JSON.
And the idea that JS is somehow related to Scheme isn't really true (despite being repeated even by Eich). What it has common with Scheme, tons of other languages that nobody will ever say of them to be related to Scheme have. What it doesn't have in common is what makes Scheme scheme. See also:
That article states that Javascript isn't Scheme, which is a point I never argued (I think you've read far too much into my "inheritance" point).
Javascript was inspired by Scheme, and obviously other languages as well. Since we're referencing Eich, he has also personally talked[1] about how he was hired at Netscape to write a Scheme for the browser and how he later developed a new language with ideas borrowed from Scheme (as well as Self, TCL and a few other languages IIRC). Thus there are obviously going to be some inheritance from Scheme in Javascript; even if they are conceptually very different languages and even if those qualities inherited are also shared amongst a multitude of other languages.
You see, something doesn't have to be exactly like, nor even uniquely like, to still have inheritance. Much like how derivative works in art where the predecessor stands up as an original piece - separate from the parent's vision - despite sharing the same lineage. Such is the beauty of derivative works - you can take inspiration from the preceding material yet still invent something different.
So that's what I meant when I said that Javascript inherited homoiconicty from Scheme (though obviously I was wrong about Javascript being homoiconic itself - and I thank you for that correction)
>Javascript was inspired by Scheme, and obviously other languages as well.
Well, I didn't argue that JS isn't Scheme (that is of course obvious).
I argued that it doesn't seem to have anything specifically Schem-y about it.
Eich says it was "inspired by scheme", but I, like the article author, fail to see any such inspiration.
JS doesn't have Scheme syntax, nor does it have Scheme semantics (of course that's obvious to see). It also doesn't have the most celebrated Scheme features (from homoiconicity and macros to tail call optimization). And all the other stuff (GC, closures, etc), was already available in languages predating Scheme, and he knew that (Lisp, Smalltalk, etc).
And he even mentions the language Self, which is a much closer to JS than Scheme. I think he mainly just wanted to do a Scheme, but INSTEAD he did JS, which is mostly Self, Java syntax and a few other ideas thrown together.
JavaScript is not homoiconic - JavaScript code could not be expressed as JavaScript data structure. That's the main point. If you could express your code as a data structure of the same language you can write programs to modify your programs (macros)
I'm not familiar with Red, but my understanding of REBOL is that its main use case is writing domain-specific languages to do the actual work. I can think of many domains in which you would want your DSL to include primitives/literals for files or network URL's.
Of course, if Red is not so much a DSL as it is a DSL-authoring language like REBOL, then I share your confusion. For a general purpose language, I'm not sure what the advantage would be of making those primitives/literals rather than components within the standard library.
Same reason for Red aswell as for Rebol. There are many more primitive/literals like that, tuple! [1] for example is used to represent RGB colors (255.0.255), ipv4 addresses (192.168.0.1) or even version numbers (2.7.8). Time/Date [2][3] also are basic datatypes with proper literal form.
From Rebol console (these types not yet all implemented in Red):
>> red + blue
== 255.0.255
>> 192.168.100.123 and 255.0.0.0
== 192.0.0.0
>> yesterday: now/date - 24:00
== 15-Nov-2014
>> in-one-year: now + 365
== 16-Nov-2015
>> yesterday < in-one-year
== true
Rebol provides around 55 datatypes, with a good part of them having a specific literal form. The standard library is actually built-in the language, through this rich set of datatypes (each datatype overloads the basic language functions and operators). You don't need to "import" any of it, it's right there, but almost transparent to the users. The footprint for that is small, the full uncompressed runtime in binary form is about 500KB only.
This unusual (but very effective in practice) approach, is one of the features that got me hooked to Rebol in the first place, 15 years ago.
This site should really have some code examples on the main pages. I shouldn't have to watch videos to get a basic idea of the syntax and what it can do. The blog on the front has some code, but it's not geared towards explaining the basic ideas.
Red's author here. I agree and I apology for the currently poor web site. It was built for the Red and Rebol crowd to help them follow us while we are building Red. As we are getting closer to a beta version, we are planning to move in the next couple of months to a brand new site that will properly communicate about Red to newcomers.
About the syntax and semantics, in a nutshell, it's a Lisp without parentheses and with infix operator support. Tokens are separated by a whitespace or a delimiter (very few of them). Code is a tree of lists (called "blocks" in our local jargon), blocks are delimited by square brackets [].
You can have a look here [1] for a larger code and syntax example.
Good to see you have serious plans for this language. I was always interested in Rebol, but never became any 'good' at it --- although I always like to read updates about it and its forks.
This doesn't feel right to me. I usually would expect equality to be a strictly exact thing. This is bound to cause some problems in code that assumes IEEE-754 has been implemented exactly.
I'm not sure if that syntax is the wisest choice, but in the absence of arbitrary precision arithmetic it seems a very good concept, to avoid common IEEE-754 surprises.
It also doesn't feel right to me when I learned it for the first time. But if you know that "=" means "almost equal" when doing float comparision, it is very convenient in practical use. For example, if we want to compare two float variables.
In Red:
if float-1 = float-2 [
; do something
]
In other languages:
if (float-1 - float-2) < EPS {
// do something
}
Obviously, Red's way is more natural and readable. :)
Thank you for reminding us about those great articles! We were using a Ulp-based method only, but Qtxie proceeded with some improvements [1] for close to zero values, as suggested in the article. Thanks again. :-)
Does anyone has a link comparing Red to REBOL? I was a heavy REBOL user back then and always missed the language. I wonder if Red is a viable substitute...
From my reading today it seems REBOL 3 and Red have semi-merged [1]. REBOL 3 extensions can be written in Red, and the communities seem to share the same online spaces and goals.
Red looks awesome in the long run, the main weirdness being its refusal to follow standard math operator precedence [2].
Although Red's macro/DSL buildup skips a ton of intermediate bloat, someone needs to write a normal server framework to interact with standard industry data sources. When it becomes easy to add a Red microservice to an architecture, Red can enjoy an explosion of adoption as Go has.
As the person that replied to your second point on the SO question there, I have to add something here.
There are other calculators made in Rebol. (Search rebol.org site scripts for those). Having this calculator adapted for the math operator precedence would be too farfetched, for the example merely shows how much can be done with so little code.
The other is that I do not have the ultimate say in what Rebol and or Red should do with math operator precedence, I have nothing to say about that to be exact ;-)
(I am free to express my opinion on the subject). What I state there still holds for me, the operator precendence is imho arbitrary, and not necessary at all, counterintuitive for kids, and (I am a mathematician) the world can do without these rules. With operator precendence I have no other choice then to use ellipses when I have 3 * 4 + 1 and I meant I wanted to add 1 to 4 before multiplying by 3: 3 * (4 + 1) in Rebol I can write 1 + 4 * 3 and I do NOT have to use "(" and ")" to achieve what I intended saving me four keystrokes.
Just saw this. That is not my SO question -- I'm just a lifetime programmer who has never seen rewriting of operator precedence in the tens of languages I've used.
Does the operator precedence convention of treating addition and multiplication equally apply to all of Red? All of REBOL? Or is it just that program? Thanks.
Both Rebol and Red use that convention. It sounds weird at first look, but proved to be a relief in practice (no need to remember any specific precedence rule). Though, we plan to provide a small math-oriented DSL for writing expressions using standard math conventions. It would look like this:
Um, the first link seems to me to only suggest unification of REBOL 3 and Red tests, not languages themselves; or do I miss something? Also, it seems to only suggest that, not claim it done yet?
You will find in Red everything you liked in Rebol, with some important additions like cross-platform static compilation and system programming abilities [1] through the built-in Red/System DSL. On the downside, Red is still alpha, but beta is just a few months ahead.
I am happy to read that the site will become more accessible to a larger group. I've REBOLed a long time in the 2000s and made good money of it.
Make no mistake: both REBOL and RED have an extremely powerful underlying model model to help solve problems. In a world of containers and micro-services "something like these" will emerge.
If nothing else, that's a reason to follow them - between Go and RED/REBOl you can see a glimpse of computing as it will be.
As wonderful as the language might be, the site is nearly unreadable; the black background makes the dark red links almost invisible, and it "swallows up" the thin, small white text.
I have replied about the web site on the top comment. I have noticed that the readability varies greatly across browsers/OS/devices. Anyway, the color scheme and layout we are using currently are far from being the best. We will change that before officially opening the doors to our guests. :)