Mailing List Archive: 49091 messages
  • Home
  • Script library
  • AltME Archive
  • Mailing list
  • Articles Index
  • Site search

[REBOL] Re: When is none not none?

From: lmecir::mbox::vol::cz at: 30-Jul-2007 12:01

Maxim Olivier-Adlhoch napsal(a):
> Hi Jonathan, > > Welcome to Rebol, hope you have a blast. > > what you are experiencing is a subtlety of static run-time loading and > binding.
Binding is slightly off-topic in this case, "static run-time" is a contradictio in adjecto.
> some functions evaluate values and others do not. in this case, > compose loads a block and leaves everything within AS-IS.
Wrong. The interpreter loads the block before evaluating the expression. Compose does not. (Do you want a proof?)
> so since the > interpreter has to put the none somewhere as something, it stays a word, > gets bound to the global definition of none, but isn't evaluated, so its not > yet a none *value*. > > I have had the same (I thought "strange", at the time) problems with the > true and false values, which have no lexical form which allows them to be > explicitly cast as a datatype. >
Wrong. Here are the lexical forms of some Rebol values popularly thought not having lexical form: values: [#[unset!] #[none] #[false] #[true]] As opposed to that, when writing: words: [unset! none false true] the Words block will just contain words.
> since many of us have lived through this exact issue, I can already warn you > about loading data files. > nested blocks, do not recursively get evaluated > by load, so you can end up with this same problem when saving out blocks and > objects and stuff. >
Confusing. Nested blocks are processed by Load in exactly the same way it processes the top-level block. The Load function does just what it is supposed to. Example: code: load "none [true false]" produces a block containing one word and a nested block containing two words. This means, that Load evaluates neither the nested nor the top-level block.
> a good way to identify this is to use the mold/all function which > *serializes* the data. in fact, I have replaced probe in my setup so that > it molds/all in order to clearly identify datatypes.
This is my Probe version: probe: func [ {Prints molded Value. Returns Value.} value [any-type!] ] [ print case [ not value? 'value ["#[unset!]"] error? :value [rejoin ["#[error!" mold/all copy skip second disarm :value 2 "]"]] true [mold/all :value] ] return get/any 'value ] example: probe compose [none #[none] (none) false #[false] (false) true #[true] (true)] -L