Introspection: Difference between revisions
Content added Content deleted
Thundergnat (talk | contribs) m (syntax highlighting fixup automation) |
|||
Line 12: | Line 12: | ||
=={{header|Ada}}== |
=={{header|Ada}}== |
||
Ada doesn't allow you to ask about compiler versions, but you can query specific parameters of the target, such as the range of the standard integer type, or the precision of the standard floating point type: |
Ada doesn't allow you to ask about compiler versions, but you can query specific parameters of the target, such as the range of the standard integer type, or the precision of the standard floating point type: |
||
< |
<syntaxhighlight lang="ada">with Ada.Integer_Text_IO, Ada.Text_IO; |
||
procedure Introspection is |
procedure Introspection is |
||
use Ada.Integer_Text_IO, Ada.Text_IO; |
use Ada.Integer_Text_IO, Ada.Text_IO; |
||
Line 25: | Line 25: | ||
Put (Float'Digits); |
Put (Float'Digits); |
||
New_Line; |
New_Line; |
||
end Introspection;</ |
end Introspection;</syntaxhighlight> |
||
All Ada compilers recognize obsolete parts of a programs and either automatically recompile them or fail to link the program. |
All Ada compilers recognize obsolete parts of a programs and either automatically recompile them or fail to link the program. |
||
=={{header|Aikido}}== |
=={{header|Aikido}}== |
||
The version of the Aikido interpreter is in the global scope variable <em>version</em>. AIkido doesn't have <code>abs</code> but it does have <code>fabs</code>. Getting the variables in main involves getting their names and then evaluating them as an expression in order to retrieve their type. |
The version of the Aikido interpreter is in the global scope variable <em>version</em>. AIkido doesn't have <code>abs</code> but it does have <code>fabs</code>. Getting the variables in main involves getting their names and then evaluating them as an expression in order to retrieve their type. |
||
< |
<syntaxhighlight lang="aikido"> |
||
import math |
import math |
||
Line 83: | Line 83: | ||
</syntaxhighlight> |
|||
</lang> |
|||
Here is the result: |
Here is the result: |
||
fabs(bloop) is 1.4 |
fabs(bloop) is 1.4 |
||
Line 101: | Line 101: | ||
{{works with|ALGOL 68G|Any - tested with release [http://sourceforge.net/projects/algol68/files/algol68g/algol68g-1.18.0/algol68g-1.18.0-9h.tiny.el5.centos.fc11.i386.rpm/download 1.18.0-9h.tiny]}} |
{{works with|ALGOL 68G|Any - tested with release [http://sourceforge.net/projects/algol68/files/algol68g/algol68g-1.18.0/algol68g-1.18.0-9h.tiny.el5.centos.fc11.i386.rpm/download 1.18.0-9h.tiny]}} |
||
{{works with|ELLA ALGOL 68|Any (with appropriate job cards) - tested with release 1.8.8d.fc9.i386}} |
{{works with|ELLA ALGOL 68|Any (with appropriate job cards) - tested with release 1.8.8d.fc9.i386}} |
||
< |
<syntaxhighlight lang="algol68">BEGIN |
||
print (("Integer range: ", -max int, " .. ", max int, new line)); |
print (("Integer range: ", -max int, " .. ", max int, new line)); |
||
print (("Integer digits: ", int width, new line)); |
print (("Integer digits: ", int width, new line)); |
||
print (("Float range: ", -max real, " .. ", max real, new line)); |
print (("Float range: ", -max real, " .. ", max real, new line)); |
||
print (("Float digits: ", real width, new line)) |
print (("Float digits: ", real width, new line)) |
||
END</ |
END</syntaxhighlight> |
||
{{out}} |
{{out}} |
||
<pre> |
<pre> |
||
Line 121: | Line 121: | ||
{{works with|ALGOL 68G|Any - tested with release [http://sourceforge.net/projects/algol68/files/algol68g/algol68g-1.18.0/algol68g-1.18.0-9h.tiny.el5.centos.fc11.i386.rpm/download 1.18.0-9h.tiny]}} |
{{works with|ALGOL 68G|Any - tested with release [http://sourceforge.net/projects/algol68/files/algol68g/algol68g-1.18.0/algol68g-1.18.0-9h.tiny.el5.centos.fc11.i386.rpm/download 1.18.0-9h.tiny]}} |
||
{{wont work with|ELLA ALGOL 68|Any (with appropriate job cards) - MODEs BYTE, SEMA, FORMAT etc are not available in ELLA Algol68RS}} |
{{wont work with|ELLA ALGOL 68|Any (with appropriate job cards) - MODEs BYTE, SEMA, FORMAT etc are not available in ELLA Algol68RS}} |
||
< |
<syntaxhighlight lang="algol68">BEGIN |
||
MODE SSMODES = UNION(SHORT SHORT BITS, SHORT SHORT BYTES, #SHORT SHORT CHAR,# |
MODE SSMODES = UNION(SHORT SHORT BITS, SHORT SHORT BYTES, #SHORT SHORT CHAR,# |
||
SHORT SHORT INT, SHORT SHORT REAL, SHORT SHORT COMPL); |
SHORT SHORT INT, SHORT SHORT REAL, SHORT SHORT COMPL); |
||
Line 170: | Line 170: | ||
sep := ", " |
sep := ", " |
||
OD |
OD |
||
END</ |
END</syntaxhighlight> |
||
{{out}} |
{{out}} |
||
<pre> |
<pre> |
||
Line 184: | Line 184: | ||
{{works with|ALGOL 68G|Any - tested with release [http://sourceforge.net/projects/algol68/files/algol68g/algol68g-2.3.3 algol68g-2.3.3].}} |
{{works with|ALGOL 68G|Any - tested with release [http://sourceforge.net/projects/algol68/files/algol68g/algol68g-2.3.3 algol68g-2.3.3].}} |
||
{{wont work with|ELLA ALGOL 68|Any (with appropriate job cards) - tested with release [http://sourceforge.net/projects/algol68/files/algol68toc/algol68toc-1.8.8d/algol68toc-1.8-8d.fc9.i386.rpm/download 1.8-8d] - due to extensive use of '''format'''[ted] ''transput''.}} |
{{wont work with|ELLA ALGOL 68|Any (with appropriate job cards) - tested with release [http://sourceforge.net/projects/algol68/files/algol68toc/algol68toc-1.8.8d/algol68toc-1.8-8d.fc9.i386.rpm/download 1.8-8d] - due to extensive use of '''format'''[ted] ''transput''.}} |
||
'''File: Typeof_operator.a68'''< |
'''File: Typeof_operator.a68'''<syntaxhighlight lang="algol68">#!/usr/local/bin/a68g --script # |
||
OP TYPEOF = (INT skip)STRING: "INT"; |
OP TYPEOF = (INT skip)STRING: "INT"; |
||
Line 191: | Line 191: | ||
OP TYPEOF = (COMPL skip)STRING: "COMPL"; |
OP TYPEOF = (COMPL skip)STRING: "COMPL"; |
||
printf(($g" "$,TYPEOF 1, TYPEOF "x", TYPEOF pi, TYPEOF (0 I 1 ), $l$))</ |
printf(($g" "$,TYPEOF 1, TYPEOF "x", TYPEOF pi, TYPEOF (0 I 1 ), $l$))</syntaxhighlight> |
||
{{out}} |
{{out}} |
||
<pre> |
<pre> |
||
Line 203: | Line 203: | ||
{{works with|ELLA ALGOL 68|Any (with appropriate job cards)}} |
{{works with|ELLA ALGOL 68|Any (with appropriate job cards)}} |
||
'''File: Introspection_array_bounds.a68'''< |
'''File: Introspection_array_bounds.a68'''<syntaxhighlight lang="algol68">#!/usr/local/bin/a68g --script # |
||
[]INT x = (5,4,3,2,1); |
[]INT x = (5,4,3,2,1); |
||
print(("x =", x, new line)); |
print(("x =", x, new line)); |
||
print(("LWB x =", LWB x, ", UPB x = ",UPB x, new line))</ |
print(("LWB x =", LWB x, ", UPB x = ",UPB x, new line))</syntaxhighlight> |
||
{{out}} |
{{out}} |
||
<pre> |
<pre> |
||
Line 217: | Line 217: | ||
=={{header|Arturo}}== |
=={{header|Arturo}}== |
||
< |
<syntaxhighlight lang="rebol">if not? sys\version > 0.9.0 -> panic "version too old!" |
||
bloop: 3 - 5 |
bloop: 3 - 5 |
||
Line 230: | Line 230: | ||
sum map select keys symbols 'sym -> integer? var sym |
sum map select keys symbols 'sym -> integer? var sym |
||
'sym -> var sym |
'sym -> var sym |
||
]</ |
]</syntaxhighlight> |
||
{{out}} |
{{out}} |
||
Line 238: | Line 238: | ||
=={{header|AutoHotkey}}== |
=={{header|AutoHotkey}}== |
||
< |
<syntaxhighlight lang="autohotkey">if (A_AhkVersion < "1.0.48.03") |
||
{ |
{ |
||
MsgBox % "you are using" . A_AhkVersion . "`nplease upgrade to" . "1.0.48.03" |
MsgBox % "you are using" . A_AhkVersion . "`nplease upgrade to" . "1.0.48.03" |
||
Line 247: | Line 247: | ||
if IsFunc("abs") |
if IsFunc("abs") |
||
MsgBox % abs(bloop) |
MsgBox % abs(bloop) |
||
return</ |
return</syntaxhighlight> |
||
=={{header|AWK}}== |
=={{header|AWK}}== |
||
{{works with|gawk|4.1.0}} PROCINFO is a gawk-extension |
{{works with|gawk|4.1.0}} PROCINFO is a gawk-extension |
||
<syntaxhighlight lang="awk"> |
|||
<lang AWK> |
|||
# syntax: GAWK -f INTROSPECTION.AWK |
# syntax: GAWK -f INTROSPECTION.AWK |
||
BEGIN { |
BEGIN { |
||
Line 266: | Line 266: | ||
} |
} |
||
function abs(x) { if (x >= 0) { return x } else { return -x } } |
function abs(x) { if (x >= 0) { return x } else { return -x } } |
||
</syntaxhighlight> |
|||
</lang> |
|||
{{out}} |
{{out}} |
||
<pre> |
<pre> |
||
Line 275: | Line 275: | ||
=={{header|BBC BASIC}}== |
=={{header|BBC BASIC}}== |
||
{{works with|BBC BASIC for Windows}} |
{{works with|BBC BASIC for Windows}} |
||
< |
<syntaxhighlight lang="bbcbasic"> IF VAL(FNversion) < 5.94 THEN PRINT "Version is too old" : END |
||
ON ERROR LOCAL PRINT "Variable 'bloop' doesn't exist" : END |
ON ERROR LOCAL PRINT "Variable 'bloop' doesn't exist" : END |
||
Line 297: | Line 297: | ||
INPUT #F%,V$ |
INPUT #F%,V$ |
||
CLOSE #F% |
CLOSE #F% |
||
= RIGHT$(V$,5)</ |
= RIGHT$(V$,5)</syntaxhighlight> |
||
=={{header|C}}== |
=={{header|C}}== |
||
Line 305: | Line 305: | ||
{{works with|C|94 and later}} |
{{works with|C|94 and later}} |
||
< |
<syntaxhighlight lang="c">#if !defined(__STDC_VERSION__) || __STDC_VERSION__ < 199901L |
||
#pragma error("C compiler must adhere to at least C99 for the following code.") |
#pragma error("C compiler must adhere to at least C99 for the following code.") |
||
#else |
#else |
||
/* rest of file */ |
/* rest of file */ |
||
#endif</ |
#endif</syntaxhighlight> |
||
However, there is no facility in C for checking whether individual variables |
However, there is no facility in C for checking whether individual variables |
||
Line 319: | Line 319: | ||
=={{header|C sharp|C#}}== |
=={{header|C sharp|C#}}== |
||
There has to be some caveats made with C#. There are no truly "global" variables - just publicly exported ones from individual classes/types. I chose to make a couple of public static variables in my program's class. Also, the "version" of the compiler is difficult to impossible to get at. There are no predefined compiler constants that can be compared against as in C/C++ but then again, it's hardly the thing that counts in C#. What really counts is the version of .NET and the framework you're working with since that determines what C++ features you can use and the various calls that can be made. Consequently, I check the .NET version to make sure it's past 4.0 and exit if not. |
There has to be some caveats made with C#. There are no truly "global" variables - just publicly exported ones from individual classes/types. I chose to make a couple of public static variables in my program's class. Also, the "version" of the compiler is difficult to impossible to get at. There are no predefined compiler constants that can be compared against as in C/C++ but then again, it's hardly the thing that counts in C#. What really counts is the version of .NET and the framework you're working with since that determines what C++ features you can use and the various calls that can be made. Consequently, I check the .NET version to make sure it's past 4.0 and exit if not. |
||
< |
<syntaxhighlight lang="csharp">using System; |
||
using System.Reflection; |
using System.Reflection; |
||
Line 400: | Line 400: | ||
} |
} |
||
} |
} |
||
</syntaxhighlight> |
|||
</lang> |
|||
{{out}} |
{{out}} |
||
Line 409: | Line 409: | ||
Identifying the version of the C++ standard used by the compiler in C++ is syntactically very similar to the way of checking the C standard version (also seen on this page). |
Identifying the version of the C++ standard used by the compiler in C++ is syntactically very similar to the way of checking the C standard version (also seen on this page). |
||
< |
<syntaxhighlight lang="cpp">#if !defined(__cplusplus) || __cplusplus < 201103L |
||
#pragma error("The following code requires at least C++11.") |
#pragma error("The following code requires at least C++11.") |
||
#else |
#else |
||
// ... |
// ... |
||
#endif</ |
#endif</syntaxhighlight> |
||
As in C, the introspective capabilities of C++ are very limited. |
As in C, the introspective capabilities of C++ are very limited. |
||
Line 419: | Line 419: | ||
=={{header|Clojure}}== |
=={{header|Clojure}}== |
||
Partial answer... |
Partial answer... |
||
< |
<syntaxhighlight lang="clojure"> |
||
; check Java version |
; check Java version |
||
(let [version (Double/parseDouble (re-find #"\d*\.\d*" (System/getProperty "java.version")))] |
(let [version (Double/parseDouble (re-find #"\d*\.\d*" (System/getProperty "java.version")))] |
||
Line 431: | Line 431: | ||
(println "Version ok") |
(println "Version ok") |
||
(throw (Error. "Bad version")))) |
(throw (Error. "Bad version")))) |
||
</syntaxhighlight> |
|||
</lang> |
|||
=={{header|Common Lisp}}== |
=={{header|Common Lisp}}== |
||
< |
<syntaxhighlight lang="lisp">(let* ((ver (lisp-implementation-version)) |
||
(major (parse-integer ver :start 0 :end (position #\. ver)))) |
(major (parse-integer ver :start 0 :end (position #\. ver)))) |
||
#+lispworks (assert (>= 5 major) () "Requires Lispworks version 5 or above") |
#+lispworks (assert (>= 5 major) () "Requires Lispworks version 5 or above") |
||
#+clisp (assert (>= 2 major) () "Requires CLISP 2.n") |
#+clisp (assert (>= 2 major) () "Requires CLISP 2.n") |
||
)</ |
)</syntaxhighlight> |
||
< |
<syntaxhighlight lang="lisp">(defvar bloop -4) |
||
(if (and (fboundp 'abs) |
(if (and (fboundp 'abs) |
||
(boundp 'bloop)) |
(boundp 'bloop)) |
||
(format t "~d~%" (abs bloop)))</ |
(format t "~d~%" (abs bloop)))</syntaxhighlight> |
||
The ''list-all-packages'' and ''do-symbols'' forms enable a lisp program to examine all symbols and these can be tested to identify integer variables. |
The ''list-all-packages'' and ''do-symbols'' forms enable a lisp program to examine all symbols and these can be tested to identify integer variables. |
||
< |
<syntaxhighlight lang="lisp">(let ((sum 0) |
||
(ints '())) |
(ints '())) |
||
(loop for pkg in (list-all-packages) |
(loop for pkg in (list-all-packages) |
||
Line 453: | Line 453: | ||
(incf sum (symbol-value s))))) |
(incf sum (symbol-value s))))) |
||
(format t "there are ~d integer variables adding up to ~d~%" |
(format t "there are ~d integer variables adding up to ~d~%" |
||
(length ints) sum))</ |
(length ints) sum))</syntaxhighlight> |
||
=={{header|D}}== |
=={{header|D}}== |
||
With extra credit. |
With extra credit. |
||
< |
<syntaxhighlight lang="d">// Some module-level variables (D doesn't have a global scope). |
||
immutable x = 3, y = 100, z = 3_000; |
immutable x = 3, y = 100, z = 3_000; |
||
short w = 1; // Not an int, must be ignored. |
short w = 1; // Not an int, must be ignored. |
||
Line 488: | Line 488: | ||
tot += mixin("." ~ name); |
tot += mixin("." ~ name); |
||
writeln("Total of the module-level ints (could overflow): ", tot); |
writeln("Total of the module-level ints (could overflow): ", tot); |
||
}</ |
}</syntaxhighlight> |
||
{{out}} |
{{out}} |
||
<pre>The expression is compilable. |
<pre>The expression is compilable. |
||
Line 495: | Line 495: | ||
=={{header|E}}== |
=={{header|E}}== |
||
Version: |
Version: |
||
< |
<syntaxhighlight lang="e">def version := interp.getProps()["e.version"]</syntaxhighlight> |
||
(There is no built-in version comparison, and the author of this example assumes that implementing a version comparison algorithm isn't the point of this task.) |
(There is no built-in version comparison, and the author of this example assumes that implementing a version comparison algorithm isn't the point of this task.) |
||
Existence: |
Existence: |
||
< |
<syntaxhighlight lang="e">escape fail { |
||
def &x := meta.getState().fetch("&bloop", fn { fail("no bloop") }) |
def &x := meta.getState().fetch("&bloop", fn { fail("no bloop") }) |
||
if (!x.__respondsTo("abs", 0)) { fail("no abs") } |
if (!x.__respondsTo("abs", 0)) { fail("no abs") } |
||
x.abs() |
x.abs() |
||
}</ |
}</syntaxhighlight> |
||
This will return either bloop.abs(), "no bloop", or "no abs". |
This will return either bloop.abs(), "no bloop", or "no abs". |
||
Sum of integers: |
Sum of integers: |
||
<syntaxhighlight lang="e">{ |
|||
<lang e>{ |
|||
var sum := 0 |
var sum := 0 |
||
for &x in interp.getTopScope() { sum += try { x :int } catch _ { 0 } } |
for &x in interp.getTopScope() { sum += try { x :int } catch _ { 0 } } |
||
sum |
sum |
||
}</ |
}</syntaxhighlight> |
||
<code>try</code> rather than an ordinary type check is used because in general a slot might be broken; this way we skip over all read failures as well as non-integers. The block around the code ensures that the sum variable itself will not be involved in the computation. |
<code>try</code> rather than an ordinary type check is used because in general a slot might be broken; this way we skip over all read failures as well as non-integers. The block around the code ensures that the sum variable itself will not be involved in the computation. |
||
=={{header|EchoLisp}}== |
=={{header|EchoLisp}}== |
||
< |
<syntaxhighlight lang="scheme"> |
||
(version) |
(version) |
||
→ EchoLisp - 2.50.3 |
→ EchoLisp - 2.50.3 |
||
Line 546: | Line 546: | ||
</syntaxhighlight> |
|||
</lang> |
|||
=={{header|Erlang}}== |
=={{header|Erlang}}== |
||
Erlang does not have global variables so I look for a function bloop/0 that returns an integer. |
Erlang does not have global variables so I look for a function bloop/0 that returns an integer. |
||
Moreover, I sum the available modules, instead of the unavailable global integers. |
Moreover, I sum the available modules, instead of the unavailable global integers. |
||
<syntaxhighlight lang="erlang"> |
|||
<lang Erlang> |
|||
-module( introspection ). |
-module( introspection ). |
||
Line 572: | Line 572: | ||
exit_if_too_old( Release ) when Release < "R13A" -> erlang:exit( too_old_release ); |
exit_if_too_old( Release ) when Release < "R13A" -> erlang:exit( too_old_release ); |
||
exit_if_too_old( _Release ) -> ok. |
exit_if_too_old( _Release ) -> ok. |
||
</syntaxhighlight> |
|||
</lang> |
|||
{{out}} |
{{out}} |
||
<pre> |
<pre> |
||
Line 582: | Line 582: | ||
=={{header|Factor}}== |
=={{header|Factor}}== |
||
Check for build number and execute a quotation if it's too old. (There are no such things as versions for Factor yet.) |
Check for build number and execute a quotation if it's too old. (There are no such things as versions for Factor yet.) |
||
< |
<syntaxhighlight lang="factor">: if-older ( n true false -- ) |
||
[ build > ] 2dip if ; inline |
[ build > ] 2dip if ; inline |
||
Line 590: | Line 590: | ||
[ [ ] ] dip if-older ; inline |
[ [ ] ] dip if-older ; inline |
||
900 [ "Your version of Factor is too old." print 1 exit ] when-older</ |
900 [ "Your version of Factor is too old." print 1 exit ] when-older</syntaxhighlight> |
||
It is possible to test if a function or a variable exists (<code>search</code>), but that shouldn't be used outside of parsing. |
It is possible to test if a function or a variable exists (<code>search</code>), but that shouldn't be used outside of parsing. |
||
< |
<syntaxhighlight lang="factor">"bloop" search [ |
||
get [ |
get [ |
||
"abs" search [ execute( n -- n' ) ] when* |
"abs" search [ execute( n -- n' ) ] when* |
||
] [ 0 ] if* |
] [ 0 ] if* |
||
] [ 0 ] if*</ |
] [ 0 ] if*</syntaxhighlight> |
||
On the other hand, it is possible to search the global namespace for integer variables: |
On the other hand, it is possible to search the global namespace for integer variables: |
||
< |
<syntaxhighlight lang="factor">USING: assocs formatting kernel math namespaces ; |
||
0 0 |
0 0 |
||
Line 606: | Line 606: | ||
nip dup integer? [ + [ 1 + ] dip ] [ drop ] if |
nip dup integer? [ + [ 1 + ] dip ] [ drop ] if |
||
] assoc-each |
] assoc-each |
||
"There are %d integer variables, the sum is %d\n" printf</ |
"There are %d integer variables, the sum is %d\n" printf</syntaxhighlight> |
||
=={{header|Forth}}== |
=={{header|Forth}}== |
||
Standard Forth doesn't necessarily provide for version numbers, but you can query information about the environment at interpretation time: |
Standard Forth doesn't necessarily provide for version numbers, but you can query information about the environment at interpretation time: |
||
< |
<syntaxhighlight lang="forth">s" MAX-U" environment? [IF] |
||
0xffffffff <> [IF] .( Requires 32 bits! ) bye [THEN] |
0xffffffff <> [IF] .( Requires 32 bits! ) bye [THEN] |
||
[THEN] |
[THEN] |
||
Line 618: | Line 618: | ||
[defined] abs [if] |
[defined] abs [if] |
||
bloop @ abs |
bloop @ abs |
||
[then] [then]</ |
[then] [then]</syntaxhighlight> |
||
[[4tH]] is able to fulfill all requirements. Note that since only one variable has been declared, the sum of all integer (user)variables is consequently the value of that variable. |
[[4tH]] is able to fulfill all requirements. Note that since only one variable has been declared, the sum of all integer (user)variables is consequently the value of that variable. |
||
{{Works with|4tH|3.62.2}} |
{{Works with|4tH|3.62.2}} |
||
< |
<syntaxhighlight lang="forth">[hex] 362 [decimal] 4TH# - [if] [abort] [then] |
||
-32 value bloop |
-32 value bloop |
||
Line 631: | Line 631: | ||
0 last cell+ first over over - .( User variables: ) . |
0 last cell+ first over over - .( User variables: ) . |
||
?do i @ + loop .( Sum: ) . cr</ |
?do i @ + loop .( Sum: ) . cr</syntaxhighlight> |
||
{{out}} |
{{out}} |
||
<pre> |
<pre> |
||
Line 640: | Line 640: | ||
=={{header|FreeBASIC}}== |
=={{header|FreeBASIC}}== |
||
Version 1: |
Version 1: |
||
< |
<syntaxhighlight lang="freebasic">' FB 1.05.0 Win64 |
||
#If __FB_VERSION__ < "1.06.0" |
#If __FB_VERSION__ < "1.06.0" |
||
Line 656: | Line 656: | ||
Print "bloop does not exist" |
Print "bloop does not exist" |
||
#EndIf |
#EndIf |
||
Sleep</ |
Sleep</syntaxhighlight> |
||
{{out}} |
{{out}} |
||
<pre>introspection.bas(4) error: Compiler version is too old - needs to be 1.06.0 or later</pre> |
<pre>introspection.bas(4) error: Compiler version is too old - needs to be 1.06.0 or later</pre> |
||
Version 2: |
Version 2: |
||
< |
<syntaxhighlight lang="freebasic">' FB 1.05.0 Win64 |
||
#If __FB_VERSION__ < "1.05.0" '' version 1.05.0 is now OK |
#If __FB_VERSION__ < "1.05.0" '' version 1.05.0 is now OK |
||
Line 676: | Line 676: | ||
Print "bloop does not exist" |
Print "bloop does not exist" |
||
#EndIf |
#EndIf |
||
Sleep</ |
Sleep</syntaxhighlight> |
||
{{out}} |
{{out}} |
||
<pre>Abs(bloop) = 15</pre> |
<pre>Abs(bloop) = 15</pre> |
||
Version 3 (version code omitted for brevity): |
Version 3 (version code omitted for brevity): |
||
< |
<syntaxhighlight lang="freebasic">#Undef Abs '' undefine Abs keyword |
||
Dim bloop As Integer = -15 |
Dim bloop As Integer = -15 |
||
#IfDef bloop |
#IfDef bloop |
||
Line 691: | Line 691: | ||
Print "bloop does not exist" |
Print "bloop does not exist" |
||
#EndIf |
#EndIf |
||
Sleep</ |
Sleep</syntaxhighlight> |
||
{{out}} |
{{out}} |
||
<pre>Abs is not available</pre> |
<pre>Abs is not available</pre> |
||
Version 4 (version code omitted for brevity): |
Version 4 (version code omitted for brevity): |
||
< |
<syntaxhighlight lang="freebasic">#Undef Abs '' undefine Abs keyword |
||
'Dim bloop As Integer = -15 '' bloop declaration commented out |
'Dim bloop As Integer = -15 '' bloop declaration commented out |
||
#IfDef bloop |
#IfDef bloop |
||
Line 706: | Line 706: | ||
Print "bloop does not exist" |
Print "bloop does not exist" |
||
#EndIf |
#EndIf |
||
Sleep</ |
Sleep</syntaxhighlight> |
||
{{out}} |
{{out}} |
||
<pre>bloop does not exist</pre> |
<pre>bloop does not exist</pre> |
||
=={{header|GAP}}== |
=={{header|GAP}}== |
||
< |
<syntaxhighlight lang="gap"># Apply a function to a value, given variable names for both function and value |
||
CheckEval := function(fun, val) |
CheckEval := function(fun, val) |
||
local f, x; |
local f, x; |
||
Line 740: | Line 740: | ||
od; |
od; |
||
return s; |
return s; |
||
end;</ |
end;</syntaxhighlight> |
||
=={{header|Go}}== |
=={{header|Go}}== |
||
Task variance: "exit if it is too old" is not done here. Go version strings do not present an easily interpreted chronology. This version of the program simply prints the version string. |
Task variance: "exit if it is too old" is not done here. Go version strings do not present an easily interpreted chronology. This version of the program simply prints the version string. |
||
< |
<syntaxhighlight lang="go">package main |
||
import ( |
import ( |
||
Line 802: | Line 802: | ||
fmt.Println(" abs(bloop): ", math.Abs(bloop)) |
fmt.Println(" abs(bloop): ", math.Abs(bloop)) |
||
} |
} |
||
}</ |
}</syntaxhighlight> |
||
{{out}} |
{{out}} |
||
<pre> |
<pre> |
||
Line 817: | Line 817: | ||
=={{header|Haskell}}== |
=={{header|Haskell}}== |
||
< |
<syntaxhighlight lang="haskell">import Data.Version |
||
import Control.Monad |
import Control.Monad |
||
import System.Info |
import System.Info |
||
Line 824: | Line 824: | ||
main = when (compilerName == "ghc" && compilerVersion < minGHCVersion) $ |
main = when (compilerName == "ghc" && compilerVersion < minGHCVersion) $ |
||
fail "Compiler too old."</ |
fail "Compiler too old."</syntaxhighlight> |
||
No means exists of checking whether a variable exists at runtime. The set of variables that exist in any given scope is fixed at compile-time. |
No means exists of checking whether a variable exists at runtime. The set of variables that exist in any given scope is fixed at compile-time. |
||
Line 830: | Line 830: | ||
=={{header|Icon}} and {{header|Unicon}}== |
=={{header|Icon}} and {{header|Unicon}}== |
||
< |
<syntaxhighlight lang="unicon">global bloop |
||
procedure main(A) |
procedure main(A) |
||
Line 847: | Line 847: | ||
return (major < maj) | ((major = maj) & (minor < min)) |
return (major < maj) | ((major = maj) & (minor < min)) |
||
} |
} |
||
end</ |
end</syntaxhighlight> |
||
Sample run: |
Sample run: |
||
<pre>->introspect |
<pre>->introspect |
||
Line 856: | Line 856: | ||
=={{header|Inform 7}}== |
=={{header|Inform 7}}== |
||
Inform 7 doesn't have built-in functionality for checking the runtime version number, but the version number is available and can be read by including a snippet of Inform 6 code. The address and format of the version number vary according to the virtual machine being targeted. |
Inform 7 doesn't have built-in functionality for checking the runtime version number, but the version number is available and can be read by including a snippet of Inform 6 code. The address and format of the version number vary according to the virtual machine being targeted. |
||
< |
<syntaxhighlight lang="inform7">Home is a room. |
||
When play begins: |
When play begins: |
||
Line 880: | Line 880: | ||
To decide which version is current runtime version: (- ($32-->0) -). |
To decide which version is current runtime version: (- ($32-->0) -). |
||
To decide which version is required runtime version: decide on 1.1.</ |
To decide which version is required runtime version: decide on 1.1.</syntaxhighlight> |
||
It's not possible to check for the existence of functions (invoking a nonexistent phrase causes a compile-time error) or list global variables. |
It's not possible to check for the existence of functions (invoking a nonexistent phrase causes a compile-time error) or list global variables. |
||
=={{header|Io}}== |
=={{header|Io}}== |
||
< |
<syntaxhighlight lang="io">if(System version < 20080000, exit) |
||
if(hasSlot("bloop") and bloop hasSlot("abs"), bloop abs)</ |
if(hasSlot("bloop") and bloop hasSlot("abs"), bloop abs)</syntaxhighlight> |
||
Io can also inspect the source code of methods written in Io: |
Io can also inspect the source code of methods written in Io: |
||
< |
<syntaxhighlight lang="io">getSlot("arbitraryMethod") code</syntaxhighlight> |
||
=={{header|IS-BASIC}}== |
=={{header|IS-BASIC}}== |
||
< |
<syntaxhighlight lang="is-basic">100 IF VERNUM<2.1 THEN PRINT "Version is too old.":STOP |
||
110 WHEN EXCEPTION USE ERROR |
110 WHEN EXCEPTION USE ERROR |
||
120 PRINT ABS(BLOOP) |
120 PRINT ABS(BLOOP) |
||
Line 900: | Line 900: | ||
150 PRINT EXSTRING$(EXTYPE) |
150 PRINT EXSTRING$(EXTYPE) |
||
160 CONTINUE |
160 CONTINUE |
||
170 END HANDLER</ |
170 END HANDLER</syntaxhighlight> |
||
=={{header|J}}== |
=={{header|J}}== |
||
Exit if we're running an old version of J (earlier than version 6, which is current as of this writing), giving version number as the exit status: |
Exit if we're running an old version of J (earlier than version 6, which is current as of this writing), giving version number as the exit status: |
||
< |
<syntaxhighlight lang="j">6 (2!:55@:]^:>) 0 ". 1 { 9!:14''</syntaxhighlight> |
||
Compute <tt>abs(bloop)</tt> if <tt>abs</tt> is a function and <tt>bloop</tt> is data: |
Compute <tt>abs(bloop)</tt> if <tt>abs</tt> is a function and <tt>bloop</tt> is data: |
||
< |
<syntaxhighlight lang="j">".(#~3 0*./ .=4!:0@;:)'abs bloop'</syntaxhighlight> |
||
'''Extra credit''': report the number of integer variables in global scope, and their sum: |
'''Extra credit''': report the number of integer variables in global scope, and their sum: |
||
< |
<syntaxhighlight lang="j">((],&(+/);@#~)((=<.)@[^:](''-:$)*.0=0{.@#,)&>)".&.>4!:1]0</syntaxhighlight> |
||
This last expression is longer than the others, because it has a couple of extra guard checks; in J, the programmer doesn't need to care if the data is a single number or an array, or what hardware representation is used for numbers (32-bit int, IEEE float, etc). |
This last expression is longer than the others, because it has a couple of extra guard checks; in J, the programmer doesn't need to care if the data is a single number or an array, or what hardware representation is used for numbers (32-bit int, IEEE float, etc). |
||
Line 916: | Line 916: | ||
=={{header|Java}}== |
=={{header|Java}}== |
||
You can't see if a variable or function is available in Java (it will be a compile time error if you try to use them when you they aren't available), but you can check the version number using the <tt>System</tt> class: |
You can't see if a variable or function is available in Java (it will be a compile time error if you try to use them when you they aren't available), but you can check the version number using the <tt>System</tt> class: |
||
< |
<syntaxhighlight lang="java">public class VersCheck { |
||
public static void main(String[] args) { |
public static void main(String[] args) { |
||
String vers = System.getProperty("java.version"); |
String vers = System.getProperty("java.version"); |
||
Line 927: | Line 927: | ||
} |
} |
||
} |
} |
||
}</ |
}</syntaxhighlight> |
||
=={{header|JavaScript}}== |
=={{header|JavaScript}}== |
||
Line 935: | Line 935: | ||
Testing whether the variable “bloop” exists: |
Testing whether the variable “bloop” exists: |
||
< |
<syntaxhighlight lang="javascript">if (typeof bloop !== "undefined") { ... }</syntaxhighlight> |
||
The <code>typeof</code> operator explicitly does not throw an error when given an undeclared variable. |
The <code>typeof</code> operator explicitly does not throw an error when given an undeclared variable. |
||
Line 941: | Line 941: | ||
Test whether <code>Math.abs()</code> is available: |
Test whether <code>Math.abs()</code> is available: |
||
< |
<syntaxhighlight lang="javascript">if ("abs" in Math) { ... }</syntaxhighlight> |
||
<code>abs</code> is a method of the Math object, methods are properties, and the <code>in</code> operator tests whether an object has the named property. |
<code>abs</code> is a method of the Math object, methods are properties, and the <code>in</code> operator tests whether an object has the named property. |
||
Line 964: | Line 964: | ||
=={{header|Jsish}}== |
=={{header|Jsish}}== |
||
< |
<syntaxhighlight lang="javascript">/* Introspection, in jsish */ |
||
if (Info.version() < Util.verConvert('2.8.6')) { |
if (Info.version() < Util.verConvert('2.8.6')) { |
||
puts("need at least version 2.8.6 of jsish for this application"); |
puts("need at least version 2.8.6 of jsish for this application"); |
||
Line 983: | Line 983: | ||
} |
} |
||
} |
} |
||
printf("%d numerics with sum of: %d\n", nums, sums);</ |
printf("%d numerics with sum of: %d\n", nums, sums);</syntaxhighlight> |
||
{{out}} |
{{out}} |
||
Line 990: | Line 990: | ||
=={{header|Julia}}== |
=={{header|Julia}}== |
||
< |
<syntaxhighlight lang="julia">@show VERSION |
||
VERSION < v"0.4" && exit(1) |
VERSION < v"0.4" && exit(1) |
||
Line 1,000: | Line 1,000: | ||
vars = filter(x -> eval(x) isa Integer, names(Main)) |
vars = filter(x -> eval(x) isa Integer, names(Main)) |
||
println("Integer variables: ", join(vars, ", "), ".") |
println("Integer variables: ", join(vars, ", "), ".") |
||
println("Sum of integers in the global scope: ", sum(eval.(vars)), ".")</ |
println("Sum of integers in the global scope: ", sum(eval.(vars)), ".")</syntaxhighlight> |
||
{{out}} |
{{out}} |
||
Line 1,009: | Line 1,009: | ||
=={{header|Kotlin}}== |
=={{header|Kotlin}}== |
||
We will use Java reflection for this task as Kotlin's own reflection facilities do not appear to be able to deal generically with top-level entities at the present time (i.e. ::class isn't yet supported): |
We will use Java reflection for this task as Kotlin's own reflection facilities do not appear to be able to deal generically with top-level entities at the present time (i.e. ::class isn't yet supported): |
||
< |
<syntaxhighlight lang="scala">// version 1.0.6 (intro.kt) |
||
import java.lang.reflect.Method |
import java.lang.reflect.Method |
||
Line 1,048: | Line 1,048: | ||
} |
} |
||
println("\nThere are $count global integer variables and their sum is $sum") |
println("\nThere are $count global integer variables and their sum is $sum") |
||
}</ |
}</syntaxhighlight> |
||
{{out}} |
{{out}} |
||
Line 1,060: | Line 1,060: | ||
=={{header|Lasso}}== |
=={{header|Lasso}}== |
||
< |
<syntaxhighlight lang="lasso">var(bloob = -26) |
||
decimal(lasso_version(-lassoversion)) < 9.2 ? abort |
decimal(lasso_version(-lassoversion)) < 9.2 ? abort |
||
var_defined('bloob') and $bloob -> isa(::integer) and lasso_tagexists('math_abs') ? math_abs($bloob)</ |
var_defined('bloob') and $bloob -> isa(::integer) and lasso_tagexists('math_abs') ? math_abs($bloob)</syntaxhighlight> |
||
-> 26 |
-> 26 |
||
Lassos equivalence of global variables are thread variables. They have scope that lasts for the entire call in contrast to local variables that are confined to the page or method they are created within. |
Lassos equivalence of global variables are thread variables. They have scope that lasts for the entire call in contrast to local variables that are confined to the page or method they are created within. |
||
< |
<syntaxhighlight lang="lasso">var( |
||
bloob = -26, |
bloob = -26, |
||
positive = 450 |
positive = 450 |
||
Line 1,083: | Line 1,083: | ||
} |
} |
||
#total</ |
#total</syntaxhighlight> |
||
-> 424 |
-> 424 |
||
=={{header|Lingo}}== |
=={{header|Lingo}}== |
||
*verify the version/revision of your currently running (compiler/interpreter/byte-compiler/runtime environment/whatever your language uses) and exit if it is too old. |
*verify the version/revision of your currently running (compiler/interpreter/byte-compiler/runtime environment/whatever your language uses) and exit if it is too old. |
||
< |
<syntaxhighlight lang="lingo">put _player.productVersion |
||
-- "11.5.9" |
-- "11.5.9" |
||
_player.itemDelimiter="." |
_player.itemDelimiter="." |
||
if integer(_player.productVersion.item[1])<11 then _player.quit()</ |
if integer(_player.productVersion.item[1])<11 then _player.quit()</syntaxhighlight> |
||
*check whether the variable "bloop" exists and whether the math-function "abs()" is available and if yes compute abs(bloop). |
*check whether the variable "bloop" exists and whether the math-function "abs()" is available and if yes compute abs(bloop). |
||
< |
<syntaxhighlight lang="lingo">-- check existence of bloop in local scope |
||
bloopExists = not voidP(value("bloop")) |
bloopExists = not voidP(value("bloop")) |
||
-- or for global scope: |
-- or for global scope: |
||
-- bloopExists = not voidP(_global.bloop) |
-- bloopExists = not voidP(_global.bloop) |
||
absExists = value("abs(1)")=1 |
absExists = value("abs(1)")=1 |
||
if bloopExists and absExists then put abs(bloop) -- or abs(_global.bloop)</ |
if bloopExists and absExists then put abs(bloop) -- or abs(_global.bloop)</syntaxhighlight> |
||
*Report the number of integer variables in global scope, and their sum. |
*Report the number of integer variables in global scope, and their sum. |
||
< |
<syntaxhighlight lang="lingo">cnt = 0 |
||
sum = 0 |
sum = 0 |
||
repeat with v in the globals |
repeat with v in the globals |
||
Line 1,112: | Line 1,112: | ||
end repeat |
end repeat |
||
put cnt |
put cnt |
||
put sum</ |
put sum</syntaxhighlight> |
||
=={{header|Locomotive Basic}}== |
=={{header|Locomotive Basic}}== |
||
Line 1,118: | Line 1,118: | ||
To get the BASIC ROM version number, we need to use a Z80 machine code routine which copies the version number (major/minor/patchlevel) to RAM where BASIC can then read it. Here is the assembly: |
To get the BASIC ROM version number, we need to use a Z80 machine code routine which copies the version number (major/minor/patchlevel) to RAM where BASIC can then read it. Here is the assembly: |
||
< |
<syntaxhighlight lang="z80">org &4000 ; program start address |
||
push bc |
push bc |
||
Line 1,141: | Line 1,141: | ||
pop de |
pop de |
||
pop bc |
pop bc |
||
ret</ |
ret</syntaxhighlight> |
||
The following BASIC program POKEs that routine into memory and quits prematurely if BASIC 1.0 is detected (meaning the machine is a CPC464), as opposed to the more standard 1.1 or later: |
The following BASIC program POKEs that routine into memory and quits prematurely if BASIC 1.0 is detected (meaning the machine is a CPC464), as opposed to the more standard 1.1 or later: |
||
< |
<syntaxhighlight lang="locobasic">10 s=&4000:SYMBOL AFTER 256:MEMORY s-1 |
||
20 FOR i=0 to 34:READ a:POKE s+i,a:NEXT |
20 FOR i=0 to 34:READ a:POKE s+i,a:NEXT |
||
30 DATA &c5,&d5,&e5,&f5,&01,&00,&df,&ed,&49,&01,&86,&7f,&ed,&49 |
30 DATA &c5,&d5,&e5,&f5,&01,&00,&df,&ed,&49,&01,&86,&7f,&ed,&49 |
||
Line 1,153: | Line 1,153: | ||
70 PRINT "BASIC ROM version is ";PEEK(&4040);".";PEEK(&4041);".";PEEK(&4042) |
70 PRINT "BASIC ROM version is ";PEEK(&4040);".";PEEK(&4041);".";PEEK(&4042) |
||
80 IF PEEK(&4041)=0 THEN PRINT "Uh oh, you are still using BASIC 1.0":END |
80 IF PEEK(&4041)=0 THEN PRINT "Uh oh, you are still using BASIC 1.0":END |
||
90 PRINT "You are using BASIC 1.1 or later, program can continue"</ |
90 PRINT "You are using BASIC 1.1 or later, program can continue"</syntaxhighlight> |
||
The second subtask, testing for the presence of a variable, is done here by trying to get the memory address of the variable. If that fails, it is obviously is not yet defined: |
The second subtask, testing for the presence of a variable, is done here by trying to get the memory address of the variable. If that fails, it is obviously is not yet defined: |
||
< |
<syntaxhighlight lang="locobasic">1 ' decide randomly whether to define the variable: |
||
10 IF RND>.5 THEN bloop=-100*RND |
10 IF RND>.5 THEN bloop=-100*RND |
||
20 ON ERROR GOTO 100 |
20 ON ERROR GOTO 100 |
||
Line 1,164: | Line 1,164: | ||
50 PRINT "ABS of bloop is",ABS(bloop) |
50 PRINT "ABS of bloop is",ABS(bloop) |
||
90 END |
90 END |
||
100 IF ERL=30 THEN PRINT "Variable bloop not defined":RESUME 90</ |
100 IF ERL=30 THEN PRINT "Variable bloop not defined":RESUME 90</syntaxhighlight> |
||
(Like the Spectrum version, we have omitted checking for ABS because it is a builit-in function of the BASIC interpreter and therefore always present.) |
(Like the Spectrum version, we have omitted checking for ABS because it is a builit-in function of the BASIC interpreter and therefore always present.) |
||
Line 1,170: | Line 1,170: | ||
'''Extra credit''': Finally, we can traverse the memory area where BASIC stores its integer, real, and string variables and add together all integers (type 1): |
'''Extra credit''': Finally, we can traverse the memory area where BASIC stores its integer, real, and string variables and add together all integers (type 1): |
||
< |
<syntaxhighlight lang="locobasic">10 ' The program should find and add those three integers (%), ignoring reals: |
||
20 foo%=-4:bar%=7:baz%=9:somereal=3.141 |
20 foo%=-4:bar%=7:baz%=9:somereal=3.141 |
||
30 varstart=&ae68 ' for CPC 664 and 6128 |
30 varstart=&ae68 ' for CPC 664 and 6128 |
||
Line 1,187: | Line 1,187: | ||
160 WEND |
160 WEND |
||
170 PRINT "There are"num"integer variables." |
170 PRINT "There are"num"integer variables." |
||
180 PRINT "Their sum is"sum</ |
180 PRINT "Their sum is"sum</syntaxhighlight> |
||
{{out}} |
{{out}} |
||
Line 1,195: | Line 1,195: | ||
=={{header|Logo}}== |
=={{header|Logo}}== |
||
{{works with|UCB Logo}} |
{{works with|UCB Logo}} |
||
< |
<syntaxhighlight lang="logo">show logoversion ; 5.6 |
||
if logoversion < 6.0 [print [too old!]] |
if logoversion < 6.0 [print [too old!]] |
||
if and [name? "a] [number? :a] [ |
if and [name? "a] [number? :a] [ |
||
print ifelse procedure? "abs [abs :a] [ifelse :a < 0 [minus :a] [:a]] |
print ifelse procedure? "abs [abs :a] [ifelse :a < 0 [minus :a] [:a]] |
||
]</ |
]</syntaxhighlight> |
||
=={{header|Logtalk}}== |
=={{header|Logtalk}}== |
||
< |
<syntaxhighlight lang="logtalk"> |
||
:- object(my_application). |
:- object(my_application). |
||
Line 1,237: | Line 1,237: | ||
:- end_object. |
:- end_object. |
||
</syntaxhighlight> |
|||
</lang> |
|||
=={{header|Lua}}== |
=={{header|Lua}}== |
||
< |
<syntaxhighlight lang="lua">if _VERSION:sub(5) + 0 < 5.1 then print"too old" end --_VERSION is "Lua <version>". |
||
if bloop and math.abs then print(math.abs(bloop)) end</ |
if bloop and math.abs then print(math.abs(bloop)) end</syntaxhighlight> |
||
=={{header|Maple}}== |
=={{header|Maple}}== |
||
The "version" kernel option returns a string similar to |
The "version" kernel option returns a string similar to |
||
< |
<syntaxhighlight lang="maple">> kernelopts( 'version' ); |
||
Maple 16.00, SUN SPARC SOLARIS, Mar 3 2012, Build ID 732982</ |
Maple 16.00, SUN SPARC SOLARIS, Mar 3 2012, Build ID 732982</syntaxhighlight> |
||
The following does the trick for the first bit. |
The following does the trick for the first bit. |
||
< |
<syntaxhighlight lang="maple">> if sscanf( (StringTools:-Split(kernelopts(version))[2]), "%d.%d" )[1] < 300 then `quit`(1) end;</syntaxhighlight> |
||
(There is also an internal "version" procedure, which returns a build ID, but this is less obvious to use, as you'd need a table mapping versions to build IDs. Besides, it prints stuff.) |
(There is also an internal "version" procedure, which returns a build ID, but this is less obvious to use, as you'd need a table mapping versions to build IDs. Besides, it prints stuff.) |
||
It doesn't really make sense to ask whether a variable "exists"; it springs into existence by uttering it in code. So I'll interpret the problem as asking whether it is assigned some kind of numeric value to which abs() can be applied. |
It doesn't really make sense to ask whether a variable "exists"; it springs into existence by uttering it in code. So I'll interpret the problem as asking whether it is assigned some kind of numeric value to which abs() can be applied. |
||
< |
<syntaxhighlight lang="maple">> if type( bloop, complex( extended_numeric ) ) and type( abs, mathfunc ) then print( abs( bloop ) ) end: |
||
1/2 |
1/2 |
||
13</ |
13</syntaxhighlight> |
||
Note that it is not necessary to check that the name "bloop" is assigned (though it is possible to do so), since an unassigned name is a first-class value in Maple. Another possible interpretation is that the symbolic expression |
Note that it is not necessary to check that the name "bloop" is assigned (though it is possible to do so), since an unassigned name is a first-class value in Maple. Another possible interpretation is that the symbolic expression |
||
< |
<syntaxhighlight lang="maple">> abs( bloop ); |
||
| bloop |</ |
| bloop |</syntaxhighlight> |
||
is a perfectly good expression in Maple, so checking for the the "existence" of "bloop" isn't necessary in the first place. (One probably would not bother to check that abs() was actually there either, unless one expected that the standard library was broken.) |
is a perfectly good expression in Maple, so checking for the the "existence" of "bloop" isn't necessary in the first place. (One probably would not bother to check that abs() was actually there either, unless one expected that the standard library was broken.) |
||
Here are the number and sum of the assigned integer globals in my current (fresh) session. |
Here are the number and sum of the assigned integer globals in my current (fresh) session. |
||
< |
<syntaxhighlight lang="maple">> nops([anames](integer)); |
||
3 |
3 |
||
> eval(`+`(anames(integer))); |
> eval(`+`(anames(integer))); |
||
17 |
17 |
||
</syntaxhighlight> |
|||
</lang> |
|||
If I change it, I get: |
If I change it, I get: |
||
<syntaxhighlight lang="maple"> |
|||
<lang Maple> |
|||
> foo := 25: |
> foo := 25: |
||
> nops([anames](integer)); |
> nops([anames](integer)); |
||
Line 1,275: | Line 1,275: | ||
> eval(`+`(anames(integer))); |
> eval(`+`(anames(integer))); |
||
42</ |
42</syntaxhighlight> |
||
=={{header|Mathematica}}/{{header|Wolfram Language}}== |
=={{header|Mathematica}}/{{header|Wolfram Language}}== |
||
< |
<syntaxhighlight lang="mathematica">If[$VersionNumber < 8, Quit[]] |
||
If[NameQ["bloop"] && NameQ["Abs"], |
If[NameQ["bloop"] && NameQ["Abs"], |
||
Print[Abs[bloop]]]</ |
Print[Abs[bloop]]]</syntaxhighlight> |
||
{{out}} |
{{out}} |
||
<pre>7</pre> |
<pre>7</pre> |
||
<lang>globalintegers = Symbol /@ Select[Names["Global`*"], IntegerQ[Symbol[#]] &]; |
<syntaxhighlight lang="text">globalintegers = Symbol /@ Select[Names["Global`*"], IntegerQ[Symbol[#]] &]; |
||
Print [ globalintegers //Length, " global integer(s) and their sum is: ", globalintegers // Total] </ |
Print [ globalintegers //Length, " global integer(s) and their sum is: ", globalintegers // Total] </syntaxhighlight> |
||
{{out}} |
{{out}} |
||
Line 1,292: | Line 1,292: | ||
=={{header|MATLAB}} / {{header|Octave}}== |
=={{header|MATLAB}} / {{header|Octave}}== |
||
< |
<syntaxhighlight lang="matlab"> % convert version into numerical value |
||
v = version; |
v = version; |
||
v(v=='.')=' '; |
v(v=='.')=' '; |
||
Line 1,312: | Line 1,312: | ||
printf('abs(bloob) is %f\n',abs(bloob)); |
printf('abs(bloob) is %f\n',abs(bloob)); |
||
return; |
return; |
||
end; </ |
end; </syntaxhighlight> |
||
Extra credit task: |
Extra credit task: |
||
<syntaxhighlight lang="matlab"> |
|||
<lang Matlab> |
|||
% find all integers |
% find all integers |
||
varlist = whos; |
varlist = whos; |
||
Line 1,330: | Line 1,330: | ||
printf('sum of integer scalars: %i\n',intsum); |
printf('sum of integer scalars: %i\n',intsum); |
||
printf('sum of all integer elements: %i\n',intsumall); |
printf('sum of all integer elements: %i\n',intsumall); |
||
</syntaxhighlight> |
|||
</lang> |
|||
=={{header|Maxima}}== |
=={{header|Maxima}}== |
||
< |
<syntaxhighlight lang="maxima">/* Get version information */ |
||
build_info(); |
build_info(); |
||
/* build_info("5.27.0", "2012-05-08 11:27:57", "i686-pc-mingw32", "GNU Common Lisp (GCL)", "GCL 2.6.8") */ |
/* build_info("5.27.0", "2012-05-08 11:27:57", "i686-pc-mingw32", "GNU Common Lisp (GCL)", "GCL 2.6.8") */ |
||
Line 1,350: | Line 1,350: | ||
/* Sum of integer variables */ |
/* Sum of integer variables */ |
||
lreduce("+", sublist(map(ev, values), integerp));</ |
lreduce("+", sublist(map(ev, values), integerp));</syntaxhighlight> |
||
=={{header|MAXScript}}== |
=={{header|MAXScript}}== |
||
< |
<syntaxhighlight lang="maxscript">fn computeAbsBloop bloop = |
||
( |
( |
||
versionNumber = maxVersion() |
versionNumber = maxVersion() |
||
Line 1,380: | Line 1,380: | ||
) |
) |
||
computeAbsBloop -17</ |
computeAbsBloop -17</syntaxhighlight> |
||
=={{header|NetRexx}}== |
=={{header|NetRexx}}== |
||
Line 1,386: | Line 1,386: | ||
The language does however return a string identifying the version of NetRexx in effect when the current class was last processed. This information can be retrieved through the '''<tt>version</tt>''' ''special variable''. |
The language does however return a string identifying the version of NetRexx in effect when the current class was last processed. This information can be retrieved through the '''<tt>version</tt>''' ''special variable''. |
||
< |
<syntaxhighlight lang="netrexx">/* NetRexx */ |
||
options replace format comments java crossref symbols binary |
options replace format comments java crossref symbols binary |
||
Line 1,411: | Line 1,411: | ||
end |
end |
||
return |
return |
||
</syntaxhighlight> |
|||
</lang> |
|||
{{out}} |
{{out}} |
||
<pre> |
<pre> |
||
Line 1,423: | Line 1,423: | ||
=={{header|Nim}}== |
=={{header|Nim}}== |
||
In Nim, many checks are done at compile time. So, you have the choice to emit an error or warning at compile time or exit at runtime. |
In Nim, many checks are done at compile time. So, you have the choice to emit an error or warning at compile time or exit at runtime. |
||
< |
<syntaxhighlight lang="nim">when NimVersion < "1.2": |
||
error "This compiler is too old" # Error at compile time. |
error "This compiler is too old" # Error at compile time. |
||
Line 1,431: | Line 1,431: | ||
when compiles abs(bloop): |
when compiles abs(bloop): |
||
echo abs(bloop)</ |
echo abs(bloop)</syntaxhighlight> |
||
{{out}} |
{{out}} |
||
Line 1,438: | Line 1,438: | ||
=={{header|OCaml}}== |
=={{header|OCaml}}== |
||
< |
<syntaxhighlight lang="ocaml"># Sys.ocaml_version;; |
||
- : string = "3.10.2"</ |
- : string = "3.10.2"</syntaxhighlight> |
||
< |
<syntaxhighlight lang="ocaml"># Scanf.sscanf (Sys.ocaml_version) "%d.%d.%d" |
||
(fun major minor micro -> major, minor, micro) ;; |
(fun major minor micro -> major, minor, micro) ;; |
||
- : int * int * int = (3, 10, 2)</ |
- : int * int * int = (3, 10, 2)</syntaxhighlight> |
||
Checking if an identifier (a value or a function) is bound doesn't make any sens in OCaml, which is strongly staticaly typed. |
Checking if an identifier (a value or a function) is bound doesn't make any sens in OCaml, which is strongly staticaly typed. |
||
Line 1,453: | Line 1,453: | ||
Oforth does not have global variables, only global constants. |
Oforth does not have global variables, only global constants. |
||
< |
<syntaxhighlight lang="oforth">: bloopAbs |
||
| bl m | |
| bl m | |
||
System.VERSION println |
System.VERSION println |
||
Line 1,464: | Line 1,464: | ||
System.Out "bloop value is : " << bl value << cr |
System.Out "bloop value is : " << bl value << cr |
||
System.Out "bloop abs is : " << bl value m perform << cr ;</ |
System.Out "bloop abs is : " << bl value m perform << cr ;</syntaxhighlight> |
||
{{out}} |
{{out}} |
||
Line 1,483: | Line 1,483: | ||
=={{header|OxygenBasic}}== |
=={{header|OxygenBasic}}== |
||
Compile time introspection |
Compile time introspection |
||
<lang> |
<syntaxhighlight lang="text"> |
||
$ rtlversion "0.4.0" |
$ rtlversion "0.4.0" |
||
Line 1,500: | Line 1,500: | ||
#endif |
#endif |
||
#endif |
#endif |
||
</syntaxhighlight> |
|||
</lang> |
|||
=={{header|Oz}}== |
=={{header|Oz}}== |
||
We cannot check whether a variable is in scope (static property). |
We cannot check whether a variable is in scope (static property). |
||
We <em>can</em> check whether a module exports a certain value. However, for system modules the compiler will refuse to compile if we try to use a non-existing value. |
We <em>can</em> check whether a module exports a certain value. However, for system modules the compiler will refuse to compile if we try to use a non-existing value. |
||
< |
<syntaxhighlight lang="oz">declare |
||
Version = {Property.get 'oz.version'} |
Version = {Property.get 'oz.version'} |
||
%% Version is an atom like '1.4.0'. So we can not compare it directly. |
%% Version is an atom like '1.4.0'. So we can not compare it directly. |
||
Line 1,518: | Line 1,518: | ||
else |
else |
||
{System.showInfo "Your Mozart version is too old."} |
{System.showInfo "Your Mozart version is too old."} |
||
end</ |
end</syntaxhighlight> |
||
=={{header|PARI/GP}}== |
=={{header|PARI/GP}}== |
||
{{works with|PARI/GP|2.4.3 and above}} |
{{works with|PARI/GP|2.4.3 and above}} |
||
< |
<syntaxhighlight lang="parigp">if(lex(version(), [2,4,3]) < 0, quit()); \\ Compare the version to 2.4.3 lexicographically |
||
if(bloop!='bloop && type(abs) == "t_CLOSURE", abs(bloop))</ |
if(bloop!='bloop && type(abs) == "t_CLOSURE", abs(bloop))</syntaxhighlight> |
||
=={{header|Perl}}== |
=={{header|Perl}}== |
||
{{works with|Perl|5.x}} |
{{works with|Perl|5.x}} |
||
< |
<syntaxhighlight lang="perl">require v5.6.1; # run time version check |
||
require 5.6.1; # ditto |
require 5.6.1; # ditto |
||
require 5.006_001; # ditto; preferred for backwards compatibility</ |
require 5.006_001; # ditto; preferred for backwards compatibility</syntaxhighlight> |
||
To check if a variable exists, do a name lookup of it in the package symbol table: |
To check if a variable exists, do a name lookup of it in the package symbol table: |
||
< |
<syntaxhighlight lang="perl">#$bloop = -123; # uncomment this line to see the difference |
||
no strict 'refs'; # referring to variable by name goes against 'strict' pragma |
no strict 'refs'; # referring to variable by name goes against 'strict' pragma |
||
if (defined($::{'bloop'})) {print abs(${'bloop'})} else {print "bloop isn't defined"};</ |
if (defined($::{'bloop'})) {print abs(${'bloop'})} else {print "bloop isn't defined"};</syntaxhighlight> |
||
To check if certain built-in function is available (maybe you are using a stripped down build of perl binary, for example), one can use eval, but make sure the statement you are eval'ing doesn't have side effect: |
To check if certain built-in function is available (maybe you are using a stripped down build of perl binary, for example), one can use eval, but make sure the statement you are eval'ing doesn't have side effect: |
||
< |
<syntaxhighlight lang="perl">eval('abs(0)'); # eval("") instead of eval{}; the latter is not for run-time check |
||
print "abs() doesn't seem to be available\n" if $@;</ |
print "abs() doesn't seem to be available\n" if $@;</syntaxhighlight> |
||
To check if a package or object provides certain method name, use 'can': |
To check if a package or object provides certain method name, use 'can': |
||
< |
<syntaxhighlight lang="perl">use Math::Complex; |
||
my $cpl = Math::Complex->new(1,1); |
my $cpl = Math::Complex->new(1,1); |
||
Line 1,550: | Line 1,550: | ||
print "object \$cpl does not have 'explode' method\n" |
print "object \$cpl does not have 'explode' method\n" |
||
unless $cpl->can('explode'); |
unless $cpl->can('explode'); |
||
</syntaxhighlight> |
|||
</lang> |
|||
Keep in mind that what a package has as method names are not equal to what method names can be called on this package, due to things like AUTOLOAD. |
Keep in mind that what a package has as method names are not equal to what method names can be called on this package, due to things like AUTOLOAD. |
||
For most uses, introspection is meaningless, just call the method (and catch exceptions if it's important). |
For most uses, introspection is meaningless, just call the method (and catch exceptions if it's important). |
||
An example that solves the task: |
An example that solves the task: |
||
< |
<syntaxhighlight lang="perl">use 5.010; |
||
our $bloop = -12; |
our $bloop = -12; |
||
if (defined $::bloop) { |
if (defined $::bloop) { |
||
Line 1,567: | Line 1,567: | ||
else { |
else { |
||
say '$bloop is not defined'; |
say '$bloop is not defined'; |
||
}</ |
}</syntaxhighlight> |
||
Note that this program will exit with a message "Perl v5.10.0 required" if run under perl version lower than 5.10 and it actually uses a feature introduced in that version (<code>say</code>). |
Note that this program will exit with a message "Perl v5.10.0 required" if run under perl version lower than 5.10 and it actually uses a feature introduced in that version (<code>say</code>). |
||
The program checks whether the variable is actually defined and not if it just exists. |
The program checks whether the variable is actually defined and not if it just exists. |
||
Line 1,575: | Line 1,575: | ||
Extra task: |
Extra task: |
||
< |
<syntaxhighlight lang="perl">use 5.010; |
||
package test; |
package test; |
||
use Regexp::Common; |
use Regexp::Common; |
||
Line 1,590: | Line 1,590: | ||
my $num = @ints; |
my $num = @ints; |
||
my $sum = sum @ints; |
my $sum = sum @ints; |
||
say "$num integers, sum = $sum";</ |
say "$num integers, sum = $sum";</syntaxhighlight> |
||
It prints: |
It prints: |
||
<pre> |
<pre> |
||
Line 1,597: | Line 1,597: | ||
This example uses the <code>test</code> namespace instead of the default, because there already are some integer numbers in the <code>main</code> namespace like the PID, etc. |
This example uses the <code>test</code> namespace instead of the default, because there already are some integer numbers in the <code>main</code> namespace like the PID, etc. |
||
The program to sum those numbers would be: |
The program to sum those numbers would be: |
||
< |
<syntaxhighlight lang="perl">use 5.010; |
||
use Regexp::Common; |
use Regexp::Common; |
||
use List::Util qw(sum); |
use List::Util qw(sum); |
||
Line 1,603: | Line 1,603: | ||
my $num = @ints; |
my $num = @ints; |
||
my $sum = sum @ints; |
my $sum = sum @ints; |
||
say "$num integers, sum = $sum";</ |
say "$num integers, sum = $sum";</syntaxhighlight> |
||
<pre> |
<pre> |
||
4 integers, sum = 74717 |
4 integers, sum = 74717 |
||
Line 1,611: | Line 1,611: | ||
The requires procedure behaves like a compiler directive, although it is in fact just a normal executable routine. |
The requires procedure behaves like a compiler directive, although it is in fact just a normal executable routine. |
||
<!--< |
<!--<syntaxhighlight lang="phix">--> |
||
<span style="color: #7060A8;">requires<span style="color: #0000FF;">(<span style="color: #008000;">"0.8.2"<span style="color: #0000FF;">)</span> <span style="color: #000080;font-style:italic;">-- crashes on 0.8.1 and earlier </span> |
<span style="color: #7060A8;">requires<span style="color: #0000FF;">(<span style="color: #008000;">"0.8.2"<span style="color: #0000FF;">)</span> <span style="color: #000080;font-style:italic;">-- crashes on 0.8.1 and earlier </span> |
||
<span style="color: #7060A8;">requires<span style="color: #0000FF;">(<span style="color: #000000;">WINDOWS<span style="color: #0000FF;">)</span> <span style="color: #000080;font-style:italic;">-- crashes on Linux </span> |
<span style="color: #7060A8;">requires<span style="color: #0000FF;">(<span style="color: #000000;">WINDOWS<span style="color: #0000FF;">)</span> <span style="color: #000080;font-style:italic;">-- crashes on Linux </span> |
||
<span style="color: #7060A8;">requires<span style="color: #0000FF;">(<span style="color: #000000;">64<span style="color: #0000FF;">)</span> <span style="color: #000080;font-style:italic;">-- crashes on 32-bit |
<span style="color: #7060A8;">requires<span style="color: #0000FF;">(<span style="color: #000000;">64<span style="color: #0000FF;">)</span> <span style="color: #000080;font-style:italic;">-- crashes on 32-bit |
||
<!--</ |
<!--</syntaxhighlight>--> |
||
If passed a string it compares it (intelligently) against the interpreter/compiler version and terminates in error with a suitable message should it be too old to cope. Otherwise the parameter must be an integer: <32 checks the platform, >=32 checks the word size. In the latter case when (interpreting and) it needs to, it hunts for a suitable alternative runtime and offers to re-run with that, maybe you need bigger ints, or maybe you only ship a 32-bit libcurl.dll. |
If passed a string it compares it (intelligently) against the interpreter/compiler version and terminates in error with a suitable message should it be too old to cope. Otherwise the parameter must be an integer: <32 checks the platform, >=32 checks the word size. In the latter case when (interpreting and) it needs to, it hunts for a suitable alternative runtime and offers to re-run with that, maybe you need bigger ints, or maybe you only ship a 32-bit libcurl.dll. |
||
Line 1,621: | Line 1,621: | ||
The version() routine used by the above can also be called directly and returns a string: |
The version() routine used by the above can also be called directly and returns a string: |
||
<!--< |
<!--<syntaxhighlight lang="phix">--> |
||
<span style="color: #0000FF;">?<span style="color: #7060A8;">version<span style="color: #0000FF;">(<span style="color: #0000FF;">)</span> <span style="color: #000080;font-style:italic;">-- eg "0.8.0" |
<span style="color: #0000FF;">?<span style="color: #7060A8;">version<span style="color: #0000FF;">(<span style="color: #0000FF;">)</span> <span style="color: #000080;font-style:italic;">-- eg "0.8.0" |
||
<!--</ |
<!--</syntaxhighlight>--> |
||
Normally only really useful for display, but you can of course break that down into an integer triplet with scanf(), as requires does, maybe something works on 0.7.7 and 0.7.9 but not 0.7.8. |
Normally only really useful for display, but you can of course break that down into an integer triplet with scanf(), as requires does, maybe something works on 0.7.7 and 0.7.9 but not 0.7.8. |
||
Line 1,629: | Line 1,629: | ||
Phix has a builtin abs() routine, which will be auto-included if referenced. |
Phix has a builtin abs() routine, which will be auto-included if referenced. |
||
<!--< |
<!--<syntaxhighlight lang="phix">--> |
||
<span style="color: #000080;font-style:italic;">--include pmaths.e -- (an auto-include, ok but not needed) |
<span style="color: #000080;font-style:italic;">--include pmaths.e -- (an auto-include, ok but not needed) |
||
--include complex.e -- (not an auto-include, needed if used)</span> |
--include complex.e -- (not an auto-include, needed if used)</span> |
||
Line 1,637: | Line 1,637: | ||
<span style="color: #0000FF;">?<span style="color: #7060A8;">call_func<span style="color: #0000FF;">(<span style="color: #000000;">r_abs<span style="color: #0000FF;">,<span style="color: #0000FF;">{<span style="color: #0000FF;">-<span style="color: #000000;">42<span style="color: #0000FF;">}<span style="color: #0000FF;">)</span> |
<span style="color: #0000FF;">?<span style="color: #7060A8;">call_func<span style="color: #0000FF;">(<span style="color: #000000;">r_abs<span style="color: #0000FF;">,<span style="color: #0000FF;">{<span style="color: #0000FF;">-<span style="color: #000000;">42<span style="color: #0000FF;">}<span style="color: #0000FF;">)</span> |
||
<span style="color: #008080;">end</span> <span style="color: #008080;">if |
<span style="color: #008080;">end</span> <span style="color: #008080;">if |
||
<!--</ |
<!--</syntaxhighlight>--> |
||
Using complex_abs() is probably closer to the task requirement in that if complex.e is not included it will not be found/called.<br> |
Using complex_abs() is probably closer to the task requirement in that if complex.e is not included it will not be found/called.<br> |
||
In this case it happens to give exactly the same result, however under the hood it is first promoting the -42 to -42+0i before returning sqrt((-42)*(-42)+(0)*(0)). |
In this case it happens to give exactly the same result, however under the hood it is first promoting the -42 to -42+0i before returning sqrt((-42)*(-42)+(0)*(0)). |
||
Line 1,645: | Line 1,645: | ||
normally hidden away out of sight in builtins\VM. |
normally hidden away out of sight in builtins\VM. |
||
<!--< |
<!--<syntaxhighlight lang="phix">--> |
||
<span style="color: #008080;">include</span> <span style="color: #000000;">builtins<span style="color: #0000FF;">/<span style="color: #000000;">VM<span style="color: #0000FF;">/<span style="color: #000000;">pStack<span style="color: #0000FF;">.<span style="color: #000000;">e</span> <span style="color: #000080;font-style:italic;">-- :%opGetST |
<span style="color: #008080;">include</span> <span style="color: #000000;">builtins<span style="color: #0000FF;">/<span style="color: #000000;">VM<span style="color: #0000FF;">/<span style="color: #000000;">pStack<span style="color: #0000FF;">.<span style="color: #000000;">e</span> <span style="color: #000080;font-style:italic;">-- :%opGetST |
||
-- copies from pglobals.e:</span> |
-- copies from pglobals.e:</span> |
||
Line 1,759: | Line 1,759: | ||
<span style="color: #0000FF;">?<span style="color: #000000;">var_id<span style="color: #0000FF;">(<span style="color: #000000;">0<span style="color: #0000FF;">)</span> <span style="color: #000080;font-style:italic;">-- bloop+burp = 42</span> |
<span style="color: #0000FF;">?<span style="color: #000000;">var_id<span style="color: #0000FF;">(<span style="color: #000000;">0<span style="color: #0000FF;">)</span> <span style="color: #000080;font-style:italic;">-- bloop+burp = 42</span> |
||
<span style="color: #0000FF;">?<span style="color: #000000;">bloop<span style="color: #0000FF;">+<span style="color: #000000;">burp</span> <span style="color: #000080;font-style:italic;">-- "", doh |
<span style="color: #0000FF;">?<span style="color: #000000;">bloop<span style="color: #0000FF;">+<span style="color: #000000;">burp</span> <span style="color: #000080;font-style:italic;">-- "", doh |
||
<!--</ |
<!--</syntaxhighlight>--> |
||
{{out}} |
{{out}} |
||
Line 1,772: | Line 1,772: | ||
Other routines of interest include |
Other routines of interest include |
||
<!--< |
<!--<syntaxhighlight lang="phix">--> |
||
<span style="color: #0000FF;">?<span style="color: #7060A8;">platform<span style="color: #0000FF;">(<span style="color: #0000FF;">)</span> <span style="color: #000080;font-style:italic;">-- WINDOWS=2, LINUX=3</span> |
<span style="color: #0000FF;">?<span style="color: #7060A8;">platform<span style="color: #0000FF;">(<span style="color: #0000FF;">)</span> <span style="color: #000080;font-style:italic;">-- WINDOWS=2, LINUX=3</span> |
||
<span style="color: #0000FF;">?<span style="color: #7060A8;">machine_bits<span style="color: #0000FF;">(<span style="color: #0000FF;">)</span> <span style="color: #000080;font-style:italic;">-- 32 or 64</span> |
<span style="color: #0000FF;">?<span style="color: #7060A8;">machine_bits<span style="color: #0000FF;">(<span style="color: #0000FF;">)</span> <span style="color: #000080;font-style:italic;">-- 32 or 64</span> |
||
Line 1,782: | Line 1,782: | ||
<span style="color: #0000FF;">?<span style="color: #7060A8;">get_interpreter<span style="color: #0000FF;">(<span style="color: #0000FF;">)</span> <span style="color: #000080;font-style:italic;">-- eg "C:\Program Files (x86)\Phix\p.exe" |
<span style="color: #0000FF;">?<span style="color: #7060A8;">get_interpreter<span style="color: #0000FF;">(<span style="color: #0000FF;">)</span> <span style="color: #000080;font-style:italic;">-- eg "C:\Program Files (x86)\Phix\p.exe" |
||
-- or perhaps "/home/pete/phix/p" on Linux |
-- or perhaps "/home/pete/phix/p" on Linux |
||
<!--</ |
<!--</syntaxhighlight>--> |
||
Phix supports the absolute bare minimum use of #ifdef, for compatibility with OpenEuphoria, however it is almost always better |
Phix supports the absolute bare minimum use of #ifdef, for compatibility with OpenEuphoria, however it is almost always better |
||
Line 1,789: | Line 1,789: | ||
=={{header|Phixmonti}}== |
=={{header|Phixmonti}}== |
||
< |
<syntaxhighlight lang="phixmonti">_version 1.0 < if "Interpreter version is old" else "Last version" endif print</syntaxhighlight> |
||
The program will not be executed if the variable or function has not been defined. |
The program will not be executed if the variable or function has not been defined. |
||
=={{header|PHP}}== |
=={{header|PHP}}== |
||
< |
<syntaxhighlight lang="php"><?php |
||
if (version_compare(PHP_VERSION, '5.3.0', '<' )) |
if (version_compare(PHP_VERSION, '5.3.0', '<' )) |
||
Line 1,809: | Line 1,809: | ||
echo(array_sum($GLOBALS) . " is the total of variables in global scope.\n"); |
echo(array_sum($GLOBALS) . " is the total of variables in global scope.\n"); |
||
?></ |
?></syntaxhighlight> |
||
=={{header|PicoLisp}}== |
=={{header|PicoLisp}}== |
||
< |
<syntaxhighlight lang="picolisp">(unless (>= (version T) (3 0 1)) # Check version (only in the 64-bit version) |
||
(bye) ) |
(bye) ) |
||
Line 1,820: | Line 1,820: | ||
(num? bloop) # When 'bloop' is bound to a number |
(num? bloop) # When 'bloop' is bound to a number |
||
(getd 'abs) # and 'abs' defined as a function |
(getd 'abs) # and 'abs' defined as a function |
||
(println (abs bloop)) ) # then print the absolute value</ |
(println (abs bloop)) ) # then print the absolute value</syntaxhighlight> |
||
=={{header|PL/I}}== |
=={{header|PL/I}}== |
||
===Version 1=== |
===Version 1=== |
||
<syntaxhighlight lang="pl/i"> |
|||
<lang PL/I> |
|||
S = SYSVERSION(); |
S = SYSVERSION(); |
||
if substr(S, 6, 6) < '050000' then |
if substr(S, 6, 6) < '050000' then |
||
do; put skip list ('Version of compiler is too old'); stop; end; |
do; put skip list ('Version of compiler is too old'); stop; end; |
||
</syntaxhighlight> |
|||
</lang> |
|||
===Version 2=== |
===Version 2=== |
||
< |
<syntaxhighlight lang="pl/i">*process source attributes options m or(!); |
||
/********************************************************************* |
/********************************************************************* |
||
* 02-11.2013 Walter Pachl |
* 02-11.2013 Walter Pachl |
||
Line 1,851: | Line 1,851: | ||
Else |
Else |
||
Put Skip List('Version is '!!s); |
Put Skip List('Version is '!!s); |
||
End</ |
End</syntaxhighlight> |
||
{{out}} |
{{out}} |
||
<pre>Version is PL/I for Win* 7.5</pre> |
<pre>Version is PL/I for Win* 7.5</pre> |
||
Line 1,858: | Line 1,858: | ||
Variable pop_internal_version contains Poplog version in numeric form (as an integer) -- this one is most convenient for version checks. For printing one can use pop_version (which is a string containing more information). |
Variable pop_internal_version contains Poplog version in numeric form (as an integer) -- this one is most convenient for version checks. For printing one can use pop_version (which is a string containing more information). |
||
< |
<syntaxhighlight lang="pop11">;;; Exit if version below 15.00 |
||
if pop_internal_version < 150000 then |
if pop_internal_version < 150000 then |
||
sysexit() |
sysexit() |
||
endif;</ |
endif;</syntaxhighlight> |
||
Pop11 variables are named by words. Pop11 word is a unique version of string stored in dictionary. So we need first convert strings to words and then query about words. Pop11 variables can store any value including functions and in fact when one accesses a function like abs by name one merely access a variable abs which happen to hold predefined function abs. To follow spirit of the task as closely as possible we check if abs indeed holds functional value. |
Pop11 variables are named by words. Pop11 word is a unique version of string stored in dictionary. So we need first convert strings to words and then query about words. Pop11 variables can store any value including functions and in fact when one accesses a function like abs by name one merely access a variable abs which happen to hold predefined function abs. To follow spirit of the task as closely as possible we check if abs indeed holds functional value. |
||
< |
<syntaxhighlight lang="pop11">;;; We do main task in a procedure |
||
define check_and_call(x, y); |
define check_and_call(x, y); |
||
lvars wx=consword(x), wy=consword(y); |
lvars wx=consword(x), wy=consword(y); |
||
Line 1,881: | Line 1,881: | ||
vars bloop = -5; |
vars bloop = -5; |
||
;;; Now prints 5 |
;;; Now prints 5 |
||
check_and_call('abs' , 'bloop') =></ |
check_and_call('abs' , 'bloop') =></syntaxhighlight> |
||
Note that here bloop is defined as "permanent" variable, Pop11 also have lexical variables which are not available for introspection. |
Note that here bloop is defined as "permanent" variable, Pop11 also have lexical variables which are not available for introspection. |
||
Line 1,891: | Line 1,891: | ||
The compiler directive <code>#COMPILER</code>, introduced with PB/Win 8 and PB/CC <!--uncertain version here--> 4, will fail the compile if the compiler does not match at least one of the listed compilers, and is not at least the (optional) minimum version of that compiler. |
The compiler directive <code>#COMPILER</code>, introduced with PB/Win 8 and PB/CC <!--uncertain version here--> 4, will fail the compile if the compiler does not match at least one of the listed compilers, and is not at least the (optional) minimum version of that compiler. |
||
< |
<syntaxhighlight lang="powerbasic">#COMPILER PBWIN 9 |
||
#COMPILER PBWIN, PBCC 5</ |
#COMPILER PBWIN, PBCC 5</syntaxhighlight> |
||
=={{header|PowerShell}}== |
=={{header|PowerShell}}== |
||
< |
<syntaxhighlight lang="powershell"># version is found in $PSVersionTable |
||
if ($PSVersionTable['PSVersion'] -lt '2.0') { |
if ($PSVersionTable['PSVersion'] -lt '2.0') { |
||
exit |
exit |
||
Line 1,908: | Line 1,908: | ||
| Where-Object { $_.Value -is [int] } ` |
| Where-Object { $_.Value -is [int] } ` |
||
| Measure-Object -Sum Value ` |
| Measure-Object -Sum Value ` |
||
| Select-Object Count,Sum</ |
| Select-Object Count,Sum</syntaxhighlight> |
||
=={{header|PureBasic}}== |
=={{header|PureBasic}}== |
||
< |
<syntaxhighlight lang="purebasic">CompilerIf #PB_Compiler_Version<441 |
||
CompilerError "You failed the version check!" |
CompilerError "You failed the version check!" |
||
CompilerEndIf |
CompilerEndIf |
||
Line 1,919: | Line 1,919: | ||
Abs(bloop) |
Abs(bloop) |
||
CompilerEndIf |
CompilerEndIf |
||
CompilerEndIf</ |
CompilerEndIf</syntaxhighlight> |
||
=={{header|Python}}== |
=={{header|Python}}== |
||
< |
<syntaxhighlight lang="python"># Checking for system version |
||
import sys |
import sys |
||
major, minor, bugfix = sys.version_info[:3] |
major, minor, bugfix = sys.version_info[:3] |
||
Line 1,943: | Line 1,943: | ||
if defined2('bloop') and defined2('abs') and callable(abs): |
if defined2('bloop') and defined2('abs') and callable(abs): |
||
print abs(bloop)</ |
print abs(bloop)</syntaxhighlight> |
||
You can combine both tests, (But loose sight of which variable in missing/not callable by wrapping the whole function call in a try-except statement: |
You can combine both tests, (But loose sight of which variable in missing/not callable by wrapping the whole function call in a try-except statement: |
||
< |
<syntaxhighlight lang="python">try: |
||
print abs(bloop) |
print abs(bloop) |
||
except (NameError, TypeError): |
except (NameError, TypeError): |
||
print "Something's missing"</ |
print "Something's missing"</syntaxhighlight> |
||
Here is one way to print the sum of all the global integer variables: |
Here is one way to print the sum of all the global integer variables: |
||
< |
<syntaxhighlight lang="python">def sum_of_global_int_vars(): |
||
variables = vars(__builtins__).copy() |
variables = vars(__builtins__).copy() |
||
variables.update(globals()) |
variables.update(globals()) |
||
print sum(v for v in variables.itervalues() if type(v) == int) |
print sum(v for v in variables.itervalues() if type(v) == int) |
||
sum_of_global_int_vars()</ |
sum_of_global_int_vars()</syntaxhighlight> |
||
=={{header|R}}== |
=={{header|R}}== |
||
{{works with|R|2.14.1}} |
{{works with|R|2.14.1}} |
||
<syntaxhighlight lang="r"> |
|||
<lang R> |
|||
if(getRversion() < "2.14.1") |
if(getRversion() < "2.14.1") |
||
{ |
{ |
||
warning("Your version of R is older than 2.14.1") |
warning("Your version of R is older than 2.14.1") |
||
q() # exit R, with the option to cancel |
q() # exit R, with the option to cancel |
||
}</ |
}</syntaxhighlight> |
||
The constants <code>version</code> and <code>R.version</code> give further information about the version that is running. The function <code>R.Version()</code> provides the same information as a list. |
The constants <code>version</code> and <code>R.version</code> give further information about the version that is running. The function <code>R.Version()</code> provides the same information as a list. |
||
We now perform three checks: we want to know if bloop is in the user workspace (global environment), if abs exists somewhere, and if abs is a function. |
We now perform three checks: we want to know if bloop is in the user workspace (global environment), if abs exists somewhere, and if abs is a function. |
||
< |
<syntaxhighlight lang="r">bloop <- -3.4 |
||
if(exists("bloop", envir=globalenv()) && exists("abs") && is.function(abs)) |
if(exists("bloop", envir=globalenv()) && exists("abs") && is.function(abs)) |
||
{ |
{ |
||
abs(bloop) |
abs(bloop) |
||
}</ |
}</syntaxhighlight> |
||
Finally, we count how many integers are in the user workspace, and find their total. Note that a number followed by the letter L is considered to be an integer. See [[Integer_literals#R]] for more information. |
Finally, we count how many integers are in the user workspace, and find their total. Note that a number followed by the letter L is considered to be an integer. See [[Integer_literals#R]] for more information. |
||
< |
<syntaxhighlight lang="r">#Declare some integers |
||
qqq <- 45L |
qqq <- 45L |
||
www <- -3L |
www <- -3L |
||
Line 1,988: | Line 1,988: | ||
the_ints <- mget(varnames[is_int], globalenv()) |
the_ints <- mget(varnames[is_int], globalenv()) |
||
#Add them up |
#Add them up |
||
sum(unlist(the_ints))</ |
sum(unlist(the_ints))</syntaxhighlight> |
||
=={{header|Racket}}== |
=={{header|Racket}}== |
||
The usual hack: |
The usual hack: |
||
<syntaxhighlight lang="racket"> |
|||
<lang Racket> |
|||
#lang racket |
#lang racket |
||
(unless (string<=? "5.3" (version)) (error "ancient version")) |
(unless (string<=? "5.3" (version)) (error "ancient version")) |
||
</syntaxhighlight> |
|||
</lang> |
|||
Proper comparison: |
Proper comparison: |
||
<syntaxhighlight lang="racket"> |
|||
<lang Racket> |
|||
(require version/utils) |
(require version/utils) |
||
(unless (version<=? "5.3" (version)) (error "ancient version")) |
(unless (version<=? "5.3" (version)) (error "ancient version")) |
||
</syntaxhighlight> |
|||
</lang> |
|||
=={{header|Raku}}== |
=={{header|Raku}}== |
||
(formerly Perl 6) |
(formerly Perl 6) |
||
<lang |
<syntaxhighlight lang="raku" line>my $bloop = -123; |
||
if MY::{'$bloop'}.defined and CORE::{'&abs'}.defined { say abs $bloop } |
if MY::{'$bloop'}.defined and CORE::{'&abs'}.defined { say abs $bloop } |
||
Line 2,012: | Line 2,012: | ||
my @ints = ($_ when Int for PROCESS::.values); |
my @ints = ($_ when Int for PROCESS::.values); |
||
say "Number of PROCESS vars of type Int: ", +@ints; |
say "Number of PROCESS vars of type Int: ", +@ints; |
||
say "PROCESS vars of type Int add up to ", [+] @ints;</ |
say "PROCESS vars of type Int add up to ", [+] @ints;</syntaxhighlight> |
||
{{out}} |
{{out}} |
||
<pre>123 |
<pre>123 |
||
Line 2,023: | Line 2,023: | ||
=={{header|Raven}}== |
=={{header|Raven}}== |
||
< |
<syntaxhighlight lang="raven">VERSION 0 prefer 20071104 < |
||
if 'version >= 20071104 required' print bye |
if 'version >= 20071104 required' print bye |
||
'bloop' GLOBAL keys in && 'abs' CORE keys in |
'bloop' GLOBAL keys in && 'abs' CORE keys in |
||
if bloop abs print</ |
if bloop abs print</syntaxhighlight> |
||
=={{header|Retro}}== |
=={{header|Retro}}== |
||
This will exit if the version is less than 2019.6: |
This will exit if the version is less than 2019.6: |
||
< |
<syntaxhighlight lang="retro">@Version #201906 lt+ &bye if</syntaxhighlight> |
||
The existence of functions can be checked using '''d:lookup'''. In this, a helper function is provided to improve readability. |
The existence of functions can be checked using '''d:lookup'''. In this, a helper function is provided to improve readability. |
||
<syntaxhighlight lang="retro"> |
|||
<lang Retro> |
|||
Checks for existence of "bloop" and "n:abs" |
Checks for existence of "bloop" and "n:abs" |
||
Line 2,045: | Line 2,045: | ||
'bloop 'n:abs [ find nip ] bi@ and |
'bloop 'n:abs [ find nip ] bi@ and |
||
[ 'bloop executeByName 'n:abs executeByName ] if |
[ 'bloop executeByName 'n:abs executeByName ] if |
||
~~~</ |
~~~</syntaxhighlight> |
||
Retro has no direct way to check for data types of functions. Assuming that a word class is defined for integer variables, we could do something like this: |
Retro has no direct way to check for data types of functions. Assuming that a word class is defined for integer variables, we could do something like this: |
||
<syntaxhighlight lang="retro"> |
|||
<lang Retro> |
|||
#0 #0 [ dup d:class fetch &class:integer eq? [ d:xt fetch + [ n:inc ] dip ] [ drop ] choose ] d:for-each |
#0 #0 [ dup d:class fetch &class:integer eq? [ d:xt fetch + [ n:inc ] dip ] [ drop ] choose ] d:for-each |
||
</syntaxhighlight> |
|||
</lang> |
|||
After execution the stack will have the number of variables found, and the accumulated sum of their values. |
After execution the stack will have the number of variables found, and the accumulated sum of their values. |
||
Line 2,057: | Line 2,057: | ||
=={{header|REXX}}== |
=={{header|REXX}}== |
||
Test to see if the version is at least version 4. |
Test to see if the version is at least version 4. |
||
< |
<syntaxhighlight lang="rexx"> /*output from parse version (almost all REXX versions) */ |
||
/* theREXXinterpreterName level mm Mon yyyy */ |
/* theREXXinterpreterName level mm Mon yyyy */ |
||
parse version . level . |
parse version . level . |
||
if level<4 then exit</ |
if level<4 then exit</syntaxhighlight> |
||
Test to see if the version is at least version 4, another example. |
Test to see if the version is at least version 4, another example. |
||
< |
<syntaxhighlight lang="rexx">parse version x 1 whatLang level dd mon yyyy . |
||
if level<4 then do |
if level<4 then do |
||
say |
say |
||
Line 2,068: | Line 2,068: | ||
say x /*this displays everything.*/ |
say x /*this displays everything.*/ |
||
exit /*or maybe: EXIT 13 */ |
exit /*or maybe: EXIT 13 */ |
||
end</ |
end</syntaxhighlight> |
||
Test to see if the REXX variable "bloop" exists, version 1. |
Test to see if the REXX variable "bloop" exists, version 1. |
||
< |
<syntaxhighlight lang="rexx">if symbol('bloop')=='VAR' then say 'the "bloop" variable exists.'</syntaxhighlight> |
||
Test to see if the REXX variable "bloop" exists, version 2. |
Test to see if the REXX variable "bloop" exists, version 2. |
||
< |
<syntaxhighlight lang="rexx">if symbol('bloop')=='VAR' then say 'the "bloop" variable exists.' |
||
else say 'the "bloop" variable doesn''t exist.'</ |
else say 'the "bloop" variable doesn''t exist.'</syntaxhighlight> |
||
Programming note: note the use of the double apostrophe (<big>''' ' ' '''</big>) which is within a quoted string (with apostrophes) [in the above and below REXX programming examples]. |
Programming note: note the use of the double apostrophe (<big>''' ' ' '''</big>) which is within a quoted string (with apostrophes) [in the above and below REXX programming examples]. |
||
<br>Another test to see if the REXX variable "bloop" exists. |
<br>Another test to see if the REXX variable "bloop" exists. |
||
< |
<syntaxhighlight lang="rexx">bloop=47 |
||
if symbol('bloop')=='VAR' then say 'the "bloop" variable exists.' |
if symbol('bloop')=='VAR' then say 'the "bloop" variable exists.' |
||
else say 'the "bloop" variable doesn''t exist.'</ |
else say 'the "bloop" variable doesn''t exist.'</syntaxhighlight> |
||
In REXX, the ABS function is a built-in function (BIF). |
In REXX, the ABS function is a built-in function (BIF). |
||
< |
<syntaxhighlight lang="rexx">bloop=47 |
||
g=abs(bloop)</ |
g=abs(bloop)</syntaxhighlight> |
||
However, most REXX interpreters will allow this type of test: |
However, most REXX interpreters will allow this type of test: |
||
< |
<syntaxhighlight lang="rexx">if testxyz() then say 'function XYZ not found.' |
||
else say 'function XYZ was found.' |
else say 'function XYZ was found.' |
||
exit |
exit |
||
Line 2,092: | Line 2,092: | ||
return 0 |
return 0 |
||
/*──────────────────────────────────────────────────────────────────────────────────────*/ |
/*──────────────────────────────────────────────────────────────────────────────────────*/ |
||
syntax: return 1</ |
syntax: return 1</syntaxhighlight> |
||
=={{header|Ring}}== |
=={{header|Ring}}== |
||
< |
<syntaxhighlight lang="ring"> |
||
# Project: Introspection |
# Project: Introspection |
||
Line 2,127: | Line 2,127: | ||
func abs(bloop) |
func abs(bloop) |
||
return fabs(bloop) |
return fabs(bloop) |
||
</syntaxhighlight> |
|||
</lang> |
|||
Output: |
Output: |
||
<pre> |
<pre> |
||
Line 2,138: | Line 2,138: | ||
=={{header|Ruby}}== |
=={{header|Ruby}}== |
||
< |
<syntaxhighlight lang="ruby">exit if RUBY_VERSION < '1.8.6' |
||
puts bloop.abs if defined?(bloop) and bloop.respond_to?(:abs)</ |
puts bloop.abs if defined?(bloop) and bloop.respond_to?(:abs)</syntaxhighlight> |
||
'''Extra credit:''' |
'''Extra credit:''' |
||
< |
<syntaxhighlight lang="ruby">def variable_counter(b) |
||
int_vars = [] |
int_vars = [] |
||
sum = 0 |
sum = 0 |
||
Line 2,164: | Line 2,164: | ||
a_float = 3.14 |
a_float = 3.14 |
||
variable_counter(binding)</ |
variable_counter(binding)</syntaxhighlight> |
||
{{out}} |
{{out}} |
||
Line 2,179: | Line 2,179: | ||
=={{header|Scala}}== |
=={{header|Scala}}== |
||
< |
<syntaxhighlight lang="scala">object VersCheck extends App { |
||
val minimalVersion = 1.7 |
val minimalVersion = 1.7 |
||
Line 2,187: | Line 2,187: | ||
val bloop = Option(-42) |
val bloop = Option(-42) |
||
if (bloop.isDefined) bloop.get.abs |
if (bloop.isDefined) bloop.get.abs |
||
}</ |
}</syntaxhighlight> |
||
=={{header|Slate}}== |
=={{header|Slate}}== |
||
No version string included inside the system presently. |
No version string included inside the system presently. |
||
< |
<syntaxhighlight lang="slate">Platform run: StartupArguments first ; ' --version'.</syntaxhighlight> |
||
< |
<syntaxhighlight lang="slate">(lobby hasSlotNamed: #bloop) /\ [(#abs findOn: {lobby bloop}) isNotNil] ifTrue: [inform: bloop abs printString]. |
||
lobby slotValues inject: 0 into: [| :sum :value | (value is: Integer) ifTrue: [sum + value] ifFalse: [sum]].</ |
lobby slotValues inject: 0 into: [| :sum :value | (value is: Integer) ifTrue: [sum + value] ifFalse: [sum]].</syntaxhighlight> |
||
=={{header|Smalltalk}}== |
=={{header|Smalltalk}}== |
||
{{works with|GNU Smalltalk}} |
{{works with|GNU Smalltalk}} |
||
< |
<syntaxhighlight lang="smalltalk">| s v t sum hm | |
||
"uncomment the following to see what happens if bloop exists" |
"uncomment the following to see what happens if bloop exists" |
||
"Smalltalk at: #bloop put: -10." |
"Smalltalk at: #bloop put: -10." |
||
Line 2,235: | Line 2,235: | ||
] . |
] . |
||
Transcript show: 'Num of global numeric vars: '; show: (hm printString); cr ; |
Transcript show: 'Num of global numeric vars: '; show: (hm printString); cr ; |
||
show: 'Sum of global numeric vars: '; show: (sum printString) ; cr.</ |
show: 'Sum of global numeric vars: '; show: (sum printString) ; cr.</syntaxhighlight> |
||
=={{header|Tcl}}== |
=={{header|Tcl}}== |
||
< |
<syntaxhighlight lang="tcl">package require Tcl 8.4 ; # throws an error if older |
||
if {[info exists bloop] && [llength [info functions abs]]} { |
if {[info exists bloop] && [llength [info functions abs]]} { |
||
puts [expr abs($bloop)] |
puts [expr abs($bloop)] |
||
}</ |
}</syntaxhighlight> |
||
'''Extra credit:''' |
'''Extra credit:''' |
||
< |
<syntaxhighlight lang="tcl">namespace eval ::extra_credit { |
||
variable sum_global_int 0 |
variable sum_global_int 0 |
||
variable n_global_int 0 |
variable n_global_int 0 |
||
Line 2,257: | Line 2,257: | ||
puts "number of global ints = $n_global_int" |
puts "number of global ints = $n_global_int" |
||
puts "their sum = $sum_global_int" |
puts "their sum = $sum_global_int" |
||
}</ |
}</syntaxhighlight> |
||
=={{header|TI-89 BASIC}}== |
=={{header|TI-89 BASIC}}== |
||
< |
<syntaxhighlight lang="ti89b">() |
||
Prgm |
Prgm |
||
Local l, i, vers |
Local l, i, vers |
||
Line 2,284: | Line 2,284: | ||
© There is no way to get a list of global variables. |
© There is no way to get a list of global variables. |
||
EndPrgm</ |
EndPrgm</syntaxhighlight> |
||
=={{header|Toka}}== |
=={{header|Toka}}== |
||
Line 2,291: | Line 2,291: | ||
Starting with Release 1.1, Toka allows for checking the version number: |
Starting with Release 1.1, Toka allows for checking the version number: |
||
< |
<syntaxhighlight lang="toka">VERSION 101 > [ bye ] ifFalse</syntaxhighlight> |
||
Release 1.0 can be detected by doing: |
Release 1.0 can be detected by doing: |
||
< |
<syntaxhighlight lang="toka">` VERSION FALSE = [ bye ] ifTrue</syntaxhighlight> |
||
Basic introspection is possible via '''`''' |
Basic introspection is possible via '''`''' |
||
< |
<syntaxhighlight lang="toka">` bloop FALSE <> ` abs FALSE <> and [ ` bloop invoke @ ` abs invoke ] ifTrue</syntaxhighlight> |
||
=={{header|UNIX Shell}}== |
=={{header|UNIX Shell}}== |
||
{{works with|ksh93}} |
{{works with|ksh93}} |
||
There's no way to introspect the builtin arithmetic functions. We'll just try it and see if there's an error. |
There's no way to introspect the builtin arithmetic functions. We'll just try it and see if there's an error. |
||
< |
<syntaxhighlight lang="bash">case ${.sh.version} in |
||
*93[[:alpha:]]+*) :;; #this appears to be ksh93, we're OK |
*93[[:alpha:]]+*) :;; #this appears to be ksh93, we're OK |
||
*) echo "version appears to be too old" |
*) echo "version appears to be too old" |
||
Line 2,325: | Line 2,325: | ||
done |
done |
||
print "${int_vars[*]}" |
print "${int_vars[*]}" |
||
print -- $sum</ |
print -- $sum</syntaxhighlight> |
||
{{works with|bash}} |
{{works with|bash}} |
||
bash does not have a builtin math function "abs" -- we'll check for a user-defined shell function instead. |
bash does not have a builtin math function "abs" -- we'll check for a user-defined shell function instead. |
||
< |
<syntaxhighlight lang="bash">if [[ $BASH_VERSION < "4.2" ]]; then |
||
echo "version is too old" |
echo "version is too old" |
||
exit |
exit |
||
Line 2,354: | Line 2,354: | ||
echo "${int_vars[*]}" |
echo "${int_vars[*]}" |
||
echo $sum |
echo $sum |
||
}</ |
}</syntaxhighlight> |
||
=={{header|Ursala}}== |
=={{header|Ursala}}== |
||
Line 2,379: | Line 2,379: | ||
1 by the time it's displayed. |
1 by the time it's displayed. |
||
< |
<syntaxhighlight lang="ursala">#import std |
||
#import flo |
#import flo |
||
#import lag |
#import lag |
||
Line 2,391: | Line 2,391: | ||
#cast %e |
#cast %e |
||
bloop = -1.</ |
bloop = -1.</syntaxhighlight> |
||
{{out}} |
{{out}} |
||
<pre>1.000000e+00</pre> |
<pre>1.000000e+00</pre> |
||
Line 2,401: | Line 2,401: | ||
To determine the version of the environment -- typically meaning which version of Microsoft Office is running -- the <code>Application</code> object has a <code>Version</code> property: |
To determine the version of the environment -- typically meaning which version of Microsoft Office is running -- the <code>Application</code> object has a <code>Version</code> property: |
||
< |
<syntaxhighlight lang="vb">If Application.Version < 15 Then Exit Sub</syntaxhighlight> |
||
=={{header|Wren}}== |
=={{header|Wren}}== |
||
Line 2,411: | Line 2,411: | ||
* Wren doesn't have reflection as such but is able to obtain and analyze the running script's source code. It is assumed for this purpose that the latter is sensibly formatted - only global declarations are not indented. |
* Wren doesn't have reflection as such but is able to obtain and analyze the running script's source code. It is assumed for this purpose that the latter is sensibly formatted - only global declarations are not indented. |
||
* Wren is dynamically typed and has a Num type but not an integer type. As far as the extra credit is concerned, the simplifying assumption has been made that a global variable is an integer if it's assigned an integer literal when it's declared. |
* Wren is dynamically typed and has a Num type but not an integer type. As far as the extra credit is concerned, the simplifying assumption has been made that a global variable is an integer if it's assigned an integer literal when it's declared. |
||
< |
<syntaxhighlight lang="ecmascript">import "os" for Platform, Process |
||
import "io" for File |
import "io" for File |
||
import "meta" for Meta |
import "meta" for Meta |
||
Line 2,456: | Line 2,456: | ||
var vars = res[0] |
var vars = res[0] |
||
var vals = res[1] |
var vals = res[1] |
||
System.print("The sum of the %(vars.count) integer variables, %(vars), is %(Nums.sum(vals))"</ |
System.print("The sum of the %(vars.count) integer variables, %(vars), is %(Nums.sum(vals))"</syntaxhighlight> |
||
{{out}} |
{{out}} |
||
Line 2,465: | Line 2,465: | ||
=={{header|Yabasic}}== |
=={{header|Yabasic}}== |
||
< |
<syntaxhighlight lang="yabasic">if peek("version") < 2.63 error "Interpreter version is too old!"</syntaxhighlight> |
||
=={{header|zkl}}== |
=={{header|zkl}}== |
||
< |
<syntaxhighlight lang="zkl">Language.version //-->L(1,12,8,"2014-04-01") |
||
if (Language.version[1] < 10) System.exit("Too old"); |
if (Language.version[1] < 10) System.exit("Too old"); |
||
var bloop=-123; |
var bloop=-123; |
||
if ((1).resolve("abs",1) and resolve("bloop",8)) bloop.abs().println()</ |
if ((1).resolve("abs",1) and resolve("bloop",8)) bloop.abs().println()</syntaxhighlight> |
||
{{out}}<pre>123</pre> |
{{out}}<pre>123</pre> |
||
The concept of global vars doesn't really exist, only instance data. |
The concept of global vars doesn't really exist, only instance data. |
||
< |
<syntaxhighlight lang="zkl">var n=3, x=1.0, a=5, z="zoo"; |
||
self.vars; --> L(L("a",5),L("n",3),L("x",1),L("z","zoo")) |
self.vars; --> L(L("a",5),L("n",3),L("x",1),L("z","zoo")) |
||
sum:=self.vars.reduce(fcn(p,[(nm,v)],r){ |
sum:=self.vars.reduce(fcn(p,[(nm,v)],r){ |
||
if((1).isType(v)){r.inc();p+v;} else p},0,num:=Ref(0)); |
if((1).isType(v)){r.inc();p+v;} else p},0,num:=Ref(0)); |
||
println("Num int vars = ",num.value,". Sum = ",sum);</ |
println("Num int vars = ",num.value,". Sum = ",sum);</syntaxhighlight> |
||
{{out}}<pre>Num int vars = 2. Sum = 8</pre> |
{{out}}<pre>Num int vars = 2. Sum = 8</pre> |
||
=={{header|ZX Spectrum Basic}}== |
=={{header|ZX Spectrum Basic}}== |
||
< |
<syntaxhighlight lang="zxbasic">10 LET totram=PEEK 23732 + 256 * PEEK 23733: REM Check that we have a 48k machine |
||
20 IF totram < 65535 THEN PRINT "Your 16k Spectrum is too old": STOP |
20 IF totram < 65535 THEN PRINT "Your 16k Spectrum is too old": STOP |
||
30 REM variables must exist before they are used, otherwise we get an error |
30 REM variables must exist before they are used, otherwise we get an error |
||
Line 2,489: | Line 2,489: | ||
50 REM I haven't implemented this, because I have forgotten the handler address |
50 REM I haven't implemented this, because I have forgotten the handler address |
||
60 LET bloob = -4: REM make sure bloob exists, by creating it. |
60 LET bloob = -4: REM make sure bloob exists, by creating it. |
||
70 PRINT ABS(bloob): REM function will be present, ZX Spectrum Basic is standardized.</ |
70 PRINT ABS(bloob): REM function will be present, ZX Spectrum Basic is standardized.</syntaxhighlight> |
||
{{omit from|6502 Assembly|(1) depends on the hardware, (2) variable names don't exist at runtime, (3) everything is global scope.}} |
{{omit from|6502 Assembly|(1) depends on the hardware, (2) variable names don't exist at runtime, (3) everything is global scope.}} |