Sphereとともに

scalaとかplayframeworkとか。技術ブログにしたいなと。環境は Windows7x64, mac です。たまに声優さん情報が混ざります。最近ちょっとClojure触りました。

Clojure その9 case

今回は

case を使ってみましょう

ClojureDocs - clojure.core/case

(defn -main [member]
  (case member
    "高垣彩陽" (println "ピンク")
    "豊崎愛生" (println "緑")
    "戸松遥" (println "オレンジ")
    "寿美菜子" (println "紫")))
$ lein run 高垣彩陽
ピンク

ここで気になるのは、もしマッチする部分がない場合はどうなるかということ

$ lein run 花澤香菜
Exception in thread "main" java.lang.IllegalArgumentException: No matching clause: 花澤香菜
	at hello.core$_main.invoke(core.clj:11)
	at clojure.lang.Var.invoke(Var.java:415)
	at user$eval5$fn__7.invoke(form-init2274211252778516822.clj:1)
	at user$eval5.invoke(form-init2274211252778516822.clj:1)
	at clojure.lang.Compiler.eval(Compiler.java:6619)
	at clojure.lang.Compiler.eval(Compiler.java:6609)
	at clojure.lang.Compiler.load(Compiler.java:7064)
	at clojure.lang.Compiler.loadFile(Compiler.java:7020)
	at clojure.main$load_script.invoke(main.clj:294)
	at clojure.main$init_opt.invoke(main.clj:299)
	at clojure.main$initialize.invoke(main.clj:327)
	at clojure.main$null_opt.invoke(main.clj:362)
	at clojure.main$main.doInvoke(main.clj:440)
	at clojure.lang.RestFn.invoke(RestFn.java:421)
	at clojure.lang.Var.invoke(Var.java:419)
	at clojure.lang.AFn.applyToHelper(AFn.java:163)
	at clojure.lang.Var.applyTo(Var.java:532)
	at clojure.main.main(main.java:37)

花澤香菜さんはエラーになってしまいます

これでは困ってしまうので、以下のように書き換えます

(defn -main [member]
  (case member
    "高垣彩陽" (println "ピンク")
    "豊崎愛生" (println "緑")
    "戸松遥" (println "オレンジ")
    "寿美菜子" (println "紫")
    "default"))

こうすればエラーは出なくなります

マッチしないものでもなんかしたい!、と

(defn -main [member]
  (case member
    "高垣彩陽" (println "ピンク")
    "豊崎愛生" (println "緑")
    "戸松遥" (println "オレンジ")
    "寿美菜子" (println "紫")
    "default" (println "default")))

って書くとエラーになります(;´д`)トホホ…

どうするんだろう・・・

ちなみにScalaでは以下のように書けます

object Main {
	def main(args: Array[String]) = {
		args(0) match {
			case "高垣彩陽" => println("ピンク")
			case "豊崎愛生" => println("緑")
			case "戸松遥" => println("オレンジ")
			case "寿美菜子" => println("紫")
			case _ => println("スフィア以外です")
		}
	}
}
$ scala Main.scala 高垣彩陽
$ ピンク
$ scala Main.scala 花澤香菜
$ スフィア以外です

Scalaスケーラブルプログラミング第2版

Scalaスケーラブルプログラミング第2版

プログラミングClojure 第2版

プログラミングClojure 第2版