Hatena::ブログ(Diary)

ラシウラ このページをアンテナに追加 RSSフィード Twitter

2008-03-29

各言語でのnot 0やnot nilの値

スクリプト言語では、not演算子がいろいろなタイプオブジェクトに対して作用するようになっているのがおおい。しかし、not 0やnot nilがどうなるかの仕様はばらばらだったりするので、コードを読むときいつものことだが混乱する。

言語0null/nil/None/undef/...その他
ECMAScriptfalsefalse
phpfalsefalse
pythonfalsefalse
perlfalsefalsefor文ではまた別
rubytruefalse
Luatruefalse
schemetruetrue

false/falseになるのは、0をfalseやnullとして使っていたC言語に合わせているからだろうか。

自分で条件式を書く場合は、数値なら != 0や > 0(にあたるもの)はつけるようにしている。nullのほうは、そのまま渡してつけないことが多いかなあ(schemeは別として)。

javascript

print(!0);
if (0) print("0 is true");
print(!null);
if (null) print("null is true");
$ js not0.js
true
true

lua

print(not 0)
if 0 then print("0 is true") end
print(not nil)
if nil then print("nil is true") end
false
0 is true
true

php

<?php
echo !0;
echo "\n";
if (0) echo "0 is true\n";
echo !null;
echo "\n";
if (null) echo "null is true\n";
?>
$ php not0.php
1
1

perl

use strict;
use warnings;

print not 0;
print "\n";
print "0 is true\n" if 0;
print "0 is true at for\n" for 0;
print not undef;
print "\n";
print "undef is true\n" if undef;
print "undef is true at for\n" for undef;
print not ();
print "\n";
print "() is true\n" if (());
print "() is true at for\n" for (());
$ perl not0.pl
1
0 is true at for
1
undef is true at for
1

python

print(not 0)
if 0: print("0 is true")
print(not None)
if None: print("None is true")

$ python not0.py
True
True

ruby

p (not 0)
p "0 is true" if 0
p (not nil)
p "nil is true" if nil
$ ruby not0.rb
false
"0 is true"
true

scheme

(display (not 0))
(newline)
(if 0 (begin
        (display "0 is true")
        (newline)))
(display (not '()))
(newline)
(if '() (begin
          (display "nil is true")
          (newline)))
$ gosh not0.scm
#f
0 is true
#f
nil is true

sadakomasadakoma 2008/11/28 00:32 今更で恐縮ですが…
現在のschemeにはnilは存在しません(R3RSまではあったらしいです)
評価して偽になるのは#fだけです。
記事中の「'nil」はただの「nil」のクォートでしかありません。

bellbindbellbind 2008/12/23 05:03 nil→()にしておきました

はてなユーザーのみコメントできます。はてなへログインもしくは新規登録をおこなってください。

トラックバック - http://d.hatena.ne.jp/bellbind/20080329/1206745944