日々常々

ふつうのプログラマがあたりまえにしたいこと。

素数かを調べる

今日は11日です。

でも11が素数かは不安なので、本当に素数かどうか調べないといけません。

Javaでやってみる

public class Main {
	static int value = 11;

	public static void main(String[] args) {
		for (int i = 2; i < value; i++) {
			if (value % i == 0) {
				System.out.println(false);
				return;
			}
		}
		System.out.println(true);
	}
}

(もうちょい面倒だと思ったのに…)

Groovyでやってみる

こういうのはJavaでやると面倒なので、Groovy(勉強中)でやってみよう。

def value = 11
println value <= 2 || (2..value-1).every {
    value % it != 0
}

…なんかごっちゃりした。

1行にしてみる

無理矢理1行で書いてもあまり嬉しくない。

def value = 11;println value <= 2 || (2..value-1).every{value % it != 0}

Object (Groovy JDK)眺めてたら with ってのがあるっぽい。あと ..< 使って、0はfalseだから省略出来る。

println 11.with{i -> (2..<i).every{i % it}}

こんなもんかな?

折角なのでコマンドラインから実行

PS> groovy -e "println 11.with{i -> (2..<i).every{i % it}}"
指定されたファイルが見つかりません。
指定されたファイルが見つかりません。
コマンドの構文が誤っています。

…なんだこりゃ?ファイルに保存したら実行できたけど、それじゃ嬉しくない。うーん。

ベタ書きカッコワルイのでパラメータを受けるようにする

println ((args[0] as int).with{i -> (2..<i).every{i % it}})

ハマったとこ

一番外側のカッコを付けないと動かないんですが、エラーがイマイチ理解できなくてしばらく首捻ってました。println(args[0] as int) の戻り(voidだからnullっぽい?)に with 呼んで、それが入っている i と 2 を比較しようとしたところでコケる感じです。
その部分だけ切り出してgroovyshで実行するとこんな感じ。

groovy:000> null.with{it <= 2}
ERROR groovy.lang.GroovyRuntimeException:
Cannot compare org.codehaus.groovy.runtime.NullObject with value 'null' and java.lang.Integer with value '2'
        at groovysh_evaluate$_run_closure1.doCall (groovysh_evaluate:2)
        at groovysh_evaluate.run (groovysh_evaluate:2)

NullPointerExceptionにはならないんですね。