Scala

Scala Advent Calendar2011: Play2.0 + Scala

この記事は、Scala Advent Calendar JP 2011 の16日目です。 【お断り】Play 2.0はまだベータ版です。将来仕様変更が行われて、下記の操作がそのまま動かなくなる可能性があります。 相次いで、Typesafe StackやHerokuでのサポート表明がされるなど、期待のW…

今日のTips

関数にリストなどを展開して渡す方法:val lst=List(1,2,3,4,5) だったとき、fnc(lst:_*)は、fnc(1,2,3,4,5)と同じ。 ex) l=List( (1,2),(3,4)) として Map(l:_*)などSeqはPartialFunctionを継承しているので、List(0,1,0,2,3).collect(List('a','b','c')).m…

今日のオプション

scala -savecompiled [スクリプトファイル] :コンパイルした結果をjarファイル化して残しておき、スクリプトの更新が無い間はそれを使うため起動が劇的に早くなる! jarはスクリプトと同じ所に作られる。 *Tw* -Xprint: コンパイル時の段階のソースを表示す…

今日のメソッド

少したまったのでまとめてみた。 IterableLike zip(that):自身とthatを先頭から要素ごとにタプルにしたIterableを返す。要素数が異なる場合、余りは捨てられる。要素の多い方に揃える場合は zipAll を使う。 例) "hoge" zip "Scala"zipWithIndex:先頭の要…

ClojureでTwitter4jしてみた。(で、ちょっとハマったことなど・・・)

