Rebol Just a quick look QuickTime™ and a decompressor are needed to see this picture. Philosophy Rebol tries to be very simple to use, especially at first Syntax is very simple, largely intuitive Vocabulary can be quite large Rebol depends on “dialects”: special-purpose vocabularies for different kinds of tasks Rebol is described as a “messaging language,” and has great support for web and email Data, including sounds and images, is represented as characters Elements A Rebol program consists of three kinds of things: Values, such as numbers, booleans, etc. Blocks Words represent things (such as variables) and actions (such as functions) Also comments--they begin with a semicolon ( ; ) There is no distinction between “code” and “data,” other than what the program does with it Rebol is interpreted, not compiled A block is a list of things enclosed in square brackets, [ ], and separated by white space Blocks are evaluated only when the program says to evaluate them Words (but there’s a lot of “etc.”) Values Numbers: 5, 3.14, 1.2E7 Booleans: true, false Hex: #{FF00FF} Strings: "Hello world" Characters: #"a" Money: $4.99, EUR$4.99 URLs: http://google.com Email: steve@apple.com Files: %letter.txt Dates: 8-Dec-2010 Times: 10:30AM tags: <head>, </head> tags: <head>, </head> Tuples: 127.0.0.1 Pairs: 1024x768 Issues: 1-800-555-1212 Blocks: [red green blue] There are about 45 types Conversion functions are to-type, e.g. to-char, to-hex, to-image, etc. Blocks Blocks are things (values, words, other blocks) enclosed in square brackets There is no real distinction between code and data [red green blue] [if 2 < 4 [print 4]] Thus, you can easily manipulate code Implication: Functions--or any chunks of code--are first class objects Blocks are evaluated if the program evaluates them, but not automatically Words There are five ways to use words: As function names or variables: fun, value Setting a word to a value: value: 5, foo: func [i] [i < 10] Retrieving a value: :word Useful for getting the value of a function Using a word as a symbol, standing for itself: 'Bob-Smith Using the word as a refinement: dump/hex, now/date There are no reserved words For example, you can redefine if ...but it’s probably not a good idea! When executed: Call the function or return the value Evaluating a block do will evaluate a block and return the last value reduce will evaluate a block and return a block of results >> do [now/date colors [colors $12] 4] == 4 >> data: reduce [now/date colors [colors $12] 4] == [12-Dec-2002 [red green blue] [colors $12.00] 4] Notice that only top-level elements are evaluated If a block contains both code and data, compose will evaluate only things within parentheses >> compose [ now/date (now/date) ] == [now/date 12-Dec-2002] Control structures do [...] if expr [...] either expr [...][...] while [expr] [...] for i min max step [...] until [... expr] loop count [...] repeat var max [...] forever [...] switch/default var [ 1 [...] 2 [...] ] [...] Logic false or none true or anything that isn’t false or none and x y or x y not x xor x y all [...] any [...] < <= = == != <> >= > Numbers +, -, *, /, **, // (remainder) exp value, log-10 value, log-2 value, log-e value, square-root value absolute value, negate value min x y, max x y, sine, cosine, tangent, arcsine, arccosine, arctangent No precedence; evaluation is done left to right Hence: >> 2 + 3 * 10 == 50 Useful Functions read source returns the string read from source (file, url, ) write dest data writes data to destination (file, url, ) ask question prompts the user the question, returns entered string input read a line from the console to-integer value converts value to an integer to-date value converts value to a date to-file value converts value to a filename prin data prints data without line break print data prints data, appends line break foreach act list [...] executes the block for every element act in list. now returns current date/time Defining functions dump-i: [ print ["i =" i] ] Not a function, just a block of code >> i: 7 == 7 >> dump-i: [ print ["i =" i] ] == [print ["i =" i]] >> do dump-i i=7 dump-i: func [][ print ["i =" i] ] This is a “real” function >> dump-i: func [][ print ["i =" i] ] >> dump-i i=7 Quick example: Text editor view layout [ h1 "Text Editor:" f: field 600 "filename.txt" a: area 600x350 across btn "Load" [ f/text: request-file show f a/text: read to-file f/text show a ] btn "Save" [ write to-file request-file/save/file f/text a/text alert "Saved" ] ] Quick example: Email client view layout[ h1 "Send:" btn "Server settings" [ system/schemes/default/host: request-text/title "SMTP Server:" system/schemes/pop/host: request-text/title "POP Server:" system/schemes/default/user: request-text/title "SMTP User Name:" system/schemes/default/pass: request-text/title "SMTP Password:" system/user/email: to-email request-text/title "Your Email Addr:" ] a: field "user@website.com" s: field "Subject" b: area btn "Send"[ send/subject to-email a/text b/text s/text alert "Sent" ] h1 "Read:" f: field "pop://user:pass@site.com" btn "Read" [editor read to-url f/text] ] 99 Bottles of Beer on the Wall sing: func [count rest] [ prin pick ["99 bottles " "no bottles " "1 bottle " [count "bottles "]] min 4 count + 2 print rest ] for bottles 99 0 -1 [ sing bottles "of beer on the wall," sing bottles "of beer." print pick [ "Take one down, pass it around," "Go to the store, buy some more," ] bottles > 0 sing bottles - 1 "of beer on the wall." print "" ] References Rebol Quick Start, http://www.rebol.com/docs/quick-start.html, by Carl Sassenrath, is a great introduction Learn REBOL, http://www.re-bol.com/rebol.html, by Nick Antonaccio, is a very good, and very thorough, tutorial A Programming Tutorial for REBOL (PDF), http://www.rebol.com/article/0201.html, by Victor Pavlu, is thorough, but possibly a bit out of date I got many examples from this tutorial The recommended book is REBOL—A Programmer’s Guide, by Olivier Auverlot and Peter William Alfred Wood The End