素敵!
らばQ:「え?なに?なんなの?」この世で最も役に立たないマシンが完成していた(動画)「最も」とか「一番」と言った最上級の表現は、安易に使うべきではないかもしれません。
ですが、さすがにこれ以上無意味なものも無いのでは、と思ってしまう機械がありました。
これをソフトウェアでやるとどうなるか。
Javascript (@spidermonkey)
簡単に出来た。が、arguments.calleeへの代入はやはり駄目。
#!/usr/bin/js
pointless = function(){
print("turning off myself");
// arguments.callee = undefined;
pointless = undefined;
};
pointless();
pointless();
Scheme (@gauche)
こちらも素直。
#!/usr/bin/gosh (define (pointless) (print "Turning off myself = " pointless) (set! pointless #f)) (pointless) (pointless)
Perl
意外なことに、これが動かない。
#!/usr/bin/perl
use strict;
use warnings;
sub pointless{
printf "Turning off myself = 0x%X\n", \&pointless;
*pointless = undef; # undef &pointless;
};
pointless;
pointless;
そしてこれはもっと以外なエラーになる。
#!/usr/bin/perl
use strict;
use warnings;
sub pointless{
printf "Turning off myself = 0x%X\n", \&pointless;
undef &pointless;
};
pointless;
pointless;
しかし、以下は期待通り。
#!/usr/bin/perl
use strict;
use warnings;
my $pointless;
$pointless = sub {
printf "Turning off myself = 0x%X\n", $pointless;
undef $pointless;
};
$pointless->();
$pointless->();
Ruby
他と同様。だけどdefでやるにはどうしたらよいのだろう....
#!/usr/bin/ruby
pointless = Proc.new do
p "Turning off myself = #{pointless}"
pointless = nil
end
pointless.call
pointless.call
あと、Pythonだとなんだかうまく行かない。解答募集中。
C
クロージャーがサポートされている言語でこれが出来るのはそれほど驚かない。が、Cでも出来てしまう。久しぶりにCodePadのお世話に。
ただし、これでは駄目。
#include <stdlib.h>
#include <stdio.h>
void pointless(){
fprintf(stderr, "turing off myself = 0x%X\n", (int)pointless);
pointless = NULL;
}
int main (){
pointless();
pointless();
return 0;
}
Run @codepad
こう書き換えればおk。
void pointless(){
fprintf(stderr, "turing off myself = 0x%X\n", (int)pointless);
/* pointless = NULL */
void **point = (void **)pointless;
*point = NULL;
}
Run @codepad
こうして意味のない関数をいろいろ書いたら、意味のないものづくりにも意義が感じられてしまった。他の解答も募集中。
Dan the Pointless Programmer
案外知られてないのかなぁ。