Twitter4j を試してみた。参考はこのページ「コード例」まずは、ステータスの更新 (import '(twitter4j Twitter)) (def id "hogehoge") (def pw "piyopiyo") (def twitter (new Twitter id pw)) (def status (. twitter updateStatus "test tweet (by twitte…

関数内に補助関数を作り、その中で親関数の引数を利用した場合の挙動の比較

Project Euler の Problem-5 をClojureに移植していたらハマった・・・Scala版 def problem5(m:BigInt):BigInt = { def checkloop(n:BigInt, s:BigInt):BigInt = { if (n % m == BigInt(0)) n else checkloop(n+s, s) } if (m == BigInt(1)) m else { val ne…

CaseClassをMapのキーとして使う場合

via 2ch 「プログラミング言語 Scala 3冊目」まず「caseクラス」について簡単に説明すると・・・ Scalaでは、「class」の前に「case」とつけるだけで以下の3つの特典がついてくる。 インスタンスを作るときに「new」がいらなくなる。 パラメータリストに「…

一定時間ごとに何かする Actor

普通に書くと、sleepしている間は何もできなくなるし、 コップ本にもブロックするなと書いてあったので、 ヘルパーActorを使って書いてみた。 import scala.actors.Actor import scala.actors.Actor._ def makeTimerActor(func: => Any) = actor { var valid…

Fizz Buzz 再び

ScalaでFizz Buzz - 不悔必省からトラックバックを頂いたこともあり、 改めてFizz Buzzを書いてみた・・・ シンプル版 これは上記リンク先のとほとんど同じだが、この場合"n match"の部分は省略できる。 (1 to 100).map { case n if (n%3 == 0) && (n%5 == 0…

Type alias すげぇ

via Scala言語仕様輪読会 scala> type of[m[_],t] = m[t] defined type alias ofとすると、 scala> var x: List of Int = List(1,2,3) x: of[List,Int] = List(1, 2, 3)とか出来る模様・・・!! なんかすげぇ!!これは、結局 scala> var x: of[List,Int] =…

object を継承して作る

時に、 class Human(val name:String) { def hello = "Hi! I'm " + name + "." } object Taro extends Human("Taro") object Hanako extends Human("Hanako") println(Taro.hello) println(Hanako.hello)とかできるのね。なんとなく書いてみたらできたのでび…

可変長引数の取り扱い

単純に scala> def sprintf(fmt:String, args:Any*) = String.format(fmt, args) sprintf: (String,Any*)java.lang.Stringだと scala> sprintf("%d,%d", 1,2) java.util.IllegalFormatConversionException: d != scala.runtime.BoxedObjectArray at java.uti…

Ruby の OptionParser ライクな Commons-CLI のラッパを書いてみた

定番コマンドライン引数解析ライブラリ Commons-CLI(ver1.2)を使ってみた import org.apache.commons.cli._ class NoSuchConfigFileException extends RuntimeException var testMode = false var configFilename:String = null var exAttachFiles = Array[S…

JavaMailのラッパを書いてみた。

ひとまず object Mail { import java.util._ import java.io._ import javax.mail._ import javax.mail.internet._ import javax.activation._ def body(text:String) = new MimeBodyPart { setText(text , "iso-2022-jp") } def attachFile(filename:String…

引数なしのクロージャ

引数なしのクロージャをどう書くかについて・・・上記Blogの前日記事への みずしまさんのコメント => TypeName はメソッドの引数専用の修飾子のようなもので、引数が名前渡し(call-by-name)であることを指定するものです。実装的には関数を作って渡してるわ…

2.7.2 でのimplicit def (三たび)

http://d.hatena.ne.jp/ryugate/20081115#p1に関して、 lingrでmizusimaさんにもご協力いただいて調べたところ、結局は、 https://lampsvn.epfl.ch/trac/scala/ticket/1209 https://lampsvn.epfl.ch/trac/scala/ticket/801 にあるように、 # > An implicit c…

2.7.2 ではimplicit defを宣言するタイミングが重要

昨日の件http://d.hatena.ne.jp/ryugate/20081114#p2を、まとめてみた。まず、以下の様なソースがある。 class ExString(val str:String) { def plushoge = str + "-hoge" } implicit def str2exstr(str:String) = new ExString(str) class SomeClass { def …

ScalaSwingを使ってみた

めでたく、2.7.2.finalもリリースされたことなので、 ScalaSwingを使ってみた。サンプルを参考に 任意のファイルを、指定して何らかの処理をするツールのGUI部分だけを書き直した。 import java.io._ import swing._ import swing.event._ import javax.swin…

2.7.2からImplecit defする順番が重要になっている模様・・・

要は、実際にimplecit defが宣言されるより前のコードにおいては宣言が無効になっているような感じです。 詳しくは、後で書きます。

正規表現で変数束縛

id:ryugate:20080528 の続き・・・ ふとおもって、実験してみた。 scala> val ptn = "([0-9]+).*".r ptn: scala.util.matching.Regex = ([0-9]+).* scala> val ptn(x) = "123hoge" x: String = 123おぉ、出来るのね。で、こっちは scala> val ptn(x) = "hoge…

6月13日 Scala勉強会@豆蔵の資料

を、アップしました。 「6月13日 Scala勉強会@豆蔵の資料」 デス。

lazy

val するときにつけると、参照されるまで右辺の評価が「遅延」する。簡単な例 var i = 0 def countup = {i = i + 1; i} def reset = {i = 0; i} def test { lazy val a = countup lazy val b = countup lazy val c = reset lazy val d = countup lazy val e …

Regex#unapplySeq

scala.util.matching.Regex に unapplySeq があるので、match を使うと綺麗にパターンマッチで書ける...? どなたか教えていただけませんか。 http://www.lingr.com/room/scala-ja/archives/2008/05/28#msg-38517596 を受けて、少し実験してみた。 scala> "ab…

flatMap

(再び、mizushimaさん@Lingrより)flatMapとは (計算の)「結果「である」コレクションを連結した新しいコレクションを返」すmap である。例えば、 List(1, 2, 3).map{i => List(i, i + 1)} の結果は List(List(1, 2), List(2, 3), List(3, 4)) になりま…

'a' to 'c' (RichChar#to)

先日の記事 2008-05-25 - ryugateの日記 中の scala> for (i <- 1 to 2 ; c <- 'a' to 'c') yield (i,c)は、失敗するのだけれど。 scala> for (i <- 1 to 2 ; c <- ('a' to 'c').toList) yield (i,c)なら、うまくいく。 ことについて、 またしてもlingrでmiz…

for comprehension(for内包表記)

について・・・ forの中でyieldが使われるとfor構文全体がコレクション(ないしはイテレータ)として値を持ち、 個々の要素がyieldの右辺の値となる。 これを「for comprehension(for内包表記)」という。 http://www.thinkit.co.jp/cert/article/0711/4/3/…

Implicit Parameters

"Scala By Example" http://www.scala-lang.org/docu/files/ScalaByExample.pdf の15章から Implicit Parameters について、やっと理解した。 まず、以下のような抽象クラスがある。 abstract class SemiGroup[A] { def add(x: A, y: A): A } abstract cla…

新しいScalaPlugin

パーサコンビネータを勉強するにあたって、新しいeclipseのプラグインを試してみる。 今回はhttp://scala-lang.org/downloads/scala-plugin-betaからとってきたものを利用した。まだ、ちょっとおかしなとことはあるが、 だいぶ完成度が上がってきた感じ やは…

パーサコンビネータ再び

inforno :: Scalaでスタック指向言語をサクッと実装する という、2.6.0以降に導入された新しいパーサコンビネータを使った記事があったのに触発されて、 再びパーサコンビネータにチャレンジしてみる。 題材は、以前と同じ「CSVパーサ」 とりあえず、上記サ…

シンタックスシュガーの展開後の確認方法

val seq = for(x 実は,map,flatMap,filterのシンタックスシュガーらしい.どーいう風に展開されてるのか,知りたい.http://d.hatena.ne.jp/matt-k/20080511#p2 について・・・実はすでに、mizushimaさんが : 展開結果は (1 to 100).flatMap{ case x => …