[REBOL] Unofficial examination of undocumented REBOL features (draft)
From: rebol::svendx::dk at: 23-Oct-2000 23:39
Hello list,
Inspired by the recent "objects without overhead" thread, I decided to draft a document,
describing some of the undocumented features of REBOL.
I have attached my first atempt, which is also available at:
http://www.obscure.dk/rebol/REBOL_behaviour.txt
My hope is that many people will contribute with corrections, whole sections and very
important; REBOL code to prove/disprove the assumptions made in the document.
What do you think?
Is it a generally good/bad idea?
Is it structured right? focusing on the right aspects?
Best regards
Thomas Jensen
BTW.
English is not my native language, so please don't be shy to comment on the words/language/spelling
used in the document :-)
-- Attached file included as plaintext by Listar --
-- File: REBOL_behaviour.txt
Title: Unofficial examination of undocumented REBOL features
Version: 0.1
Status: draft
original Author: Thomas Jensen ([thomas--obscure--dk])
Maintainer: Thomas Jensen ([thomas--obscure--dk])
Created: 23-Oct-2000
Last modified: 23-Oct-2000
History:
0.1: initial version
*** disclamer ***
The contents of this document is based on observered behaviour of the REBOL(tm)
intepreter.
The information given in this document is in no way endorsed by
REBOL Technologies (REBOL tech.)
*** goal ***
To provide an description of some of the undocumented aspects of the REBOL(tm)
language.
These include: parsing, evaluation, contexts, values, words, objects and
functions.
Because REBOL is closed-source, some of these aspects can only be examined by
analyzing the behaviour of the current REBOL intepreter. The reference version
of the intepretor is always the most resent version of REBOL/Core, as other
flavours (REBOL/View, REBOL/Command, etc) are presumed to be based on
REBOL/Core code.
*** concepts ***
* context:
a list of word/value pairs, a value being any valid REBOL value,
including unset!
In this text, I'll presume that a REBOL context! datatype exist
* global context or top level context:
the context represented by the 'words object! contained in the 'system
object!
* function:
a REBOL function! value
* object:
a REBOL object! value
* word!:
a REBOL word! value
*** operational behaviour ***
a) LOAD (string!) behaviour
1) parse the source string into valid REBOL tokens.
2) for each token, determine the datatype and create the corresponding
REBOL value.
(If more than one value is present, create a block! value to contain
them).
NOTE: not all REBOL datetypes can be created in this step.
Those that can is:
* string! "a string" {a string}
* email! [my--email--com]
* integer! 1
* decimal! 1.5
* block! []
* word! my-word
* set-word! my-set-word:
* get-word! :my-get-word
* lit-word! 'my-lit-word
* refinement! /my-refinement
* file! %my-file.r
* issue! #my-issue
* money! $1.50
* paren! ()
* path! my/path/value
Those that can't is:
* list!
* hash!
* function!
* object!
* unset!
* datatype!
* native!
3) traverse the block, and act according to the datatype:
3.1) word!, set-word! and get-word!:
3.1.1) look in system/words to see if the word is present there.
3.1.2) If it is not, create it with a value of type unset!
3.1.3) BIND the word to system/words
3.2) block!, paren!:
3.2.1) Process step 3 for this block (or paren)
3.3) path!
3.3.1) unfinished
4) return the block! or value
b) BIND (block!, word!) behaviour
1) the target context is found using the 'known-word
2) the block is traversed, and each value is checked for one of the
following types
2.1) word!, set-word!, get-word! refinement!, and path!
2.1.1) an internal reference in the value is set to refer to the
target context!
b1) BIND/COPY behaviour
Like b) with these additions:
1a) the block! is copied (including sub-blocks, parens, etc), and all
actions are performed on the copy instead of the original
2.2) block! paren! list! hash!
2.2.1) BIND/COPY is called recursivly on the value
c) DO behaviour
d) MAKE FUNCTION! (aka func) behaviour
e) MAKE OBJECT! behaviour
f) USE behaviour