[Info-vax] basic BASIC question

Arne Vajhøj arne at vajhoej.dk
Thu Feb 6 22:15:18 EST 2025


On 2/6/2025 4:20 PM, Lawrence D'Oliveiro wrote:
> On Thu, 6 Feb 2025 11:04:12 -0500, Arne Vajhøj wrote:
>> If JavaScript was unique in the web frontend world for lack of type
>> safety, then the lack of type safety could be due to its history.
>> Other popular languages like PHP and Python also has a relaxed
>> approach to types.
> 
> Worth being clear what we’re talking about. None of these languages is
> type-unsafe in the way that C, for example, allows free typecasting
> between unrelated types, and in particular between pointers to unrelated
> types. They are all dynamic languages, and every value that a variable can
> hold does have an explicit type, and conversions between types follow
> well-founded semantic rules.
> 
> However, JavaScript and PHP have a laissez-faire attitude to equivalences
> with strings, and will happily autoconvert between strings and non-string
> types in various situations, often leading to surprising results. This is
> why both those languages have the “===” comparison operator as a stricter
> form of “==” which says “turn off these string-nonstring autoconversions”.
> 
> Python never had this particular bit of brain damage. But it does still
> have that common weakness with booleans. Which is a more manageable issue.

There are different conventions.

$ type cmp.php
<?php

function test($a, $b) {
     if($a == $b) {
         echo "true ";
     } else {
         echo "false ";
     }
     if($a === $b) {
         echo "true\r\n";
     } else {
         echo "false\r\n";
     }
}

test(0, 0);
test(0, 0.0);
test(0, '0');
test(0, 'X');
test(0, False);
test(0, null);

?>
$ php cmp.php
true true
true false
true false
false false
true false
true false
$ type cmp.py
def test(a, b):
     if a == b:
         print('true')
     else:
         print('false')

test(0, 0)
test(0, 0.0)
test(0, '0')
test(0, 'X')
test(0, False)
test(0, None)

$ python cmp.py
true
true
false
false
true
false
$ type Cmp.groovy
def test(a, b) {
     if(a == b) {
         println("true")
     } else {
         println("false")
     }
}

test(0, 0)
test(0, 0.0)
test(0, "0")
test(0, "X")
test(0, false)
test(0, null)

$ groovy Cmp.groovy
true
true
false
false
false
false
$ type Cmp.java
public class Cmp {
     private static void test(Object a, Object b) {
         if(a.equals(b)) {
             System.out.println("true");
         } else {
             System.out.println("false");
         }
     }
     public static void main(String[] args) {
         test(0, 0);
         test(0, 0.0);
         test(0, "0");
         test(0, "X");
         test(0, false);
         test(0, null);
     }
}
$ javac Cmp.java
$ java Cmp
true
false
false
false
false
false

Arne



More information about the Info-vax mailing list