kmizuの日記

プログラミングや形式言語に関係のあることを書いたり書かなかったり。

Scala

メモリ使用量の削減のために遅延リストを使うのは(多くの場合)アンチパターン

こんばんは。ちょっと久しぶりにScalaの記事を書いてみようと思い立って、こうやって記事を書くことにしました。 といっても、タイトルがほとんど全てを表しているのですけど。 最近のプログラミング言語のいくつかは、俗に遅延リストと称される機能を持って…

Scalaを手っ取り早く学ぶのに適したリソースを紹介する(2020年版)

はじめに こんにちは。水島です。例のQiita炎上の件で、「ああ、これはもう自分向きのサービスじゃないな」と思ってサックリとアカウント消して退会したわけですが、ちょっとこれくらいはレスキューしておけば良かったな…と思った記事があったので、リライト…

プレースホルダ構文と文字列補間を組み合わせた時の挙動についての考察

久しぶりの日記の更新です。今回のテーマは、Scalaにおける、Placeholder syntax for anonymous function(以後、プレースホルダ構文)とString Interpolation(文字列補間)を組み合わせた時にどのような挙動であるべきか、また、現状の挙動が妥当かについ…

お役立ち中置パターン in Scala

Scalaには中置パターン(infix pattern)と呼ばれる機能があります。これは単純にいうと、 case class ~[A, B](a: A, b: B) のようにして定義したケースクラスに対して*1、 scala> val ab = new ~(1, "FOO") ab: ~[Int,String] = ~(1,FOO) scala> val a ~ b …

scala-nativeでは相互末尾再帰呼び出しも最適化される

Scala Nativeなのかscala-nativeなのか迷ったのですが、今後はリポジトリ名のscala-nativeに統一しようかと思います。さて、タイトルについてですが、そのまんまです。 サンプルコードは以下: gist.github.com 通常のJVM上でのScalaでは、末尾呼び出しが自…

Scala Nativeを動かしてみた(1)

Scala Nativeはscalaのコードを(LLVMのIRを経由して)ネイティブコードにコンパイルするAOTコンパイラ(Ahead Of Time Compiler)です。その存在については、少し前にサイトができていたことで一部で話題になっていましたが、Scala Days 2016 NYCにて正式に…

Scala 2.12.0-M4とJava 8 Streamで遊んでみる

