2015/09/24


追記 perl もでした。。。

随分前の話だけど

t○kuhirom

と言われたので纏めておきます。

Javascript

console.log("".split(",").length); // 1

Perl

my @a = split /,/,"";
warn length @a# 1

Python

print len("".split(",")) # 1

Ruby

puts "a".split(/,/).size # 1

そうそう

puts "".split(/,/).size # 0

えっ

この辺の動きが言語毎に違うと困ったりしないんだろうか。

追記

すいませんすいません。perl も同じでした。。。

my @a = split /,/"";
warn scalar @a# 0


1日1個 golang のクイズを出す @DailyGolangQuiz という twitter アカウントを見つけたので既存の質問に答えてみた。

golang の string は len でバイト列数が返ります。スマイル絵文字は 4 バイトです。

golang の range-for はバインド変数を1つ取る時はインデックスが返ります(2つの場合は2つ目が実値)。for が2回実行されます。よって 0 + 1 で答えは 1 です。

golang の string は添え字を使うとバイトが、sliceでバイト列が返ります。文字として扱うには rune でキャストする必要があります。

package main
import."fmt"
func main(){Println("Go home!"[0:1]);Println(string(([]rune)("🏠🚴")[0:1]))}

golang のレシーバはメソッド呼び出し時にコピーされます。Do を呼び出してレシーバ t をそのまま扱うには Do の宣言でレシーバをポインタで宣言する必要があります。アスタリスク1文字だけ足します。

package main
import . "fmt"
type T struct { V int }
func (t *T) Do() { t.V=1 }
func main() { t := T{}; t.Do(); Println(t.V); }

一見リファレンスしていない様に見えますが、実際には C 言語でいう t->V = 1 と同じ働きとなります。

golang の switch は引数を取らない記述が可能です。この場合の switch は評価値を持っていません。実際には以下と同じ意味となります。

package main

import . "fmt"

func main() {
    switch ok := false; {
    case true:
        Println("1", ok)
    case false:
        Println("0", ok)
    }
}

実際に発言のコードを golang playground で Format すると上記のコードに変換されるのが分かるはずです。


2015/09/17


Perl6 のパッケージマネージャ Panda を使っていて projects.json が壊れた様な動きをしてて、「あー、Perl6 はまだエコシステムとして完成していないなー」とか思っていたのだけど、どうやら違って Panda が使っている JSON パーサ JSON::Fast の非常にイケてない事が分かった。しかもパンダもパンダで

my $list = try from-json $contents;

try を付けて呼び出してるので JSON::Fast が読み込みに失敗していてもエラーが無視されてしまう。よってモジュール名からリポジトリ名を得られずに Panda が寝たままになってしまう。最悪だ、このパンダ野郎!

イラッとしたので

$ panda install git://github.com/tony-o/perl6-json-faster.git

この様にして JSON::Fast よりも 4093% も速く、そして安定している JSON::Faster を入れ

--- Ecosystem.pm.org    2015-09-17 21:42:09.334540500 +0900
+++ Ecosystem.pm    2015-09-17 22:00:38.246420600 +0900
@@ -1,7 +1,7 @@
 class Panda::Ecosystem {
     use Panda::Project;
     use Panda::Common;
-    use JSON::Fast;
+    use JSON::Faster;
     use Shell::Command;
 
     has $.statefile;
@@ -20,7 +20,7 @@
                 for $fh.lines -> $line {
                     my ($mod, $state, $json) = split ' ', $line, 3;
                     %!states{$mod} = ::("Panda::Project::State::$state");
-                    %!saved-meta{$mod} = from-json $json;
+                    %!saved-meta{$mod} = try from-json $json;
                 }
                 $fh.close;
             }

Panda を弄ってやったらメチャクチャご機嫌になった。起きろパンダ!