The SDL functions word_is() and word_get(). These access and make use of 18 internal arrays of token information relative to the active version of POV-Ray(povr). The 18 arrays break down into three sets. Namely. Previous tokens (back to through v3.6) which are out (o prefix); Tokens included in the current code (i prefix); Lastly, tokens which are new (n prefix) compared to the prior major release (v3.8 beta 2). See documentation for more detail on use. The array names are: oOptionNames oFakeByFnctWords oFnNames oOddWords oDirectiveWords oKeyWords iKeyWords iDirectiveWords iOddWords iFnNames iFakeByFnctWords iOptionNames nKeyWords nDirectiveWords nOddWords nFnNames nFakeByFnctWords nOptionNames Any string can be checked against the o & i arrays using word_is("TheString"). The return values will be: -6 ==> former ini file keyword or command line flag. -5 ==> former, lower case, shipped identifier pretending to be inbuilt feature. -4 ==> former inbuilt vm function. -3 ==> pseudo / hidden keyword removed. -2 ==> former Scene Description Language (SDL) directives. -1 ==> former Scene Description Language (SDL) keyword. 0 ==> not now and never a keyword. Good to go. +1 ==> active Scene Description Language (SDL) keyword. +2 ==> active Scene Description Language (SDL) directives. +3 ==> pseudo / hidden keywords active or potentially active on config. +4 ==> inbuilt vm function declared in functions.inc or cfunctions.inc. +5 ==> lower case, shipped identifier pretending to be inbuilt feature. +6 ==> active ini file keyword or command line flag. cooresponding to the string being found as a token in the following array: -6 ==> oOptionNames -5 ==> oFakeByFnctWords -4 ==> oFnNames -3 ==> oOddWords -2 ==> oDirectiveWords -1 ==> oKeyWords 0 ==> +1 ==> iKeyWords +2 ==> iDirectiveWords +3 ==> iOddWords +4 ==> iFnNames +5 ==> iFakeByFnctWords +6 ==> iOptionNames The word_is() function has a back door which allows it to check the size of all 18 internal arrays of tokens. Specifically when any of the array names is prefixed by 0 and passed as a string the word_is() function returns the size of the array. Further, the minimum array size is 1 though some contain a dummy token of "!#". To get the size of the o,i and n KeyWords arrays we use: #debug concat("oKeyWords count --> ",str(word_is("0oKeyWords"),4,0),"\n") #debug concat("iKeyWords count --> ",str(word_is("0iKeyWords"),4,0),"\n") #debug concat("nKeyWords count --> ",str(word_is("0nKeyWords"),4,0),"\n") These will return, for example, something like: oKeyWords count --> 29 iKeyWords count --> 514 nKeyWords count --> 45 Knowing the size we can then, for example, use a for loop to word_get() all the strings. Or we can look at particular ones with: #debug concat("oKeyWords 0 --> ",word_get("0oKeyWords",0),"\n") #debug concat("iKeyWords 99 --> ",word_get("0iKeyWords",99),"\n") #debug concat("nKeyWords 0 --> ",word_get("0nKeyWords",0),"\n") These will return, for example, something like: oKeyWords 0 --> agate_turb iKeyWords 99 --> cubic_spline nKeyWords 0 --> amplify -------------------------------------------- With respect to testing any particular string it's expected one of the three following will be the word_is() forms most used. #declare MyStr = "lockandkey" #if (word_is(MyStr)=0) #debug concat("No usage conflicts for '",MyStr,"'.\n") #end //--- or #if (word_is(MyStr)!=0) #debug concat("Usage conflicts exist for '",MyStr,"'.\n") #end //--- or #if (word_is(MyStr)>0) #debug concat("'",MyStr,"' is a part of this POV-Ray version.\n") #end -------------------------------------------- The ability to access all the tokens with word_get will hopefully provide strings that can act as an index into deeper, more complete, documentation. -------------------------------------------- There are thoughts toward some near extensions. Perhaps three pattern arrays in all-patterns, normal-perturbation-patterns and scalar-value-patterns. Today, it's sometimes easy to lose track of there being two ripple pattern implementations for example. --------------------------------------------