Scala 2.12.0-M4はまだ正式リリースはされていませんが、既に各種バイナリはpublishされており、sbtに次のようにscalaVersionを書いてあげればふつうに使うことができます。 scalaVersion := "2.12.0-M4" さて、Scala 2.12の一つの目玉がSAM Type(Single Abs…

Scalaのメソッドや関数に関するQ&A

Scala勉強会第170回 in 本郷 rpscala.doorkeeper.jp は、サブテーマ「Scalaの言語仕様」であったため、久々に熱弁をふるったところ、特に、メソッドや関数の仕様や区別に関して疑問に思った方が多かったらしく、質問も多かったので、Q&A形式でまとめておきま…

プロジェクトのバイナリ互換性をうっかり壊してしまわないように、最初に気を付けるべきこと(主にScala)

先日、MiMaの紹介のために、 kmizu.hatenablog.com を書きましたが、それの続編みたいな何か。基本的なことだと思うのですが、色々なScalaプロジェクトがバイナリ非互換な変更の元になる行為を意図せず行っている気がするので、啓蒙のために書いてみることに…

MiMa(Migration Manager)でScalaプロジェクトのバイナリ互換性をチェックする

MiMaは主にScalaライブラリ(Scala本体を含む)のバイナリ非互換な変更をチェックしてくれるライブラリです(おそらくバイトコードレベルの検査なので、Javaプロジェクトでもチェックできると思うのですが試していない)。 元々の経緯としては、Scala 2.9以…

HOPEG 0.0.1リリースしました。

タイトル以上のことはほとんど書くことがないのですが、HOPEG、最初のリリースです。 詳しくは以下。 github.com hopeg 0.0.1をlibraryDependencyに追加して、利用コードの中で import com.github.kmizu.hopeg._ val grammar = HOPEGParser.parse( """ |S = …

Scala Conference in Japan 2013 〜座長の軌跡〜

時間が経つのは早いもので、Scala Conference in Japan(略称ScalaConfJP) 2013 (3/2(土), 3/3(日)) が開催されてからもう2週間です。200名分のチケットが1週間足らずで売り切れ、その後もキャンセル待ちが増え続けた段階である程度の盛り上がりは予想してい…

sbt + sbt-idea + Intellij Scala Pluginを使ったScala開発 (in Mac OS X)

注意:この記事の内容は、2013年7月2日現在、やや古くなっています。現在は「Use external build」のチェックはONにしたままで、「Use project FSC」をチェックしない方が安定して動作します。これは、最近のアップデート(ここ1〜2ヶ月くらいの話ですが)「…

irof式が実装できたよ。そう、Scalaならね! (Re: irof文が実装できたよ。そう、Scalaならね!)

See: irof文が実装できたよ。そう、Scalaならね!返り値が思い通りにならないことに困ってらっしゃったようなので(?)、実装してみました。 object Main { case class irof[A](val condition: Boolean)(blockA: => A) { val thunk: () => A = () => blockA…

Weak Conformanceのはなし

この記事はPlay or Scala Advent Calendar 2012 の 6日目です。今回の記事は、とりわけ役に立たないことを自負しています(役に立つ記事を読みたい人は飛ばしてください)。本題に入る前に、conformanceという概念についてざくっと簡単に説明しておきます。こ…

Iterator.continually()を使おう

Scalaの標準IOライブラリであるscala.io(.Source)は非常に腐ってます。読み込みしか対応してない上に、バイト列の読み込みもサポートしてないという代物。しかも、Scala 2.7まではscala.io.Sourceがそのままだとcloseできなかったりとか(今はcloseできます)…

Jsonda 0.4.0リリース

昨日、Jsonda 0.4.0をリリースしました。先日の日記では、次のバージョンを0.3にするようなことを書いたのですが、リリース版のメジャーバージョンは0.2 -> 0.4 -> 0.6のようにすることにしました。Jsonda 0.2.1と同じく、Scala 2.9.1とScala 2.9.2用にクロ…

Jsonda 0.2.1 & Jsonda 0.3について

しばらく前ですが、Jsonda 0.2.1をリリースしました。0.2からScala 2.9.1とScala 2.9.2のクロスビルドしているので、どちらでも使えます。Jsonda 0.2からsonatypeにpublishしてるのでresolversへの追加なしで、以下の一行をbuild.sbtに追加するだけで使えま…

_ と _ の違い

意味不明なタイトルですね。このエントリの目的は、二つの似た_の使い方が全く異なる意味を持っていることを認識してもらうことです。最初に結論を言います。Scalaの式中における obj.method _ という使い方(Method Values)と obj.method(_) という使い方(Pl…

プレースホルダー構文クイズ(解答編)

淡々と解答編。 1. =の右辺の展開結果が全く同じになるコード例のグループを全て列挙してください A. (1-2, 1-5), (2-1, 2-2), (2-3, 2-4), (3-1, 3-5), (4-3, 4-4) 2. コンパイルできるコード例を全て抽出してください(e.g. 1-2, 1-3)。 A. 1-2, 1-3, 1-5, …

プレースホルダー構文クイズ(問題編)

初めに言っておくと、これはマジなクイズではありません。実際にScalaのプレースホルダー構文を使う上でここまで詳細な挙動を知る必要はありませんし、知る必要のあるようなプレースホルダー構文の使い方をしていたら、それはおそらく誤った使い方です。ただ…

『Scala逆引きレシピ』 感想

少し前に献本いただいたのですが(竹添さん、翔泳社様、ありがとうございます)、時間が無くてあまり読み進められていませんでした。昨日使って一通り目を通したので、ちょっとした感想を書きます。購入の際の参考になれば幸いです。まず、結論から言うと、本…

Scalaの標準(コレクション)APIを読もう:車輪を再発明する前に

なんか久しぶりに、技術ネタっぽい何かです。Scalaの標準ライブラリは結構偏りがあって、scala.ioとかのIO周りは壊滅的だったりする(ので早くScala-IO入って欲しい)のですが、コレクションライブラリは結構充実してて、色々便利メソッドがあったりします。コ…

Finagleハッカソンします

先日のJavaOne TokyoでTwitterの人が発表していたTwitter製のRPC用FW Finagleハッカソンを5/19に行います。JavaOneのときに、@gakuzzzzさんと相談して日程を決めて、段取りなどは@gakuzzzzさんにお願いしたのですが、募集開始してからあっという間に定員オー…

Githubを使ってScalaの開発に貢献しよう

ScalaJP盛り上げよう企画として、Scalaブログリレーをちょっとやってみることにしました。ルールは簡単で、それぞれが好き勝手にScalaに(少しは)関係する話題を書いて、次に書く人を指名するというものです。指名された人は、7日以内に記事を上げるか、無理…

Scala 2.10.0 Milestone 1

このエントリ読んでいるような人は既にとっくに知ってそうな気がしますが、ブログ更新再開の手始めとして、すぐ書ける話を持ってきました。さて、つい先日、Scala 2.10.0 Milestone 1(以後、2.10.0 M1)がリリースされました。2.10.0 M1の新機能とかはとりあ…

Scala 2.9.1 final 雑感

このブログ読んでるような人ならとっくに知ってそうですが、昨日、Scala 2.9.1 finalがリリースされました。今回のバージョンアップは、メンテナンスリリースということで、2.9.0.1と完全にバイナリ互換になっています。というと、あんまり嬉しくなさげです…

勝手に添削:「「ある金額になるコインの組み合わせ」をScalaで」

まずは引用: 続いてやってみた。お題はこちら。お題:ある金額になるコインの組み合わせ - No Programming, No Lifeあまり芸のない総当たりだけど、こんなんでいいのかな。 object CoinAssort { def search(coinList: List[Int], sum: Int, curAssort: List…

「ANS-prog: プログラマが質問し、プログラマが答える Q&Aフォーラム」 の宣伝

突然ですが、前々から、日本語版Stack Overflow(Scalaの質問もできる場所)が欲しい、と常々思っていました。自分はまあ日ごろからScalaに対する疑問・質問に対してbotのごとく(笑)勝手に答えたりしてるわけですが、この過程で得られた知見とうかノウハウとか…

『オープンソース徹底活用 Scala実践プログラミング』発売です。

以前の記事で概要は紹介したので、あらためて同じ事は書きません。Scalaで実用プログラムが書きたい人、Scala好きな人、プログラミング言語が好きな人、是非買ってください。 それでもって、批評するなりdisるなり存分にしていただければと思います。