タグ

ブックマーク / kmizu.hatenablog.com (10)

  • Scalaに関する誤解と事実を語る - kmizuの日記

    TL;DR 世間のScalaに関するイメージは、昔のままであることが多い 昔のままどころか、最初から間違ったイメージを持たれていることも多い 実際には、既に解決されている問題は多々あるし、改善に向かっていることも多い プロジェクト管理の問題を言語に押し付けているケースもある はじめに 自分が最初にScalaに触れたのが2005年(Scala 1からカウントした場合)、あるいは2007年(Scala 2以降からカウントした場合)と、Scalaとの付き合いも結構長くなってきましたが、その間に Typesafe社(現Lightbend社)の設立 実質標準ビルドツールとしてのsbtの確立 ライブラリのバイナリ後方互換性に関するポリシーの策定 公式ScalaイベントScala Daysのはじまり Play 2 Frameworkの登場 Scala Center発足 その他色々 がありました。この間、

    Scalaに関する誤解と事実を語る - kmizuの日記
  • scala-nativeでは相互末尾再帰呼び出しも最適化される - kmizuの日記

    Scala Nativeなのかscala-nativeなのか迷ったのですが、今後はリポジトリ名のscala-nativeに統一しようかと思います。さて、タイトルについてですが、そのまんまです。 サンプルコードは以下: gist.github.com 通常のJVM上でのScalaでは、末尾呼び出しが自分自身で(自己末尾再帰)、かつ、その関数(メソッド)がオーバーライドされない場合に限り、末尾呼び出しを除去することができましたが、scala-nativeはそれに限らず、一般の末尾呼び出しも除去(ジャンプに置き換えることができる)という話です。 上記サンプルコードでは、単純にやるとおよそ100000000個分スタックを積む必要がありますが、そのまま関数呼び出しとして実装するとスタックオーバーフローします。事実、最適化オプションを付けないclang(3.7)では同等のコードを実行しようとするとse

    scala-nativeでは相互末尾再帰呼び出しも最適化される - kmizuの日記
  • Scala Nativeを動かしてみた(1) - kmizuの日記

    Scala Nativeはscalaのコードを(LLVMのIRを経由して)ネイティブコードにコンパイルするAOTコンパイラ(Ahead Of Time Compiler)です。その存在については、少し前にサイトができていたことで一部で話題になっていましたが、Scala Days 2016 NYCにて正式に公開されました。現在はPre-Release段階ですが、既にサンプルコードを試せるようになっていたので、環境を構築してみました(on Mac OS)。 scala-nativeのリポジトリをcloneする $ git clone git@github.com:scala-native/scala-native.git --recursive git submoduleとしてscala/scalaを持っているので、--recursiveを付けるのを忘れないようにしましょう。 llvm(cla

    Scala Nativeを動かしてみた(1) - kmizuの日記
  • stripMarginの歴史 - kmizuの日記

    ScalaのString(正確にはStringOps)にはstripMarginというメソッドがあります。これは、主に複数行文字列に使われる機能で、たとえば、 """|class Hello { | |}""".stripMargin のようにすると、 res0: String = class Hello { } という文字列が得られ、行頭のスペースを除きたい場合に非常に便利な機能です。この機能、どうやらGroovyにもあるらしく、名前もまんまstripMarginです。さて、これ、GroovyがScalaのそれにインスパイアされたのか、それとも逆なのか調べていたところ、Groovyの過去のIssueにstripMargin()を追加するというものがあり、 [GROOVY-3349] Add stripMargin() to multi-line strings - ASF JIRA どう

    stripMarginの歴史 - kmizuの日記
  • Scalaのメソッドや関数に関するQ&A - kmizuの日記

    Scala勉強会第170回 in 郷 rpscala.doorkeeper.jp は、サブテーマ「Scalaの言語仕様」であったため、久々に熱弁をふるったところ、特に、メソッドや関数の仕様や区別に関して疑問に思った方が多かったらしく、質問も多かったので、Q&A形式でまとめておきます。 Q: (x1, xN) => body 形式と、{ case pat1 => body1; ... case patN => bodyN }形式の違いは何でしょうか? A: 前者は必ずFunctionN[S1,...,SN,R]型を持つのに対して、後者は期待型(expected type)によって型が異なります: 1: FunctionN[S1,...,SN,R]: この場合、 (x1:S1,...,xN:SN) => (x1,...,xN) match { case pat1 => body1 case

    Scalaのメソッドや関数に関するQ&A - kmizuの日記
    waman
    waman 2016/04/07
    『タプルを引数にとる関数と複数の引数をとる関数の違いは何でしょうか?』
  • 無名関数のためのプレースホルダ構文の特異性 ~Scala Advent Calendar 2015じゃないよ~ - kmizuの日記

    当はScala Advent Calendarの記事として書こうと思っていたのですが、既にだいたい埋まってしまっていたので、自分のブログで書きます。Scalaistの皆さん、プレースホルダ構文、使ってますよね? List(1, 2, 3, 4, 5).map(_ + 1) // List(2, 3, 4, 5, 6) という風にして使うアレです。使ったことはなくとも、Scalaをギョームで使っておられる皆さんもギョームで使っておられない皆さんも一度は見たことがあるのではないかと思います。この構文、正確には、 Scala Language Specification 6.23.1で「Placeholder Syntax for Anonymous Functions」として定義されている機能ですが、長いのでプレースホルダ構文としましょう。ちなみに、 scala> Math.abs _ re

    無名関数のためのプレースホルダ構文の特異性 ~Scala Advent Calendar 2015じゃないよ~ - kmizuの日記
    waman
    waman 2015/12/15
  • 初学者向けの Scala Tips (6) - 文字列リテラル中のインデントを整える - kmizuの日記

    これは、気の利いたIDEであれば自動でやってくれるのであえて覚える必要はないのですが、一応。 Scalaでは、複数行に渡る文字列リテラルを次のようにして書く事ができます*1。 val foo = """ class Foo { def foo(): Unit = { println("foo") } } """ ここで、見やすさのためにdefの部分をもう一段インデントして、かつ、出力される文字列は変更したくないときがあります。そのようなときは、 val foo = """ |class Foo { | def foo(): Unit = { | println("foo") | } |}""".stripMargin とすると良いです。これで、|の部分が除去されて、その次のカラムが行頭になるような複数行文字列が生成されます。これはScalaで複数行文字列を意図通りに出力するときのイディオム

    初学者向けの Scala Tips (6) - 文字列リテラル中のインデントを整える - kmizuの日記
    waman
    waman 2014/06/10
    Groovyでこういう機能あったっけな
  • 初学者向けの Scala Tips (5) - パターンマッチと無名関数の組み合わせを簡潔に書く - kmizuの日記

    Scala初学者の方が書くコードには、しばしば以下のようなものが散見されます。 list.map {x => x match { case A => case B => case _ => } } 無名関数を作るための構文である{x => ...}とexp match { case ... }を別々に考えるとこのようなコードになるのは無理はありません。しかし、これはもっと簡潔に書くことができます。改良したのが以下のコードです。 list.map { case A => case B => case _ => } 前者の書き方に比べて断然簡潔ですね。特別な事情がない限り、無名関数の引数を即座にパターンマッチする必要がある場合、後者の書き方を使いましょう。 ちなみに、この書き方を教えると結構びっくりされる方が多いようで、この構文はPartialFunctionのためのものだと思っていた、という

    初学者向けの Scala Tips (5) - パターンマッチと無名関数の組み合わせを簡潔に書く - kmizuの日記
    waman
    waman 2014/05/26
    絶対やっしてまいそう。
  • 初学者向けの Scala Tips (4) - 可変長引数を取る関数にSeq[T]を渡す - kmizuの日記

    TipsというよりFAQの部類ですが、ときどきつまづく方がいるようなので。 Scalaで以下のような可変長引数を取る関数printAllを定義すると、 def printAll(ss: String*): Unit = { ss.foreach(println) } printAll("BAZ", "FOO", "BAR") //BAZ //FOO //BAR のように任意個のStringを渡すことができます。問題は、既に val fooBar = Seq("FOO", "BAR") のように既にSeq型のオブジェクトが作られている場合。 fooBarをそのまま引数として渡し、printAll(fooBar)としてしまうと、 (snip) error: type mismatch; found : Seq[String] required: String printAll(fooBar)

    初学者向けの Scala Tips (4) - 可変長引数を取る関数にSeq[T]を渡す - kmizuの日記
    waman
    waman 2014/05/18
    printAll(fooBar:_*)のようにすれば、scalacがfooBarを可変長引数に一つずつ渡したものとして扱ってくれる。
  • 初学者向けの Scala Tips (2) - nullからOptionへの変換 - kmizuの日記

    Scalaでnullを使っていいのは小学生までだよねー、というのは冗談ですが、Scala文化圏ではnullを使わないのが原則です(いくつか例外はありますが)。代わりに出てくるのがOption型です。しかし、Scalaでは困ったことにnullを返すJavaのメソッドを呼び出さなければいけない場面がたくさんあります。 たとえば、以下のようなコードを書かなければいけない場面にはしばしば遭遇します。 val javaMap: java.util.Map[String, String] = javaObject.getMapping() val value: String = javaMap.get(key) // 型注釈はあえて付けている if(value != null) { ... } else { ... } さて、ここで困るのが、javaMap.get(key)はkeyに対応する値が入って

    初学者向けの Scala Tips (2) - nullからOptionへの変換 - kmizuの日記
    waman
    waman 2014/05/09
    『Scalaからnullを返すかもしれないJavaのメソッドを呼び出すときは、このようにOption.applyで浄化することをこころがけましょう』
  • 1