http://qs321.pair.com?node_id=813570


in reply to Hints Towards Writing a Module with New Operators

The little Fortran documentation that I can find by Googling suggests that, as moritz (implicitly) points out, .EQV. is just == on Booleans. If this is correct, are you just looking to bring to Perl the syntactic beauty of Fortran :-)—or is it that you want something that does the Boolean conversion for you, so that you can write $a .EQV. $b ** as the equivalent of $a ? $b ? 1 : 0 : $b ? 0 : 1 *?

Either way, as moritz says, for adding new syntax to Perl-as-it-now-is, I think that the only options are syntax filters (struck out as I write it so that you don't even think about it) or Devel::Declare (which worries adamk).

* Or ($a && $b) || !($a || $b), I suppose. UPDATE: Ha, and maybe I'd like to write my own routines for addition while I'm at it. Thanks, JavaFan. :-)

UPDATE: ** Note that this precise syntax conflicts with string concatenation, but we shouldn't be using barewords anyway.

Replies are listed 'Best First'.
Re^2: Hints Towards Writing a Module with New Operators
by JavaFan (Canon) on Dec 20, 2009 at 01:00 UTC

      Or

      1. .NEQV. ~= $a ^ $b
      2. .EQV. ~= !($a ^ $b)

      Examine what is said, not who speaks -- Silence betokens consent -- Love the truth but pardon error.
      "Science is about questioning the status quo. Questioning authority".
      In the absence of evidence, opinion is indistinguishable from prejudice.
        Those aren't the same:
        !(2 xor 1); # => 1 !(2 ^ 1); # => 0
Re^2: Hints Towards Writing a Module with New Operators
by ikegami (Patriarch) on Dec 20, 2009 at 08:48 UTC

    You could also use

    !$a == !$b

    but that relies on the fact than the true and false values returned by Perl ops are 1) always the same, and 2) numeric*. xor is definitely the way to go.

    * — They're also strings, but that's not relevant here.

Re^2: Hints Towards Writing a Module with New Operators
by swampyankee (Parson) on Dec 20, 2009 at 23:14 UTC

    Considering .EQV. as == for booleans is more or less correct: a .eqv. b is true if a and b are either both true or both false, and it would result in false otherwise. Most modern Fortran compilers will squawk if either a or b isn't a boolean (Fortran logical), so a fragment like

    logical boole integer int int = 42 boole = .TRUE. write(*,*) 'is int .eqv. boole true?', int .eqv. boole
    will cause a compile-time error, which is, on the whole, probably a good thing. As I said in my original post, I've been programming Fortran for quite a few years and never found a use for .eqv. or .neqv.. As an aside, Fortran is insensitive to case; I tend to use uppercase for Fortran keywords and lowercase for everything else.


    Information about American English usage here and here. Floating point issues? Please read this before posting. — emc