Sunanda — 27-Sep-2016/4:31:34-7:00
I am trying to write a run-anywhere script that identifies what version of a Rebol-like language it is running under.
This is what I've got so far:
The code below returns the following strings with the versions of the interpreters I used:
R2/view: 'REBOL/View 2.7.6.3.1 View 14-Mar-2008'
R2/view+r2-forward: 'REBOL/View 2.7.6.3.1 R2F View 14-Mar-2008'
r2/core: 'REBOL/Core 2.7.8.3.1 Core 1-Jan-2011'
r2/core: 'REBOL/Core 2.5.0.3.1 23-Mar-2001' ;; old version that pre-dates 'ATTEMPT
Red: 'Red 0.6.1 7-Jul-2016 Windows'
R3: 'REBOL 3.0 core 2.100.67.3.1 6-Jul-2009'
I'd be fascinated to see better code from someone who really knows what they are doing.
Bonus points for:
-- no global variable
-- also work with Boron, World and Topaz :)
If you give it a try, you'll learn a lot about niggling little differences -- and go google-eyed at having so many interpreter windows open.
Sunanda
***
info-string: none ;; needs (?) to be a global variable
get-env-info: func [
;; ============================
/local
about-func
sigs
][
;; Work with old CORE that pre-dates 'ATTEMPT
if not value? 'attempt [attempt: func [x][error? try [x]]]
;; Exfiltrate the first two words from 'ABOUT:
info-string: copy ''
about-func: mold get in system/words 'about
replace/all about-func 'print' {append info-string ' ' append info-string form reduce}
about-func: first reduce load/all about-func
about-func
replace/all info-string '*' ' '
trim/lines info-string
attempt [info-string: split info-string ' ']
if string? info-string [info-string: parse info-string ' ']
sigs: copy/part info-string 2
;; Grab what we can from the various SYSTEM product/version fields:
attempt [if function? get 'latin1? [append sigs 'R2F']]
attempt [rebcode! rebcode? rebcode [] []
append sigs 'REBCODE'
]
attempt [append sigs form system/product]
attempt [append sigs form system/version]
if error? try [append sigs form system/build/date][
attempt [append sigs form first split form system/build '/']
]
attempt [append sigs form system/platform]
;; Remove any duplication
sigs: unique sigs
return form sigs
]
print get-env-info
Scureuil — 10-Oct-2016/10:17:33-7:00
{Hi! This should work with most REBOL and Red versions (tested from View 0.99/Core 2.3 to View/Core 2.7.8, Base and Face too, with some REBOL 3 build).
World crashes with that code (append sigs -> core dump) but the code should be correct.
Topaz has an usable structure (system/name and system/version) but isn't stable enough for now to manipulate strings, and Boron doesn't expose the version at the language level.
They should be any global var or leak (like the redefinition of 'attempt).}
get-env-info: func [
;; ============================
/local
info-string
date
do-try
about-func
sigs
][
;; Work with old CORE that pre-dates 'ATTEMPT
do-try: func [x][error? try x]
sigs: copy []
;; REBOL/Core/View/Pro/Command & Red, exfiltrate the first two words from 'ABOUT:
either all [value? 'about function? get 'about][
info-string: copy ""
;; Build a modified 'ABOUT
about-func: mold get 'about
replace/all about-func "print" {append info-string " " append info-string form reduce}
;; LOAD/ALL isn't available with old CORE versions
if error? try [about-func: load/all about-func][about-func: load about-func]
;; Bind the modified 'ABOUT to this function context
bind third about-func 'info-string
about-func: first reduce about-func
about-func
;; Process info-string
replace/all info-string "*" " "
trim/lines info-string
if error? try [info-string: split info-string " "][info-string: parse info-string " "]
-sigs: copy/part info-string 2
][
;; no 'ABOUT: REBOL/Base or /Face (View) & World
either all [value? 'about none? get 'about][
;; REBOL/Base or Face (View)
append sigs join "REBOL/" system/product
append sigs system/version
][
if find [Cortex] system/product [
append sigs join "World/" system/product
append sigs system/version/version
]
]
]
;; Specific capabilities
;; R2-Forward?
do-try [if function? get 'latin1? [append sigs "R2F"]]
;; Rebcode?
do-try [rebcode! rebcode? rebcode [] []
append sigs "REBCODE"
]
;; Grab what we can from the various SYSTEM product/version fields:
;; Product & Version
all [
;; World product & version
do-try [append sigs join "(" [system/product " " system/version/version ")"]]
;; REBOL product & version
do-try [append sigs join "(" [system/product " " system/version ")"]]
;; Red version
do-try [append sigs append copy "(" reduce [system/version ")"]]
]
;; Internal version
all [
;; World variation
do-try [append sigs join "(Variation " [system/version/variation ")"]]
;; REBOL core version
do-try [append sigs join "(Core " [system/core ")"]]
]
;; Build date
all [
;; REBOL
do-try [append sigs form system/build/date]
;; World
do-try [
date: parse/all form system/build " "
append sigs form first load join date/2 ["-" date/1 "-" date/3]
]
;; Red build date
do-try [append sigs first split form system/build "/"]
]
;; Platform
all [
;; World
do-try [append sigs form system/version/platform]
;; REBOL & Red
do-try [append sigs form system/platform]
]
form sigs
]
print get-env-info
Sunanda — 11-Oct-2016/2:29:48-7:00
Thanks for that!
Looks like you had a lot of fun, and got a lot further than I did in exploring Rebol variants.
Give me a day or so to have a play, and I'll get back with any comments.
I had to tweak my version (or the code that generates it - can't remember off-hand) to work with Atronix's R3 - they remap the system object. Not sure if your version needs a similar tweak.
R3 from Atronix:
http://www.atronixengineering.com/downloads/
Sunanda — 18-Oct-2016/12:25:38-7:00
Sorry for taking too long in getting back on this - been travelling.
Your improvements work very smoothly in R2, R3, red and R3-atronix. World isn't working at all on my machine (nothing to do with this script -it crashes on start-up) so can't try that.
Thanks again!