8 ms·
Red Programming Language
- networked 12y agoThe 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 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 http://www.rebol.com/docs/core23/rebolcore-16.html respectively.
- riffraff 12y agoI 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). I always found that fascinating too.
- networked 12y agoYou 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.
- laumars 12y agoAfter 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. [1] http://en.wikipedia.org/wiki/Homoiconicity http://en.wikipedia.org/wiki/Homoiconicity [2] http://en.wikipedia.org/wiki/Curl_%28programming_language%29 http://en.wikipedia.org/wiki/Curl_%28programming_language%29
- coldtea 12y ago>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: http://journal.stuffwithstuff.com/2013/07/18/javascript-isnt-scheme/ http://journal.stuffwithstuff.com/2013/07/18/javascript-isnt...
- qznc 12y agoMost languages have a URL and File/Path class/struct wrapper. Where is the difference?
- StevePerkins 12y agoI'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.
- dockimbel 12y agoSame 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. [1] http://www.rebol.com/docs/core23/rebolcore-16.html#section-3.9 http://www.rebol.com/docs/core23/rebolcore-16.html#section-3... [2] http://www.rebol.com/docs/core23/rebolcore-16.html#section-3.2 http://www.rebol.com/docs/core23/rebolcore-16.html#section-3... [3] http://www.rebol.com/docs/core23/rebolcore-16.html#section-3.8 http://www.rebol.com/docs/core23/rebolcore-16.html#section-3...
- jdeisenberg 12y agoAs 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.
- jack9 12y ago> Prototype-based object support I applaud new language attempts, but please don't go backwards. JS was forced on us, and it's horrid. Lua and <most functional languages> suffer from the same burdens of a non-classical design. Stop making prototype based monsters.
- dockimbel 12y agoI 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. :)
- draegtun 12y agoIt has been mentioned before and there have been redesign options put into the mix - http://red.reb4.me http://red.reb4.me
- gaius 12y agoNot to be confused with http://en.wikipedia.org/wiki/Core_War#Redcode http://en.wikipedia.org/wiki/Core_War#Redcode
- soapdog 12y agoDoes 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...
- doublerebel 12y agoFrom 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. [1] http://rebolforum.com/index.cgi?f=printtopic&topicnumber=27&archiveflag=new http://rebolforum.com/index.cgi?f=printtopic&topicnumber=27&... [2] http://stackoverflow.com/questions/26514041/fixing-the-rebol3-example-calculator-to-use-normal-math-operator-precedence http://stackoverflow.com/questions/26514041/fixing-the-rebol...
- soapdog 12y agoThanks a lot for the links and reply :)
- akavel 12y agoUm, 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?
- iArnold 12y agoAs 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. Regards, Arnold
- ajkjk 12y agoThis 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.
- dockimbel 12y agoRed'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. [1] https://github.com/red/red/blob/master/red.r https://github.com/red/red/blob/master/red.r
- FreeFull 12y agored>> .1 + .2 + .3 = .6 == true red>> .1 + .2 + .3 - .6 == 1.110223024625157e-16 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.
- geographomics 12y agoThe language distinguishes between equal and "strictly equal": red>> .1 + .2 + .3 == .6 == false red>> .1 + .2 + .3 = .6 == true 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. They appear to be implementing it along these lines: http://randomascii.wordpress.com/2012/02/25/comparing-floating-point-numbers-2012-edition/ http://randomascii.wordpress.com/2012/02/25/comparing-floati...
- draegtun 12y agoIt should be noted that Rebol comes with an arbitrary precision (bignum) arithmetic option via it's money! datatype - http://www.rebol.net/wiki/Money http://www.rebol.net/wiki/Money >> .1 + .2 + .3 == 0.6000000000000001 >> type? 0.1 == decimal! >> $.1 + $.2 + $.3 == $0.6 >> type? $0.1 == money! Red will most likely get this soon but perhaps with a different nomenclature (Red as already renamed decimal! to float!).
- qtxie 12y agoIt 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. :)
- fulafel 12y agoChoosing the epsilon requires numerical analyis expertise or lucky cargo-cuting: https://randomascii.wordpress.com/2012/02/25/comparing-floating-point-numbers-2012-edition/ https://randomascii.wordpress.com/2012/02/25/comparing-float...
- darkoverlord 12y agoI 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.
- johnk- 12y agoAnother place to learn more about Red and Rebol is over at the stackoverflow chat room. http://chat.stackoverflow.com/rooms/291/rebol-and-red http://chat.stackoverflow.com/rooms/291/rebol-and-red