<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Go towards a Word-Progress &#187; Scala</title>
	<atom:link href="http://wordprogress.org/archives/tag/scala/feed" rel="self" type="application/rss+xml" />
	<link>http://wordprogress.org</link>
	<description>　～言霊とプログラム言語の共進化!?</description>
	<lastBuildDate>Fri, 22 Jan 2010 03:37:35 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.9.1</generator>
	<language>ja</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<atom:link rel="hub" href="http://pubsubhubbub.appspot.com"/><atom:link rel="hub" href="http://superfeedr.com/hubbub"/>		<item>
		<title>Scala2.8とアノテーション</title>
		<link>http://wordprogress.org/archives/843</link>
		<comments>http://wordprogress.org/archives/843#comments</comments>
		<pubDate>Sat, 12 Dec 2009 13:38:02 +0000</pubDate>
		<dc:creator>アルケー</dc:creator>
				<category><![CDATA[Scala]]></category>

		<guid isPermaLink="false">http://wordprogress.org/?p=843</guid>
		<description><![CDATA[年末くらいから、Google App Engineを使い始めようと思っている。Scalaで使いたいのだが、もれなく、Javaのライブラリを呼びだすことになるため、しばしば問題になるScalaとアノテーションの関係を復習しておきたい。keisuken氏が述べているとおり、import javax.annotation._して、クラス宣言の前に、@Resource {  val name = &#8220;名前&#8221;,・・・・}と書いていくのが基本らしい。
実際のところは、Google App Engine向けに実装するときに・・・と思ったのだが、Scala2.8ではけっこう、アノテーションが使われるようになるんだね。アノテーションの好き嫌いはあるだろうが、「かゆいところに手が届く」的な用法なのは気に入った。

Scala 2.8では、@scala.annotaiton.tailrecアノテーションが追加 =&#62; 末尾再帰最適化を期待するメソッドにつけとくと、最適化されないパターンだったときにコンパイラがエラーを吐く
Scala 2.8では、@switch アノテーションが追加 =&#62; JVM バイトコードの tableswitch最適化がされないパターンだったときにコンパイラがエラーを吐く

が、Scala2.8、リリースが遅延しているし、リリース直後から実アプリ作りにつかっていいものか、今イチ不安だなぁ・・・(弱気)。。ついでに元ネタにリンクする気力なくすみません。。

@Resource {
  val name = "abc",
  val `type` = classOf[Object],
  val authenticationType = Resource.AuthenticationType.APPLICATION,
  val shareable = true,
  val mappedName = "helloworld",
  val description = "Hello, world type"
}
class HelloWorld {
  def [...]]]></description>
			<content:encoded><![CDATA[<p>年末くらいから、Google App Engineを使い始めようと思っている。Scalaで使いたいのだが、もれなく、Javaのライブラリを呼びだすことになるため、しばしば問題になるScalaとアノテーションの関係を復習しておきたい。keisuken氏が<a href="http://cappuccino.jp/keisuken/logbook/20080919.html">述べている</a>とおり、import javax.annotation._して、クラス宣言の前に、@Resource {  val name = &#8220;名前&#8221;,・・・・}と書いていくのが基本らしい。</p>
<p>実際のところは、Google App Engine向けに実装するときに・・・と思ったのだが、Scala2.8ではけっこう、アノテーションが使われるようになるんだね。アノテーションの好き嫌いはあるだろうが、「かゆいところに手が届く」的な用法なのは気に入った。</p>
<ul>
<li><span style="font-family: 'MS PGothic'; line-height: 21px; font-size: 14px; color: #333333; "><a class="keyword" style="color: #333333; text-decoration: none; border-bottom-width: 1px; border-bottom-style: solid; border-bottom-color: #e0e0e0; padding-bottom: 1px; " href="http://d.hatena.ne.jp/keyword/Scala">Scala</a> 2.8では、@<a class="keyword" style="color: #333333; text-decoration: none; border-bottom-width: 1px; border-bottom-style: solid; border-bottom-color: #e0e0e0; padding-bottom: 1px; " href="http://d.hatena.ne.jp/keyword/scala">scala</a>.annotaiton.tailrec<a class="keyword" style="color: #333333; text-decoration: none; border-bottom-width: 1px; border-bottom-style: solid; border-bottom-color: #e0e0e0; padding-bottom: 1px; " href="http://d.hatena.ne.jp/keyword/%a5%a2%a5%ce%a5%c6%a1%bc%a5%b7%a5%e7%a5%f3">アノテーション</a>が追加 =&gt; 末尾<a class="keyword" style="color: #333333; text-decoration: none; border-bottom-width: 1px; border-bottom-style: solid; border-bottom-color: #e0e0e0; padding-bottom: 1px; " href="http://d.hatena.ne.jp/keyword/%ba%c6%b5%a2">再帰</a><a class="keyword" style="color: #333333; text-decoration: none; border-bottom-width: 1px; border-bottom-style: solid; border-bottom-color: #e0e0e0; padding-bottom: 1px; " href="http://d.hatena.ne.jp/keyword/%ba%c7%c5%ac%b2%bd">最適化</a>を期待するメソッドにつけとくと、<a class="keyword" style="color: #333333; text-decoration: none; border-bottom-width: 1px; border-bottom-style: solid; border-bottom-color: #e0e0e0; padding-bottom: 1px; " href="http://d.hatena.ne.jp/keyword/%ba%c7%c5%ac%b2%bd">最適化</a>されないパターンだったときに<a class="keyword" style="color: #333333; text-decoration: none; border-bottom-width: 1px; border-bottom-style: solid; border-bottom-color: #e0e0e0; padding-bottom: 1px; " href="http://d.hatena.ne.jp/keyword/%a5%b3%a5%f3%a5%d1%a5%a4%a5%e9">コンパイラ</a>がエラーを吐く</span></li>
<li><span style="font-family: 'MS PGothic'; color: #333333; font-size: medium;"><span style="line-height: 21px; "><span style="color: #000000; line-height: normal; font-size: 12px; font-family: fixed-width, monospace; "><span style="font-family: 'MS PGothic'; font-size: 14px; color: #333333; line-height: 21px; "><a class="keyword" style="color: #333333; text-decoration: none; border-bottom-width: 1px; border-bottom-style: solid; border-bottom-color: #e0e0e0; padding-bottom: 1px; " href="http://d.hatena.ne.jp/keyword/Scala">Scala</a> 2.8では、<span style="color: #000000; line-height: normal; font-size: 12px; font-family: fixed-width, monospace; ">@switch アノテーション</span>が追加 =&gt; </span>JVM バイトコードの tableswitch<span style="font-family: 'MS PGothic'; font-size: 14px; color: #333333; line-height: 21px; "><a class="keyword" style="color: #333333; text-decoration: none; border-bottom-width: 1px; border-bottom-style: solid; border-bottom-color: #e0e0e0; padding-bottom: 1px; " href="http://d.hatena.ne.jp/keyword/%ba%c7%c5%ac%b2%bd">最適化</a>がされないパターンだったときに<a class="keyword" style="color: #333333; text-decoration: none; border-bottom-width: 1px; border-bottom-style: solid; border-bottom-color: #e0e0e0; padding-bottom: 1px; " href="http://d.hatena.ne.jp/keyword/%a5%b3%a5%f3%a5%d1%a5%a4%a5%e9">コンパイラ</a>がエラーを吐く</span></span></span></span></li>
</ul>
<p><span style="font-family: Consolas, Monaco, 'Courier New', Courier, monospace; font-size: small;"><span style="line-height: 18px; white-space: pre; "><span style="font-family: Georgia, 'Times New Roman', 'Bitstream Charter', Times, serif; font-size: small;"><span style="line-height: 19px; white-space: normal; ">が、Scala2.8、リリースが遅延しているし、リリース直後から実アプリ作りにつかっていいものか、今イチ不安だなぁ・・・(弱気)。。ついでに元ネタにリンクする気力なくすみません。。</span></span></span></span></p>
<div id="_mcePaste" style="position: absolute; left: -10000px; top: 0px; width: 1px; height: 1px; overflow-x: hidden; overflow-y: hidden;"><span style="font-family: 'MS PGothic'; line-height: normal; font-size: small; color: #ffffff; "></p>
<pre style="background-color: #9ca8ad; color: #000000; margin-left: 3em; margin-right: 1em; padding-top: 8px; padding-right: 8px; padding-bottom: 8px; padding-left: 8px; ">@Resource {
  val name = "abc",
  val `type` = classOf[Object],
  val authenticationType = Resource.AuthenticationType.APPLICATION,
  val shareable = true,
  val mappedName = "helloworld",
  val description = "Hello, world type"
}
class HelloWorld {
  def greeting(msg: String): String = msg + ", world!"
}</pre>
<p></span></div>
]]></content:encoded>
			<wfw:commentRss>http://wordprogress.org/archives/843/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>「Scala入門」に勝手流追記　その４　ベターJavaなScalaでベンチマーク</title>
		<link>http://wordprogress.org/archives/587</link>
		<comments>http://wordprogress.org/archives/587#comments</comments>
		<pubDate>Thu, 19 Nov 2009 11:35:33 +0000</pubDate>
		<dc:creator>kyon</dc:creator>
				<category><![CDATA[Scala]]></category>

		<guid isPermaLink="false">http://wordprogress.org/?p=587</guid>
		<description><![CDATA[最近、夜中に書いた放言を、けっこうはてぶしていただいたScalaとグーグルgolangの関係だけれど、
 Scala on Java VM 　≒　(Haskell的言語) on golang

と考えておけば、これから５年くらいは大して外さないのではと思っている。・・・現状のHaskellがHaskell自身で実装されているなど、going my wayな点はさておく。
もちろん、純粋すぎるHaskellがgolangに実装される時には、GoskellとかHaskegolangとか、よくわからない名前の不純ななものになっているかもしれないが(JavaにHaskellを移そうとした人々は、Jaskellと名づけている)。
その点、golang上のrubyならば、gorubyで決まりだろう。ノーベル平和賞受賞者ゴルビーにも配慮十分な覚えやすい名前である。
ともあれ、(Haskell的言語) on golang、ひょっとしたら、５年後にはScalaの強敵になっているのかもしれない。関数脳を働かせる時にはhaskellの側で、手続型コードを書く時にはgolangでというわけ。もちろん、並列処理対応だってばっちりだ。
でも、プログラム言語の普及は常にゆっくりなもの。
ふつうのプログラマが、プログラム言語が手になじませるのには時間がかかる。ここ５年で普通に使われるようになる言語は、Scalaの方だ。
なんてったって、「Javaの限界を超えて実用化を目指す新開発言語「Scala」のメリットとは～後編(codezine誌)」に取り上げられているように、Scalaは、今日からでも、ベターJavaとしてプログラムを書いていけるのだから。
ベターJava。うまい言葉じゃないか。
正直に言うと、Scalaが、HaskellやLispやClojureやF#などと共に属している関数型言語界隈的には、Javaっぽく書いたら負けである。
だが、男には(もちろん、女にも)、とりあえず手っ取り早くすませてしまいたい時がいつでもやってくる。そんなときばかりは、負けとかぬるいとか、言っていられない。
たとえば、
関数型言語のListは、Arrayより遅いらしい、と上司が聞きつけてきたとしよう(上司は「遅い」という言葉に過敏であるとする)。悪いことに、初のScala案件を受託した上司は、Scalaコーディング規約なるものを作ろうとしている。
ScalaプログラミングでList禁止とかいう謎の御触れが出されたらことである。そう、あなたは、忙しいにも関わらず、大急ぎでベンチマーク対決をしなければならなくなった。
そんな時でもScalaなら安心だ。
Java屋であろうとなかろうと、Javaで現在時刻を知る関数がcurrentTimeMillisであることは、ググってみればすぐわかる。
もちろん、Scalaでも、
scala&#62; System.currentTimeMillis
res1: Long = 1258619704810
これを使って、データを付加する時間、データにアクセスする時間計測すればよい。結果は、case classに入れることにしよう。
//ベンチマーク結果の格納クラス
case class Result(
  val AppendTime:Double, //データを付加する時間の結果
  val AccessTime:Double// とデータにアクセスする時間
) {
    val total = AppendTime + AccessTime
}
・・・・ここであなたの手がとまる。ベンチマークって関数型言語的にどう書くんだ・・・・関数渡し・・・をするとして、もArrayとListの双方に対応するには・・・
Scalaなら、とりあえず、こんな風な考えが浮かんできてしまっても大丈夫だ :
    いいや、forループでてきとうに書いて、
　　　　あとはコピペしててきとうに書こう。
えっと・・・・
//入力　ループ回数MAX
def simpleBench (MAX:Int)= {
	println ("Loops : "+MAX)

	//ベンチマークの結果(データを付加する時間とデータにアクセスする時間)
	case class Result(val AppendTime:Double,val AccessTime:Double) {
		val total = [...]]]></description>
			<content:encoded><![CDATA[<p>最近、夜中に書いた放言を、けっこうはてぶしていただいたScalaとグーグルgolangの関係だけれど、</p>
<p><strong><span style="color: #ff0000;"> Scala on Java VM 　≒　(Haskell的言語) on golang<br />
</span></strong></p>
<p>と考えておけば、これから５年くらいは大して外さないのではと思っている。・・・現状のHaskellがHaskell自身で実装されているなど、going my wayな点はさておく。</p>
<p>もちろん、純粋すぎるHaskellがgolangに実装される時には、GoskellとかHaskegolangとか、よくわからない名前の不純ななものになっているかもしれないが(JavaにHaskellを移そうとした人々は、Jaskellと名づけている)。</p>
<p>その点、<span style="color: #800000;"><strong>golang上のrubyならば、goruby</strong></span>で決まりだろう。ノーベル平和賞受賞者ゴルビーにも配慮十分な覚えやすい名前である。</p>
<p>ともあれ、<span style="color: #800000;">(Haskell的言語) on golang</span>、ひょっとしたら、５年後にはScalaの強敵になっているのかもしれない。関数脳を働かせる時にはhaskellの側で、手続型コードを書く時にはgolangでというわけ。もちろん、並列処理対応だってばっちりだ。</p>
<h3>でも、プログラム言語の普及は常にゆっくりなもの。</h3>
<p>ふつうのプログラマが、プログラム言語が手になじませるのには時間がかかる。<span style="color: #800000;">こ</span><span style="color: #800000;">こ５年で普通に使われるようになる言語は、Scalaの方だ</span>。<br />
なんてったって、「<a href="http://codezine.jp/article/detail/4476">Javaの限界を超えて実用化を目指す新開発言語「Scala」のメリットとは～後編</a>(codezine誌)」に取り上げられているように、Scalaは、今日からでも、ベターJavaとしてプログラムを書いていけるのだから。</p>
<p><span style="color: #ff0000;"><strong>ベターJava</strong></span>。うまい言葉じゃないか。<br />
正直に言うと、Scalaが、HaskellやLispやClojureやF#などと共に属している関数型言語界隈的には、Javaっぽく書いたら負けである。<br />
だが、男には(もちろん、女にも)、とりあえず手っ取り早くすませてしまいたい時がいつでもやってくる。そんなときばかりは、負けとかぬるいとか、言っていられない。</p>
<h3>たとえば、</h3>
<p>関数型言語のListは、Arrayより遅いらしい、と上司が聞きつけてきたとしよう(上司は「遅い」という言葉に過敏であるとする)。悪いことに、初のScala案件を受託した上司は、Scalaコーディング規約なるものを作ろうとしている。<br />
ScalaプログラミングでList禁止とかいう謎の御触れが出されたらことである。そう、あなたは、忙しいにも関わらず、大急ぎでベンチマーク対決をしなければならなくなった。</p>
<p>そんな時でもScalaなら安心だ。<br />
Java屋であろうとなかろうと、<a href="http://www.syboos.jp/java/doc/system-currentTimeMillis.html">Javaで現在時刻を知る関数がcurrentTimeMillisであること</a>は、ググってみればすぐわかる。</p>
<p>もちろん、Scalaでも、</p>
<p>scala&gt; System.currentTimeMillis<br />
res1: Long = 1258619704810</p>
<p>これを使って、データを付加する時間、データにアクセスする時間計測すればよい。結果は、case classに入れることにしよう。</p>
<pre class="brush:scala">//ベンチマーク結果の格納クラス
case class Result(
  val AppendTime:Double, //データを付加する時間の結果
  val AccessTime:Double// とデータにアクセスする時間
) {
    val total = AppendTime + AccessTime
}</pre>
<p>・・・・ここであなたの手がとまる。ベンチマークって関数型言語的にどう書くんだ・・・・関数渡し・・・をするとして、もArrayとListの双方に対応するには・・・<br />
Scalaなら、とりあえず、こんな風な考えが浮かんできてしまっても大丈夫だ :</p>
<pre class="brush:c">    いいや、forループでてきとうに書いて、
　　　　あとはコピペしててきとうに書こう。</pre>
<p>えっと・・・・</p>
<pre class="brush:scala">//入力　ループ回数MAX
def simpleBench (MAX:Int)= {
	println ("Loops : "+MAX)

	//ベンチマークの結果(データを付加する時間とデータにアクセスする時間)
	case class Result(val AppendTime:Double,val AccessTime:Double) {
		val total = AppendTime + AccessTime
	}

	//配列の速度を測定する
	val benchA = {
		val e1 = System.currentTimeMillis
		val a = new Array[Double](MAX)
		//
		for (i &lt;- 1 to MAX)
			a(i-1) = 1.0 * i
		val e2 = System.currentTimeMillis
		var sum = 0.0
		for (i &lt;- 1 to MAX)
			sum += a(i-1)
		print (sum + " = ")
		val e3 = System.currentTimeMillis
		Result ((e2-e1) , (e3-e2))
	}
	//リストの速度を測定する ＃かなりこぴぺ
	val benchL = {
		val e1 = System.currentTimeMillis

		var L = List(0.0)
		for (i &lt;- 1 to MAX)
			L ::= (1.0 * i)
		val e2 = System.currentTimeMillis
		var sum = 0.0
		var LL = L
		for (i &lt;- 1 to MAX) {
 			sum += L.head;	L= L.tail //チェックポイント
 		}
 		println (sum)
 		val e3 = System.currentTimeMillis
 		Result ((e2-e1) , (e3-e2))
 	}
  	println ("Total  -&gt; List : %f     Array : %f".
		format(benchL.total,		benchA.total))
	println ("Append -&gt; List : %f     Array : %f".
		format(benchL.AppendTime,	benchA.AppendTime))
	println ("Access -&gt; List : %f     Array : %f".
		format(benchL.AccessTime,	benchA.AccessTime))
}</pre>
<p>関数内関数とかいうテクニックを使ってはいるものの、ただの手続き型プログラミングである。２、３回の試行錯誤の後、あなたはベンチマーク結果を得る。<br />
コンパイル言語であるScalaは十分に高速なので、ミリ秒単位で計測するには、ループ回数も1,000,000回くらいでちょうどいいようだ。</p>
<pre class="brush:scala">scala&gt; for (j &lt;- 1 to 5) simpleBench(1000000)
Loops : 1000000
5.000005E11 = 5.000005E11
Total  -&gt; List : 234.000000     Array : 62.000000
Append -&gt; List : 172.000000     Array : 31.000000
Access -&gt; List : 62.000000     Array : 31.000000
Loops : 1000000
5.000005E11 = 5.000005E11
Total  -&gt; List : 499.000000     Array : 62.000000
Append -&gt; List : 141.000000     Array : 31.000000
Access -&gt; List : 358.000000     Array : 31.000000
Loops : 1000000
5.000005E11 = 5.000005E11
Total  -&gt; List : 234.000000     Array : 62.000000
Append -&gt; List : 141.000000     Array : 31.000000
Access -&gt; List : 93.000000     Array : 31.000000
Loops : 1000000
5.000005E11 = 5.000005E11
Total  -&gt; List : 234.000000     Array : 62.000000
Append -&gt; List : 188.000000     Array : 31.000000
Access -&gt; List : 46.000000     Array : 31.000000
Loops : 1000000
5.000005E11 = 5.000005E11
Total  -&gt; List : 249.000000     Array : 47.000000
Append -&gt; List : 187.000000     Array : 31.000000
Access -&gt; List : 62.000000     Array : 16.000000</pre>
<p>メモリの確保や開放に伴う誤差が考えられるため、とりあえず５回くらい回してみた。</p>
<p>ミドルウェアをScalaで開発をしておられる方(例えば、前回の浅海氏)ならは、やはり、Arrayでいきましょうとなるかもしないが、通常のアプリでは100万回ループを連発なんてことはあんまりないため、ListでもArrayでも大差はない。</p>
<p>ふうっ、これで安心だ。残った時間は、関数脳のトレーニングにあてよう。<a href="http://wordprogress.org/archives/547">そうだ、sleepingBeauty関数でも書くか・・・</a>。中途半端な関数脳の持ち主にとって、ベターjavaであるScalaは大いに便利な存在だ。</p>
<ul>
<li>関数脳よりもScalaでの実務的なプログラミングに興味をお持ちならば、「<a href="http://codezine.jp/article/detail/4476">Javaの限界を超えて実用化を目指す新開発言語「Scala」のメリットとは～後編</a>(codezine誌)」でさわりをつかんでおこう。</li>
</ul>
<p>&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;</p>
<p>最後にひとつだけ。なぜあなたは、忙しい自分の手を動かしてベンチマークを書いたのか。それは、プロマネをしながら、Scala入門もしているらしい上司が、上のプログラムに「チェックポイント」とコメントしておいたようなところで、「sum += L(i-1)」とか書いてしまって走らせることがないようにだ。</p>
<h3>ためしに、コメント部分を書き換えてみようと思った方にちょっとアドバイス :</h3>
<p><span style="color: #800000;"> Yuki.N &gt; 当該プログラムにおいてチェックポイント部分をリストの番号による操作に置き換えた場合、現時点のノイマン型アーキテクチャにおける実行においては地球人が１日と呼ぶ時間の枠内では処理が終了しない場合がある。Lispにおける伝統的なcarと同様、ScalaではListは可能な限りheadを介してアクセスするコードを記述すべきである。<br />
</span> ・・・じゃ、Java VMでも書き方次第でそんなに遅くなるのか？　正直、リストだってL(i)でアクセスしたいのが人情ってもんだと思うんだが、そこまでの親切はしてくれないものなのか、長門？<br />
<span style="color: #800000;"> Yuki.N &gt; そう。</span></p>
]]></content:encoded>
			<wfw:commentRss>http://wordprogress.org/archives/587/feed</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>過剰なScala、強引なGoogle golang　(「Scala入門」に勝手流追記その３)</title>
		<link>http://wordprogress.org/archives/514</link>
		<comments>http://wordprogress.org/archives/514#comments</comments>
		<pubDate>Sun, 15 Nov 2009 18:05:50 +0000</pubDate>
		<dc:creator>kyon</dc:creator>
				<category><![CDATA[Go]]></category>
		<category><![CDATA[Scala]]></category>

		<guid isPermaLink="false">http://wordprogress.org/?p=514</guid>
		<description><![CDATA[Scala入門記事というにはおこがましいかもしれないが、病み上がりに負けず今回は、輝かしい実績をお持ちの浅海氏の「Scalaプログラミングの勘所(1)　@ >IT pro」に対し、勝手に追記。&#038; どうやら、グーグルgolangについても語っておくのが今風らしいので、今回も後半でgolangに言及。
IT pro誌に連載中の本記事、その前までの回がかなりマニアックであったため、Scalaをはじめたばかりの方があまり読んでいないのではと思われる。しかし、Scalaのコレクション・クラスを知るには、非常に実践的で良い記事なので、少なくともこの回だけは読んでおいてほしい。
で、追記。
Scalaのコレクション・クラスは、データセットの繰り返し関係を扱うIteratorトレイトを内部的に持つと共に、データの取扱い方を抽象化したIterable・Collectionトレイトから派生している。浅海氏が取り上げているListやArrayも例外ではない。こうした裏方を知っておくことコレ大事ということで、特にJavaとの互換性を保つ上で不可欠なIteratorトレイトに少し言及。
 ※トレイトが何かは省略。はじめての方は、「scala trait」でググッて調べていただきたい。
いわゆるデザインパターンにおいて、繰り返しを扱うiteratorパターンはけっこう有名。その由来通りに、ScalaのIteratorトレイトも、繰り返し関係を取り扱うためのnextメソッド・hasNextメソッドを持っている。
Iteratorを生成し、nextしていってみよう。シングルトンオブジェクトという仕組みで、Scalaでは、以下のようにいきなりイテレータを生成できる。

scala&#62; val i1 = Iterator.range(0,3) //０以上３未満の整数を生成
i1: Iterator[Int] = non-empty iterator
生成されたi1はnextメソッドを持っているはずである。

scala&#62; i1.next
res6: Int = 0
scala&#62; i1.next
res7: Int = 1
scala&#62; i1.next
res8: Int = 2
scala&#62; i1.next //３以上の整数は存在しないためエラーとなる
java.util.NoSuchElementException: next on empty iterator

さて、多少の好き嫌いはあろうものの、Scalaは、基本、万人受けする美少女言語。Scalaのiteratorトレイトは、古のiteratorパターンを軽々とこえていく。いわゆる高階メソッドがばりばり使えるのである。
高階メソッドとは、とりあえず、「ようそひとつひとつをまとめてドンのメソッド」とでもいっておこうか。詳しくは浅海氏の記事を読んでいただくとして、ちょっとだけ。
まずはmkstring。以下のようにタイプすると、
 

scala&#62; Iterator.range(1,5).mkString("Nagato")
res7: String = 1Nagato2Nagato3Nagato4

数字の間に旧日本軍の戦艦長門が３隻はさみこまれた。これは、Iteratorの要素(1,2,3,4)のコンマの部分が長門におきかわったというわけ。
まぁ、mkStringはあまりおもしろくないので、次はかの大企業IBMとviエディタ日本語パッチ(vij)に高階関数mapを適用してみよう。

scala&#62; Iterator.fromString("IBMVIJ").
　　　　map (x =&#62; x - 1).
　　　　foreach { x =&#62; print (x.toChar)}
warning: there were deprecation warnings;
HALUHI

おっと、どこかの組織が余計なwarningを出しているが、とりあえず、IBM =&#62; [...]]]></description>
			<content:encoded><![CDATA[<p>Scala入門記事というにはおこがましいかもしれないが、病み上がりに負けず今回は、輝かしい実績をお持ちの浅海氏の<strong>「<a href="http://itpro.nikkeibp.co.jp/article/COLUMN/20090811/335518/?ST=develop">Scalaプログラミングの勘所(1)　@ >IT pro</a>」<span style="font-weight: normal; line-height: 19px; font-size: 13px;">に対し、</span></strong>勝手に追記。&#038; どうやら、グーグルgolangについても語っておくのが今風らしいので、今回も後半でgolangに言及。</p>
<p><strong><span style="font-weight: normal; line-height: 19px; font-size: 13px;">IT pro誌に連載中の本記事、その前までの回がかなりマニアックであったため、Scalaをはじめたばかりの方があまり読んでいないのではと思われる。しかし、Scalaのコレクション・クラスを知るには、非常に実践的で良い記事なので、少なくともこの回だけは読んでおいてほしい。</span></strong></p>
<p><strong><span style="font-weight: normal; line-height: 19px; font-size: 13px;">で、追記。</span></strong></p>
<p><strong><span style="font-weight: normal; line-height: 19px; font-size: 13px;">Scalaのコレクション・クラスは、データセットの繰り返し関係を扱うIteratorトレイトを内部的に持つと共に、データの取扱い方を抽象化したIterable・Collectionトレイトから派生している。浅海氏が取り上げているListやArrayも例外ではない。こうした裏方を知っておくことコレ大事ということで、特にJavaとの互換性を保つ上で不可欠なIteratorトレイトに少し言及。</span></strong></p>
<p><strong><span style="font-weight: normal; line-height: 19px; font-size: 13px;"><span style="color: #800000;"> ※トレイトが何かは省略。はじめての方は、「scala trait」でググッて調べていただきたい。</span></span></strong></p>
<p><strong><span style="font-weight: normal; line-height: 19px; font-size: 13px;">いわゆるデザインパターンにおいて、繰り返しを扱うiteratorパターンはけっこう有名。その由来通りに、ScalaのIteratorトレイトも、繰り返し関係を取り扱うためのnextメソッド・hasNextメソッドを持っている。</span></strong></p>
<p>Iteratorを生成し、nextしていってみよう。シングルトンオブジェクトという仕組みで、Scalaでは、以下のようにいきなりイテレータを生成できる。</p>
<pre class="brush:scala">
scala&gt; val i1 = Iterator.range(0,3) //０以上３未満の整数を生成
i1: Iterator[Int] = non-empty iterator
生成されたi1はnextメソッドを持っているはずである。

scala&gt; i1.next
res6: Int = 0
scala&gt; i1.next
res7: Int = 1
scala&gt; i1.next
res8: Int = 2
scala&gt; i1.next //３以上の整数は存在しないためエラーとなる
java.util.NoSuchElementException: next on empty iterator
</pre>
<p><strong><span style="font-weight: normal; line-height: 19px; font-size: 13px;">さて、多少の好き嫌いはあろうものの、Scalaは、基本、万人受けする美少女言語。Scalaのiteratorトレイトは、古のiteratorパターンを軽々とこえていく。いわゆる高階メソッドがばりばり使えるのである。</span></strong></p>
<p><strong><span style="font-weight: normal; line-height: 19px; font-size: 13px;">高階メソッドとは、とりあえず、「ようそひとつひとつをまとめてドンのメソッド」とでもいっておこうか。詳しくは浅海氏の記事を読んでいただくとして、ちょっとだけ。</span></strong></p>
<p>まずはmkstring。以下のようにタイプすると、</p>
<p><strong><span style="font-weight: normal; line-height: 19px; font-size: 13px;"> </span></strong></p>
<pre class="brush:scala">
scala&gt; Iterator.range(1,5).mkString("Nagato")
res7: String = 1Nagato2Nagato3Nagato4
</pre>
<p>数字の間に旧日本軍の戦艦長門が３隻はさみこまれた。これは、Iteratorの要素(1,2,3,4)のコンマの部分が長門におきかわったというわけ。</p>
<p>まぁ、mkStringはあまりおもしろくないので、次はかの大企業IBMとviエディタ日本語パッチ(vij)に高階関数mapを適用してみよう。</p>
<pre class="brush:scala">
scala&gt; Iterator.fromString("IBMVIJ").
　　　　map (x =&gt; x - 1).
　　　　foreach { x =&gt; print (x.toChar)}
warning: there were deprecation warnings;
HALUHI
</pre>
<p>おっと、どこかの組織が余計なwarningを出しているが、とりあえず、IBM =&gt; HALという古の変換は完了した。この「=&gt;」による変換(関数リテラルという)が、I,B,M,V,I,Jのひとつひとつのアルファベットに適用されているというわけ。</p>
<p>以上、Scalaはiteratorでもけっこう便利、ListやArrayはもっともりもり高階操作ばりばり、なのだよ。何がもりもりか知りたくなった人は、浅海氏の記事を読もう。</p>
<p>&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;-</p>
<p>だが、話はここで終わらない。Scalaは萌え要素ばかりではない。美少女がツンデレという例に漏れず、<span style="text-decoration: line-through;">ハルヒ</span>Scalaに付き合っていくのは、一般人には少々骨なのである。なにしろ、iteratorも，ListもArrayもSeqもMapもTupleもQueueも(以下略)・・・Scalaのコレクションクラスは、みんなみんな高機能。どれがどれだけの<span style="text-decoration: line-through;">萌え要素</span>機能性をもっているかを把握するには３年間くらいかかりそうな勢いである。そして、Scala2.8でコレクション・クラス自体の継承関係にかなりの変更が・・・。Scala、とても便利なのだが、なんだか過剰なのだ。</p>
<p>さて、いよいよgolang。</p>
<p>自分はgolangにさほど萌えていないのだが、それは、golangがライブラリというふくよかな肉がない、いまだスケルトンな存在であるからかもしれない。golangは、基本的なライブラリが欠けていて、それを充実させていただきたく、オープンソースとして公開するから、皆さんどんどんgolang使って便利なライブラリつくってくださいね、というわけ。</p>
<div>で、世の<span style="text-decoration: line-through;">人柱</span>アルファギークな方々を戸惑わせているのが、golangのいささか不親切な言語機能(少なくともスクリプト言語やScalaに慣れた身には)。</div>
<div></div>
<div>golangは、ギークなプログラマにあまりやさしくない。ギークにとって美徳なはずの<a href="http://blog.livedoor.jp/dankogai/archives/51067205.html">怠惰と傲慢</a>は、今のgolangの世界では通用しない。</div>
<div>そうコーランならぬgolangの世界では、世のギークたちはピラミッド構築に駆り立てられた民のごとく、１か２くらいの位置からライブラリやコーディング・ノウハウを蓄積するよう強いられる。</div>
<div></div>
<div>これでいいのか？　これでいいのだ、とグーグル様は答えるだろう。なぜならば、ギークが若干の苦役をする分、コンパイル速度は速く(すなわち、ブラウザだろうがどこだろうが俊敏に動作する)・並列処理対応もできる。まるで、グーグル様は、世のギークなど掃いて捨てるほどいるとしてしまい、短気なエンド・ユーザが受け入れ可能/乗り換えしそうなコンパイルの俊敏さに焦点をあわせているかのようだ。いや、ここまでギークに対して、傲慢・強引に出れる企業は、グーグルだけでしょう。</div>
<div></div>
<div>ともあれ、今回の結論は以下のとおり</div>
<div>
<ul>
<li>Scalaは便利だが過剰で、コンパイル速度やライブラリのサイズなどが犠牲になっている。</li>
<li>golangはその逆で、ギークが戸惑う機能不足な言語だが、コンパイル速度の速さが配備容易性につながる(・・そして、働け、ギークども)</li>
</ul>
</div>
<p>ついでに思うに、ギークからすると不足感あるgolangだが、教育用途には意外と向いているのやも。</p>
<div>と、一見golangをけなしているようで、実はgolangにけっこう好意的なエントリとなった。</div>
<div></div>
<div>だが、いざgolangをさわるようになったらこう思うだろう。</div>
<div>「なんてこった、俺は<span style="text-decoration: line-through;">ハルヒ</span>Scalaに会いたかった」。</div>
<p>強引にGoogle golangでコーディングするよう強制されつつ。</p>
<p>・・・だが、その時には、golangにもけっこう萌えているかもしれない。なんといっても、Scalaのライブラリをきちんとマスターするための関門であった、ライブラリの継承関係の把握の手間がgolangにはない。なぜなら、golangには継承自体がないのだから。</p>
<p>継承がないのにgolangがオブジェクト指向って、それ何って話はまたそのうちに。</p>
]]></content:encoded>
			<wfw:commentRss>http://wordprogress.org/archives/514/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>ScalaとJavaScript　その3手続き型言語としてのScala(KMP編)</title>
		<link>http://wordprogress.org/archives/483</link>
		<comments>http://wordprogress.org/archives/483#comments</comments>
		<pubDate>Sat, 14 Nov 2009 06:25:53 +0000</pubDate>
		<dc:creator>アルケー</dc:creator>
				<category><![CDATA[Scala]]></category>
		<category><![CDATA[JavaScript]]></category>

		<guid isPermaLink="false">http://wordprogress.org/?p=483</guid>
		<description><![CDATA[Scalaって、なんだか中途半端な関節技使い関数型言語じゃね、と思ってるおまいらに
Scalaの打撃系手続き型言語の実力を見せてやんよ(~&#62;　つり)。。
@ITにて、JavaScriptでストイックにアルゴリズムとデータ構造している連載を見つけた。すばらしい。ということで、KMP法というやつをScalaで書いて見る。
いや、Scalaブログ的には関数型っぽく書くとかっこいいとされているし、実際、関数脳は大事なのだが、better Javaとしてふつうに使えてるよ、という例までに。
//文字列探索のアルゴリズムに KMP (Knuth-Morris-Pratt) 法
// REPL環境での試し方 :、
 //KMP.find("キーワード","検索対象の文字列"で実行
class State(keyword: String) {
    val EOS = keyword.length - 1
    var loc = 0 //文字の位置
    def done = (loc == EOS) // 最後の位置までたどりついたか

    def next(c: Char) =
        if (c [...]]]></description>
			<content:encoded><![CDATA[<p>Scalaって、なんだか中途半端な<span style="text-decoration: line-through;">関節技使い</span>関数型言語じゃね、と思ってるおまいらに<br />
Scalaの<span style="text-decoration: line-through;">打撃系</span>手続き型言語の実力を見せてやんよ(~&gt;　つり)。。</p>
<p>@ITにて、J<a href="http://www.atmarkit.co.jp/fcoding/articles/algorithm/01/algorithm01a.html">avaScriptでストイックにアルゴリズムとデータ構造している連載</a>を見つけた。すばらしい。ということで、<a href="http://www.atmarkit.co.jp/fcoding/articles/algorithm/07/algorithm07b.html">KMP法というやつ</a>をScalaで書いて見る。</p>
<p>いや、Scalaブログ的には関数型っぽく書くとかっこいいとされているし、実際、関数脳は大事なのだが、better Javaとしてふつうに使えてるよ、という例までに。</p>
<pre class="brush:scala">//文字列探索のアルゴリズムに KMP (Knuth-Morris-Pratt) 法
// REPL環境での試し方 :、
 //KMP.find("キーワード","検索対象の文字列"で実行</pre>
<pre class="brush:scala">class State(keyword: String) {
    val EOS = keyword.length - 1
    var loc = 0 //文字の位置
    def done = (loc == EOS) // 最後の位置までたどりついたか

    def next(c: Char) =
        if (c == keyword(loc)) {
            println(" =&gt; find : [ " + c.toString+ " ]")
            loc += 1
        } else loc = 0
}

object KMP {
    def find(keyword: String, text: String): Boolean = {
        val EOS = text.length - 1
        val state = new State(keyword)
        def next(loc : Int): Boolean =
            if (loc == EOS) {
                false
            } else {
                if (state.done) true else {
                    state.next(text(loc))
                    next(loc + 1)
                }
            }
        next(0)
    }
}</pre>
<p>再帰しか使ってないからほぼそのままGoとかにも移植できるだろう・・・書いて見れば、基礎体力を比べるベンチマークにいい、かな？？</p>
<p>関数型言語らしいKMPは、ether氏の<a href="http://rainyday.blog.so-net.ne.jp/search/?keyword=(Knuth-Morris-Pratt">こちら</a>(Haskell版からの移植)。</p>
<p>さて、入門者向けにこのJavaScriptのコードを解説するならば・・・はっ、JavaScriptのコード、見るの忘れてた。</p>
<p>－－－</p>
<p>[追記]夕飯を食べて、なんとなく見直してみたところ、一箇所間違っていることに気が付いた。まぁ、さらした後書き換えるのも既にかっこ悪いので、修正は皆様にお任せすることにする(いずれ、ScalaTestとかSpecsとかのテストツールネタで使うということにしておこう。)こうしたロジックのミスは、もちろんコンパイラが見つけてくれることはない。</p>
]]></content:encoded>
			<wfw:commentRss>http://wordprogress.org/archives/483/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Clojure as a 0.8 true language</title>
		<link>http://wordprogress.org/archives/458</link>
		<comments>http://wordprogress.org/archives/458#comments</comments>
		<pubDate>Fri, 13 Nov 2009 17:25:33 +0000</pubDate>
		<dc:creator>kyon</dc:creator>
				<category><![CDATA[Go]]></category>
		<category><![CDATA[Scala]]></category>
		<category><![CDATA[clojure]]></category>
		<category><![CDATA[Matz]]></category>

		<guid isPermaLink="false">http://wordprogress.org/?p=458</guid>
		<description><![CDATA[Javaバーチャルマシン上のLisp系新言語Clojureの良さについて書く。
Lisp系といっても、なんだか読みやすいのである。そして、実案件でも使われていたり。興味を持った方は、まずは、「InfoQ　Jruby　Clojure」あたりでぐぐってみてほしい。
＃追記・寝ぼけていたのかtypo多すぎなので修正orz
私の知る限り、日本語の記述でもっともClojureに好意的な記述をしてくださっているのは、何をかくそう、プログラミング言語Ruby作者Matz氏の「the 0.8 true language」である(ただし、潜在的には、だが)。以下、このMatz氏の長年日記を参考にさせてもらいながら書いていく。
&#8212;&#8212;&#8212;-(ここからMatzにっきの引用中心)&#8212;&#8212;&#8212;&#8212;-
 
Matz氏は問う、「(これからのプログラミングの)80%の領域をカバーする言語」、名づけて「the 0.8 true language」はいかなるものか、と。そして、Matz氏はいくつかの条件を挙げている。

オブジェクトとメッセージ(or 動的結合)
 高階関数(とクロージャ) ※ここのクロージャは当然、言語機能
内部DSL
並列実装技術
そして、シンプルな文法

Matz氏は、これらを満たす候補として、第一にLispとRubyをあげつつ、現時点のRubyをthe 0.8 true language候補としては留保している(並列実装技術の導入が遅れているため)。そして、Lispについては、内部DSL向けではない(Lispのマクロは別物の言語を作りやすすぎるから)点を課題として挙げている。
そして、Matz氏の日記は、以下の言をつぶやいて終わる(まぁ、続きはそのうちに、という感じで)。

今後Java方面では、ますますのXMLの活用とJVM上のJavaでない言語の台頭が予想される。 というか、もうかなり出てきてるよね。JRubyとかGroovyとかScalaとかClojureとか。



&#8212;&#8212;&#8212;&#8211;(Matzにっきの引用終わり)&#8212;&#8212;&#8212;&#8212;&#8212;
さて、以上のJRuby～Clojureの４言語の中で、Clojureのみが上記５条件を満たす、と思っている。JRubyとGroovyは並列処理に弱い。そして、Scalaはぜんぜんシンプルではない。
他方、Clojureは、Scheme/CommonLisp等の標準Lispとの互換性を捨て、S式内部にDSLを持つLispである(clojureコミュニティではLess Lispyと呼んでいたりする。Lispっぽくなくも書ける・・)。内部DSLを意識し、並列処理を前面に出した唯一のLisp、それがClojureである。
・・・ということで、本サイトではこれからもClojureに注目していく。Clojureがマイナーであること・おそらくマイナーでありつづけることを知っているので、ややネタ的に。これでいいんだよな、長門Clojure。そう、Clojureはふつうの言語より0.2くらい欠けている(例えば、継承ベースのオブジェクト指向言語機能は、「一切ない」)のだが、それが、逆にシンプルさ・科目さという魅力を出しているのだ。



[追記]継承ベースのオブジェクト指向言語機能が「一切ない」言語といえば、GoogleのGo言語もそのひとつ。 Goにたぶん言語機能としてのクロージャ(closure)はないが、当然実装可能である。Goがclosureを持つ言語(例えば、RubyやClojure)を実装すれば、組み合わせとして上記の５条件をかなり良好に満たすであろうことをいいそえておく。Cの継承者を目指すGoにはそのうちいくつものスクリプト言語系が実装されるであろうことは、想像に難くない。

[本投稿の背景事情]　小ネタをいろいろおりまぜつつの本サイト、個人的にはScalaとClojureの比較をメインに据えていく予定であったのだが、(自らの発熱に)ついカッとなって、想定外にScala v.s. Goの比較をしたところ、急に本サイトにアクセスが集中してまっている。このままでは、既に全校生徒世界的に注目の集まっているScalaはさとおき、文芸部とコンピ研Lisperの間のみで話題となっているClojureが埋没しかねない。というか、誰も読まないだろうと思って書いたネタに相当のアクセスが流れて、ちょっとまずい状況。ということで、いてもたってもいられず、まじめにClojureの良さを、まずは少しだけ書いておいたと。



 
]]></description>
			<content:encoded><![CDATA[<h3>Javaバーチャルマシン上のLisp系新言語Clojureの良さについて書く。</h3>
<p>Lisp系といっても、なんだか読みやすいのである。そして、実案件でも使われていたり。興味を持った方は、まずは、「InfoQ　Jruby　Clojure」あたりでぐぐってみてほしい。<br />
<span style="color: #800000;">＃追記・寝ぼけていたのかtypo多すぎなので修正orz</span></p>
<p>私の知る限り、日本語の記述でもっともClojureに好意的な記述をしてくださっているのは、何をかくそう、プログラミング言語Ruby作者Matz氏の「<strong><a href="http://www.rubyist.net/~matz/20091003.html">the 0.8 true language</a><span style="font-weight: normal; font-size: 13px;">」である(ただし、潜在的には、だが)。以下、このMatz氏の長年日記を参考にさせてもらいながら書いていく。<br />
&#8212;&#8212;&#8212;-(ここからMatzにっきの引用中心)&#8212;&#8212;&#8212;&#8212;-</span></strong></p>
<p><strong> </strong></p>
<p><strong><span style="line-height: 23px;">Matz氏は問う、「(これからのプログラミングの)80%の領域をカバーする言語」、名づけて「<strong><span style="color: #800000;">the 0.8 true language</span></strong>」はいかなるものか、と。そして、Matz氏はいくつかの条件を挙げている。</span></strong></p>
<ul>
<li><span style="font-family: メイリオ; font-size: small; color: #555555;">オブジェクトとメッセージ(or 動的結合)</span></li>
<li><span style="font-family: メイリオ; font-size: small; color: #555555;"> 高階関数(とクロージャ) </span><span style="font-size: small;"><span style="color: #ff0000;">※ここのクロージャは当然、言語機能</span></span></li>
<li><span style="font-family: メイリオ; color: #555555;"><span style="font-size: x-small;"><span style="line-height: 23px; font-size: small;">内部DSL</span></span></span></li>
<li><span style="font-family: メイリオ; color: #555555;"><span style="line-height: 23px; font-size: x-small;">並列実装技術</span></span></li>
<li><span style="font-family: メイリオ; line-height: 23px; color: #555555; ">そして、シンプルな文法</span></li>
</ul>
<p><span style="font-family: メイリオ; color: #555555;"><span style="line-height: 23px;">Matz氏は、これらを満たす候補として、第一にLispとRubyをあげつつ、現時点のRubyを<span style="color: #000000; font-family: Georgia, 'Times New Roman', 'Bitstream Charter', Times, serif;">the 0.8 true language候補としては留保している(並列実装技術の導入が遅れているため)。そして、Lispについては、内部DSL向けではない(Lispのマクロは別物の言語を作りやすすぎるから)点を課題として挙げている。</span></span></span></p>
<p><span style="font-family: メイリオ; color: #555555;"><span style="line-height: 23px;"><span style="color: #000000; font-family: Georgia, 'Times New Roman', 'Bitstream Charter', Times, serif;">そして、Matz氏の日記は、以下の言をつぶやいて終わる(まぁ、続きはそのうちに、という感じで)。</span></span></span></p>
<ul>
<li><span style="line-height: 23px; font-size: small; color: #800000;">今後Java方面では、ますますのXMLの活用とJVM上のJavaでない言語の台頭が予想される。 というか、もうかなり出てきてるよね。JRubyとかGroovyとかScalaとかClojureとか。</span></li>
</ul>
<p style="margin-top: 0.5em; margin-right: 1em; margin-bottom: 1em; margin-left: 2em; line-height: 23px; ">
<p style="margin-top: 0.5em; margin-right: 1em; margin-bottom: 1em; margin-left: 2em; line-height: 23px; ">
<p style="margin-top: 0.5em; margin-right: 1em; margin-bottom: 1em; margin-left: 2em; line-height: 23px; ">&#8212;&#8212;&#8212;&#8211;(Matzにっきの引用終わり)&#8212;&#8212;&#8212;&#8212;&#8212;</p>
<p style="margin-top: 0.5em; margin-right: 1em; margin-bottom: 1em; margin-left: 2em; line-height: 23px; "><span style="font-size: small; ">さて、以上のJRuby～Clojureの４言語の中で、Clojureのみが上記５条件を満たす、と思っている。JRubyとGroovyは並列処理に弱い。そして、Scalaはぜんぜんシンプルではない。</span></p>
<p style="margin-top: 0.5em; margin-right: 1em; margin-bottom: 1em; margin-left: 2em; line-height: 23px; "><span style="font-size: small; ">他方、Clojureは、Scheme/CommonLisp等の標準Lispとの互換性を捨て、S式内部にDSLを持つLispである(clojureコミュニティではLess Lispyと呼んでいたりする。Lispっぽくなくも書ける・・)。内部DSLを意識し、並列処理を前面に出した唯一のLisp、それがClojureである。</span></p>
<p style="margin-top: 0.5em; margin-right: 1em; margin-bottom: 1em; margin-left: 2em; line-height: 23px; "><span style="font-size: small; ">・・・ということで、本サイトではこれからもClojureに注目していく。Clojureがマイナーであること・おそらくマイナーでありつづけることを知っているので、<a href="http://wordprogress.org/archives/119">ややネタ的に。これでいいんだよな、</a><span style="text-decoration: line-through;"><a href="http://wordprogress.org/archives/119">長門</a></span><a href="http://wordprogress.org/archives/119">Clojure</a>。そう、Clojureはふつうの言語より0.2くらい欠けている(例えば、継承ベースのオブジェクト指向言語機能は、「一切ない」)のだが、それが、逆にシンプルさ・科目さという魅力を出しているのだ。</span></p>
<p style="margin-top: 0.5em; margin-right: 1em; margin-bottom: 1em; margin-left: 2em; line-height: 23px; "><span style="font-size: small; "><br />
</span></p>
<p style="margin-top: 0.5em; margin-right: 1em; margin-bottom: 1em; margin-left: 2em; line-height: 23px; ">
<p style="margin-top: 0.5em; margin-right: 1em; margin-bottom: 1em; margin-left: 2em; line-height: 23px; "><span style="font-size: small; ">[追記]継承ベースのオブジェクト指向言語機能が「一切ない」言語といえば、GoogleのGo言語もそのひとつ。 Goにたぶん言語機能としてのクロージャ(closure)はないが、当然実装可能である。Goがclosureを持つ言語(例えば、RubyやClojure)を実装すれば、組み合わせとして上記の５条件をかなり良好に満たすであろうことをいいそえておく。Cの継承者を目指すGoにはそのうちいくつものスクリプト言語系が実装されるであろうことは、想像に難くない。</span></p>
<ul>
<li><span style="color: #800000;">[本投稿の背景事情]　小ネタをいろいろおりまぜつつの本サイト、個人的にはScalaとClojureの比較をメインに据えていく予定であったのだが、(自らの発熱に)ついカッとなって、想定外にScala v.s. Goの比較をしたところ、急に本サイトにアクセスが集中してまっている。このままでは、既に</span><span style="text-decoration: line-through;"><span style="color: #800000;">全校生徒</span></span><span style="color: #800000;">世界的に注目の集まっているScalaはさとおき、</span><span style="text-decoration: line-through;"><span style="color: #800000;">文芸部とコンピ研</span></span><span style="color: #800000;">Lisperの間のみで話題となっているClojureが埋没しかねない。というか、誰も読まないだろうと思って書いたネタに相当のアクセスが流れて、ちょっとまずい状況。ということで、いてもたってもいられず、まじめにClojureの良さを、まずは少しだけ書いておいたと。</span></li>
<div><span style="color: #800000;"><br />
</span></div>
</ul>
<p><span style="font-family: メイリオ; line-height: normal; font-size: small; color: #555555;"> </span></p>
]]></content:encoded>
			<wfw:commentRss>http://wordprogress.org/archives/458/feed</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>限界を打ち破るはScalaかGoogleのGoか　(「Scala入門」に勝手流追記その２)</title>
		<link>http://wordprogress.org/archives/435</link>
		<comments>http://wordprogress.org/archives/435#comments</comments>
		<pubDate>Thu, 12 Nov 2009 18:57:51 +0000</pubDate>
		<dc:creator>kyon</dc:creator>
				<category><![CDATA[Go]]></category>
		<category><![CDATA[Scala]]></category>
		<category><![CDATA[clojure]]></category>
		<category><![CDATA[長門有希]]></category>

		<guid isPermaLink="false">http://wordprogress.org/?p=435</guid>
		<description><![CDATA[Scala入門　勝手流追記　その２。元記事が大上段なので、こちらも大上段に。
Scalaで実サービスをリリースしている著者らのJavaの限界を超えて実用化を目指す新開発言語「Scala」のメリットとは～前編(codezine誌)
今回は、codezine、１位と２位の記事がScalaとGoであること(11/12時点)にちなんで両者を比較しつつ、元記事に一点だけ突っ込む。

[追記@昼間]
以下、熱が下がった直後の明け方に書いたんで、いろいろ記載が粗いので、前提条件・抜け落ち等を補充。
◇プログラミング言語比較の前提はTiobeのランキングのような検索エンジンベースのランキング。
　当然、書籍ベースのランキングや「魂」のランキングは十分に加味されていない・・・のはさておき、そもそも検索エンジンという仕組みへの信頼性が落ちている(少なくとも不況下の幻滅期にある)と思われるので、プログラミング言語の流行り廃りの議論に、こうしたランキングが良いかは、不明(といっても、Tiobeランキングのどの位置にGoがやってくるのか、皆興味あるだろうが)
◇Tiobeベースで話を進めているのに、メジャー言語にPHPが抜けていた。
　これはScala v.s. Goということでミドルから下を主に考えていたから。少なくとも、Goベースのwebサーバは遠からず出てくるだろうし、その上でPHPが動くだろう事も明らかなので、PHPの文字を補っておいた。そもそもこのサイトもWordPress。いや速度面はさておき、良く出来ている。
◇そして、何より、議論のベースに静的片付け言語万歳。C系構文は永遠に不滅です、って言うのがあった(Goはいうまでもなく、ScalaもけっこうC系言語)。
　これは、
　　「真のバカでも使えるものを設計しようとして人々がよくやるミスは、
　　　真のバカのバカさ加減を過小評価することだ」
　　　　　－－Douglas Adams
　(出典　Diomisid Spinellis著　『コード・リーディング』, p65)
　という警句を、コンパイル時に真にバカなミスをしまくっている自分なりに重く受け入れているから。システム系言語はバカの壁に大いに配慮してほしい。ともあれ、Goみたいのがでてくると、下のレイヤの本を読もうという気になる。Goはひょっとしたら泡沫言語になるのかもしれないけれど、少なくとも、Cに近いレイヤに刺激を与える貢献は達成するのでは。
[再度追記
『コード・リーディング』を開いたついでに、監訳者であるMatz氏のにっきを見ると、Goについてのコメントが。やはり、Goには、尊敬するMatz氏も気になる変態言語(というか、大胆な言語)の側面あり。コメントでのやりとりにあるとおり、実装の継承(共有)まわり、プロトタイプ継承っぽいのでは・・・。「半人前の言語」あるいは「小学１年生(ただし神童)くらいの言語」だからこそ、Goと共にプログラミングを学ぶ価値はある。
＜本文＞
JRuby/Jythonなどスクリプト言語由来の言語と異なり、Javaと同様の静的コンパイル言語であるScalaは、Javaバーチャルマシンの主流言語の座をめぐり、本家Javaに挑む挑戦者に位置づけられる。
その試みが成就するのは、早くとも数年後であろうが、Javaの袋小路を打ち破る方向性をScalaは示したといえる。
Javaに対するScalaの利点は、以下の３つであろう。

不変性(val)の上手な導入による容易な並列処理プログラミング　※メモリリーク等を防ぐガベージコレクションの仕組みあり
簡潔な表記と型を含めたカスタマイズを可能とする言語内言語(DSL)構築能力　※タイプセーフなスタイルを採用
スクリプトに近い簡潔な記述(関数型言語の型推論などに由来)

-----------
と書いたところで、これらの特性はただいま祭り中のグーグルの新プログラミング言語Goの特性とかぶることに気がつく。
C言語に対するGo言語の利点(私見)

・goroutine等による容易な並列処理プログラミング　※メモリリーク等を防ぐガベージコレクションの仕組みあり
・interface機能による言語拡張構能力(C++のtemplateに近いもの、か)　※タイプセーフなスタイルを採用

一方、ScalaとGoの明らかな相違点

・Scalaの言語仕様は巨大。Goの言語仕様は現時点では小さい　=&#62; コンパイル時間についてはGoの圧勝(実行速度は最適化されたJavaVM上のScalaが速い場合もあろう)

※JVMかネイティブかはさておく。小飼氏ではないが、ネイティブScalaの可能性だってある。
Goの方の利点は２つだけであるが、これはGoがCに近しい低レベルな言語であることによる。RubyがCで実装されたように、Goの上でGoと親和的なスクリプト言語が出てくるのも遠くないことと思われる。
そうなると、2010年代の新主流言語をめぐる争いの中で、注目株のひとつが、
Scala v.s. (Go+(新)スクリプト言語)
というものになる可能性がある(あくまで仮説)。
もしかすると、この２言語の争いは、C,Java,C++(かろうじてC#)といったメジャー言語に割ってはいる最後の新言語をめぐる争いとなるかもしれない
※それ以降(2020年以降？)にくる「新言語」は、もはやアルファベットと記号で表記するプログラミング言語でないのかもしれない。
※個人的には、(新)スクリプト言語の座は、clojureであってほしいと思っているのだが、、実際には、PHPやRuby、あるいはそれらの新種がその位置を占めるのかもしれない。
----------
この仮説はさておき、Goの登場は、本格的な並列処理対応を打ち出した新型の手続き型言語の登場ということで、並列処理対応といえば、関数型言語Erlang,Scala,Clojure・・・という流れを変えるきっかけになるのかもしれない。
これは、かつての総合格闘技をグレーシー一族が関節技・寝技で席巻していた中で、グレーシーを打撃で打ち破った猛者が出たことで、打撃系が一気に見直されたようなもの・・か？(少なくとも、関数型言語には、関節技的なマニアックさがあるのは事実 ^^)
とここで、気がつくのは、数ある関数型言語の中で、唯一Scalaだけが、手続き型プログラミングも普通にかけるハイブリット言語であることを打ち出していることだ。
(実際、codezine記事のパテントビューロ社も手続き型言語の経験者のみが集まり、Scalaで実システムを作り上げている)
すなわち、Goの登場により、新世代の並列処理もやはり手続き型プログラミング・スタイルが主流となったとしても、Scalaは十分生き残っていくポテンシャルがあるのだ。
※言語仕様は巨大だが、現時点でも実行速度は相当速い
再び述べるが、やはり、「現存の言語では最も美少女な Scala」(小飼弾言を日々Scalaを使っている身から一部修正。現時点のScalaは大人の女性ではなく女子高校生レベルの成長途上にある)なのだ。
Scalaと、センセーショナルにデビューしたGo[golangのMLは１日で1000人近い参加者という押すな押すな状態]との関係、今後が楽しみである。
ということで、私は、昼はScala、夜はGoをいじる毎日でいこうと思う(Goについてはgoroutineはさておいて、斬新と思われるinterfaceを押さえたい)。
さて、元Scaka入門記事に一点だけつっこみ
６ページ目「Arrayは直接にAnyをデータ要素として持つことはできないようです(注４)」
少しミスリーディングな記述である(Genericや型パラメータの解説前なので仕方ないが)。Scalaの利点は静的な型づけにある。故に、入門記事であっても型の話は慎重に書かなければならない。
ので、勝手に補充
例えば、mapをもちいたArrayでは、ANY型を持つことができる(持ってしまう)
val anyarr =
   Array.range(1,101).map { n =&#62; n match{
            case _ if (n%15 == 0) =&#62; " FizzBuzz "
            case _ [...]]]></description>
			<content:encoded><![CDATA[<p>Scala入門　勝手流追記　その２。元記事が大上段なので、こちらも大上段に。</p>
<p>Scalaで実サービスをリリースしている著者らの<a href="http://codezine.jp/article/detail/4475">Javaの限界を超えて実用化を目指す新開発言語「Scala」のメリットとは～前編</a>(codezine誌)</p>
<p>今回は、codezine、１位と２位の記事がScalaとGoであること(11/12時点)にちなんで両者を比較しつつ、元記事に一点だけ突っ込む。</p>
<p><img class="alignnone size-full wp-image-436" title="ランキング" src="http://wordprogress.org/wp2045/wp-content/uploads/2009/11/ランキング.jpg" alt="ランキング" width="308" height="202" /></p>
<pre style="margin-top: 0px; margin-right: 1em; margin-bottom: 0px; margin-left: 1em; background-color: #c8c8f8; white-space: pre-wrap; word-wrap: break-word; padding: 1ex; border: 1px solid #707b8d;"><strong>[追記@昼間]</strong>
以下、熱が下がった直後の明け方に書いたんで、いろいろ記載が粗いので、前提条件・抜け落ち等を補充。
<strong>◇プログラミング言語比較の前提は<a href="http://www.tiobe.com/index.php/content/paperinfo/tpci/index.html">Tiobeのランキング</a>のような検索エンジンベースのランキング。</strong>
　当然、書籍ベースのランキングや「魂」のランキングは十分に加味されていない・・・のはさておき、そもそも検索エンジンという仕組みへの信頼性が落ちている(少なくとも不況下の幻滅期にある)と思われるので、プログラミング言語の流行り廃りの議論に、こうしたランキングが良いかは、不明(といっても、Tiobeランキングのどの位置にGoがやってくるのか、皆興味あるだろうが)
<strong>◇Tiobeベースで話を進めているのに、メジャー言語にPHPが抜けていた。</strong>
　これはScala v.s. Goということでミドルから下を主に考えていたから。少なくとも、Goベースのwebサーバは遠からず出てくるだろうし、その上でPHPが動くだろう事も明らかなので、PHPの文字を補っておいた。そもそもこのサイトもWordPress。いや速度面はさておき、良く出来ている。
<strong>◇そして、何より、議論のベースに静的片付け言語万歳。C系構文は永遠に不滅です、って言うのがあった(Goはいうまでもなく、ScalaもけっこうC系言語)。</strong>
　これは、
　　<span style="color: #808000;"><strong>「真のバカでも使えるものを設計しようとして人々がよくやるミスは、
　　　真のバカのバカさ加減を過小評価することだ」
　　　　　－－Douglas Adams
　(出典　Diomisid Spinellis著　</strong></span><em><span style="color: #808000;"><strong>『コード・リーディング』</strong></span></em><span style="color: #808000;"><strong>, p65)</strong></span>
　という警句を、コンパイル時に真にバカなミスをしまくっている自分なりに重く受け入れているから。システム系言語はバカの壁に大いに配慮してほしい。ともあれ、Goみたいのがでてくると、下のレイヤの本を読もうという気になる。Goはひょっとしたら泡沫言語になるのかもしれないけれど、少なくとも、Cに近いレイヤに刺激を与える貢献は達成するのでは。
<strong>[再度追記</strong>
『コード・リーディング』を開いたついでに、監訳者であるMatz氏のにっきを見ると、<a href="http://www.rubyist.net/~matz/20091113.html">Goについてのコメント</a>が。やはり、Goには、尊敬するMatz氏も気になる変態言語(というか、大胆な言語)の側面あり。コメントでのやりとりにあるとおり、実装の継承(共有)まわり、プロトタイプ継承っぽいのでは・・・。「半人前の言語」あるいは「小学１年生(ただし神童)くらいの言語」だからこそ、Goと共にプログラミングを学ぶ価値はある。</pre>
<h4>＜本文＞</h4>
<p>JRuby/Jythonなどスクリプト言語由来の言語と異なり、Javaと同様の静的コンパイル言語であるScalaは、Javaバーチャルマシンの主流言語の座をめぐり、本家Javaに挑む挑戦者に位置づけられる。</p>
<p>その試みが成就するのは、早くとも数年後であろうが、Javaの袋小路を打ち破る方向性をScalaは示したといえる。</p>
<h3>Javaに対するScalaの利点は、以下の３つであろう。</h3>
<ul>
<li>不変性(val)の上手な導入による容易な並列処理プログラミング　※メモリリーク等を防ぐガベージコレクションの仕組みあり</li>
<li>簡潔な表記と型を含めたカスタマイズを可能とする言語内言語(DSL)構築能力　※タイプセーフなスタイルを採用</li>
<li>スクリプトに近い簡潔な記述(関数型言語の型推論などに由来)</li>
</ul>
<p>-----------</p>
<p>と書いたところで、これらの特性はただいま祭り中のグーグルの新プログラミング言語Goの特性とかぶることに気がつく。</p>
<h3>C言語に対するGo言語の利点(私見)</h3>
<ul>
<li>・goroutine等による容易な並列処理プログラミング　※メモリリーク等を防ぐガベージコレクションの仕組みあり</li>
<li>・interface機能による言語拡張構能力(C++のtemplateに近いもの、か)　※タイプセーフなスタイルを採用</li>
</ul>
<p>一方、ScalaとGoの明らかな相違点</p>
<ul>
<li>・Scalaの言語仕様は巨大。Goの言語仕様は現時点では小さい　=&gt; コンパイル時間についてはGoの圧勝(実行速度は最適化されたJavaVM上のScalaが速い場合もあろう)</li>
</ul>
<p>※JVMかネイティブかはさておく。小飼氏ではないが、ネイティブScalaの可能性だってある。</p>
<p>Goの方の利点は２つだけであるが、これはGoがCに近しい低レベルな言語であることによる。RubyがCで実装されたように、Goの上でGoと親和的なスクリプト言語が出てくるのも遠くないことと思われる。</p>
<p>そうなると、2010年代の新主流言語をめぐる争いの中で、注目株のひとつが、</p>
<h2><span style="color: #ff0000;">Scala v.s. (Go+(新)スクリプト言語)</span></h2>
<p>というものになる可能性がある(あくまで仮説)。</p>
<p>もしかすると、この２言語の争いは、C,Java,C++(かろうじてC#)といった<span style="color: #ff0000;">メジャー言語に割ってはいる最後の新言語をめぐる争いとなるかも</span>しれない</p>
<p>※それ以降(2020年以降？)にくる「新言語」は、もはやアルファベットと記号で表記するプログラミング言語でないのかもしれない。</p>
<p>※個人的には、(新)スクリプト言語の座は、clojureであってほしいと思っているのだが、、実際には、PHPやRuby、あるいはそれらの新種がその位置を占めるのかもしれない。</p>
<p>----------</p>
<p>この仮説はさておき、Goの登場は、本格的な並列処理対応を打ち出した新型の手続き型言語の登場ということで、並列処理対応といえば、関数型言語Erlang,Scala,Clojure・・・という流れを変えるきっかけになるのかもしれない。</p>
<p>これは、かつての総合格闘技をグレーシー一族が関節技・寝技で席巻していた中で、グレーシーを打撃で打ち破った猛者が出たことで、打撃系が一気に見直されたようなもの・・か？(少なくとも、関数型言語には、関節技的なマニアックさがあるのは事実 ^^)</p>
<p>とここで、気がつくのは、数ある関数型言語の中で、唯一Scalaだけが、手続き型プログラミングも普通にかけるハイブリット言語であることを打ち出していることだ。<br />
(実際、codezine記事のパテントビューロ社も手続き型言語の経験者のみが集まり、Scalaで実システムを作り上げている)</p>
<p>すなわち、Goの登場により、新世代の並列処理もやはり手続き型プログラミング・スタイルが主流となったとしても、Scalaは十分生き残っていくポテンシャルがあるのだ。</p>
<p>※言語仕様は巨大だが、現時点でも実行速度は相当速い</p>
<p>再び述べるが、やはり、「現存の言語では最も美少女な Scala」(<a href="http://blog.livedoor.jp/dankogai/archives/51275491.html">小飼弾言</a>を日々Scalaを使っている身から一部修正。<em>現時点のScalaは大人の女性ではなく女子高校生レベルの成長途上にある</em>)なのだ。</p>
<p>Scalaと、センセーショナルにデビューしたGo[golangのMLは１日で1000人近い参加者という押すな押すな状態]との関係、今後が楽しみである。</p>
<p>ということで、私は、昼はScala、夜はGoをいじる毎日でいこうと思う(Goについてはgoroutineはさておいて、斬新と思われるinterfaceを押さえたい)。</p>
<p>さて、元Scaka入門記事に一点だけつっこみ</p>
<p><a href="http://codezine.jp/article/detail/4475?p=6">６ページ目</a>「Arrayは直接にAnyをデータ要素として持つことはできないようです(注４)」</p>
<p>少しミスリーディングな記述である(Genericや型パラメータの解説前なので仕方ないが)。Scalaの利点は静的な型づけにある。故に、入門記事であっても型の話は慎重に書かなければならない。</p>
<p>ので、勝手に補充</p>
<p>例えば、mapをもちいたArrayでは、ANY型を持つことができる(持ってしまう)</p>
<pre class="brush:scala">val anyarr =
   Array.range(1,101).map { n =&gt; n match{
            case _ if (n%15 == 0) =&gt; " FizzBuzz "
            case _ if (n%3 == 0) =&gt;"Fizz "
            case _ if (n%5 == 0) =&gt; "Buzz "
            case _ =&gt;  n
      }
   }</pre>
<p>※この例は、以前書いた<a href="http://wordprogress.org/archives/208">関数型FizzBuzz</a>のArray版<br />
実行してみる :</p>
<pre style="margin-left: 1em; margin-right: 1em; background-color: #f8f8f8; white-space: pre-wrap; word-wrap: break-word; padding: 1ex; border: 1px solid #707b8d;">scala&gt; val anyarr =
Array.range(1,101).map { n =&gt; n match{
            case _ if (n%15 == 0) =&gt; " FizzBuzz "
            case _ if (n%3 == 0) =&gt;"Fizz "
            case _ if (n%5 == 0) =&gt; "Buzz "
            case _ =&gt;  n
      }
}
anyarr: Array[Any] = Array(1, 2, Fizz , 4, Buzz , Fizz , 7, 8, Fizz , Buzz , 11, Fizz , 13, 14,  FizzBuzz , 16, 17, Fizz
 , 19, Buzz , Fizz , 22, 23, Fizz , Buzz , 26, Fizz , 28, 29,  FizzBuzz , 31, 32, Fizz , 34, Buzz , Fizz , 37, 38, Fizz
, Buzz , 41, Fizz , 43, 44,  FizzBuzz , 46, 47, Fizz , 49, Buzz , Fizz , 52, 53, Fizz , Buzz , 56, Fizz , 58, 59,  FizzB
uzz , 61, 62, Fizz , 64, Bu...</pre>
<p>ちなみに、タイプセーフなプログラミングができるScalaではAnyとなったArrayからIntやStringなど任意の型を抜き出すことができる。</p>
<pre style="margin-left: 1em; margin-right: 1em; background-color: #f8f8f8; white-space: pre-wrap; word-wrap: break-word; padding: 1ex; border: 1px solid #707b8d;">scala&gt; anyarr.filter(_.isInstanceOf [Int]).map (_.asInstanceOf[Int]) res51: Array[Int] = Array(1, 2, 4, 7, 8, 11, 13, 14, 16, 17, 19, 22, 23, 26, 28, 29, 31, 32, 34, 37, 38, 41, 43, 44, 46,  47, 49, 52, 53, 56, 58, 59, 61, 62, 64, 67, 68, 71, 73, 74, 76, 77, 79, 82, 83, 86, 88, 89, 91, 92, 94, 97, 98)
scala&gt; anyarr.filter(_.isInstanceOf [String]).map (_.asInstanceOf[String]) res52: Array[String] = Array(Fizz , Buzz , Fizz , Fizz , Buzz , Fizz ,  FizzBuzz , Fizz , Buzz , Fizz , Fizz , Buzz , Fi zz ,  FizzBuzz , Fizz , Buzz , Fizz , Fizz , Buzz , Fizz ,  FizzBuzz , Fizz , Buzz , Fizz , Fizz , Buzz , Fizz ,  FizzBu zz , Fizz , Buzz , Fizz , Fizz , Buzz , Fizz ,  FizzBuzz , Fizz , Buzz , Fizz , Fizz , Buzz , Fizz ,  FizzBuzz , Fizz , Buzz , Fizz , Fizz , Buzz )</pre>
<p>===========================</p>
<p>[追記]　Scala以外の関数型言語が好きな方へ(というか、Scalaは関数型言語でないと思っている方へ)。</p>
<p>何を隠そう私は<span style="text-decoration: line-through;">長門</span>clojure萌えである。実際、Scalaのように全方位外交巨大仕様でなく、小さな言語仕様で手になじむ言語・萌える言語ならば、それで良いではないか。</p>
<p>いつの日か、<span style="text-decoration: line-through;">長門</span>clojureと日がな暮らす日が来ることをひそかに私も願っている。</p>
<p>なぜ、clojureが長門かは<a href="http://wordprogress.org/archives/119">ここ</a>を見てほしい・・・。<span style="color: #ff0000;">ぁ、真面目にclojureを知りたい方は、RubyのMatz氏のエントリにヒントを得た</span><a href="http://wordprogress.org/archives/458">こちら</a><span style="color: #ff0000;">をどうぞ</span>(はてぶ経由でいろいろな方が訪れてくれているっぽいので、あわてて追記)。</p>
]]></content:encoded>
			<wfw:commentRss>http://wordprogress.org/archives/435/feed</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Scalaから見たClojure　その３　Heskellのgroup移植祭り</title>
		<link>http://wordprogress.org/archives/366</link>
		<comments>http://wordprogress.org/archives/366#comments</comments>
		<pubDate>Tue, 10 Nov 2009 14:34:02 +0000</pubDate>
		<dc:creator>アルケー</dc:creator>
				<category><![CDATA[Scala]]></category>
		<category><![CDATA[clojure]]></category>

		<guid isPermaLink="false">http://wordprogress.org/?p=366</guid>
		<description><![CDATA[こんな投稿が、Clojure-MLでちょっとした祭りを起こしている。
Does Clojure have a function like Haskell&#8217;s group?
In Haskell,
Input: group [1,2,2,1,1,1,2,2,2,1]
Output: [[1],[2,2],[1,1,1],[2,2,2],[1]]
Thanks
そのなの、partition-by関数一発だろと、
(use &#8216;clojure.contrib.seq-utils)
(partition-by identity [1 2 2 1 1 1 2 2 2 1])
=&#62; ((1) (2 2) (1 1 1) (2 2 2) (1))
という突込みが入った後、
そんなgroupメソッドくらい、自分で作ろうぜと、皆で、いろいろとラムダラムダ(clojureにlambdaは出てこないが・・)。さすがLispers。。
Scalaなら・・・こうかな。

def group (L:List[Any]) = {
    def g1 (L:List[Any],temp :List[List[Any]]) : List[List[Any]]= {
        [...]]]></description>
			<content:encoded><![CDATA[<p>こんな投稿が、<a href="http://groups.google.com/group/clojure/browse_thread/thread/4e5d2c831bcfc048?hl=en">Clojure-MLでちょっとした祭り</a>を起こしている。</p>
<blockquote><p>Does Clojure have a function like Haskell&#8217;s group?<br />
In Haskell,<br />
Input: group [1,2,2,1,1,1,2,2,2,1]<br />
Output: [[1],[2,2],[1,1,1],[2,2,2],[1]]<br />
Thanks</p></blockquote>
<blockquote><p>そのなの、partition-by関数一発だろと、<br />
(use &#8216;clojure.contrib.seq-utils)<br />
(partition-by identity [1 2 2 1 1 1 2 2 2 1])<br />
=&gt; ((1) (2 2) (1 1 1) (2 2 2) (1))</p></blockquote>
<p>という突込みが入った後、<br />
そんなgroupメソッドくらい、自分で作ろうぜと、皆で、いろいろとラムダラムダ(clojureにlambdaは出てこないが・・)。さすがLispers。。</p>
<p>Scalaなら・・・こうかな。</p>
<pre class="brush:scala">
def group (L:List[Any]) = {
    def g1 (L:List[Any],temp :List[List[Any]]) : List[List[Any]]= {
        if (L isEmpty) temp
        else {
            if (L.head == temp.head.head) g1 (L.tail,(L.head::temp.head) :: temp.tail)
            else  g1(L.tail, (List(L.head)) ::temp)
        }
    }
    g1(L.tail, List[List[Any]](List(L.head)))
}</pre>
<pre style="margin-top: 0px; margin-right: 1em; margin-bottom: 0px; margin-left: 1em; background-color: #f8f8f8; white-space: pre-wrap; word-wrap: break-word; padding: 1ex; border: 1px solid #707b8d;">scala&gt;  group(List(1,2,2,3,3,3,4))
res1: List[List[Any]] = List(List(4), List(3, 3, 3), List(2, 2), List(1))

Anyにしておいたので、こうもできる。

scala> group(List("A","b","b",1,1,2,2,3,"J"))
res16: List[List[Any]] = List(List(J), List(3), List(2, 2), List(1, 1), List(b, b), List(A))
</pre>
<p>&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8211;<br />
[[ 追記 ]]<br />
kmizushima氏から、foldLeftを使ったgroupをつっこんでもらったので、整形表示: </p>
<pre class="brush:scala">
def group[T](list: List[T]): List[List[T]] = {
    list match {
        case Nil => Nil
        case hd::tl =>
        tl.foldLeft(List(List(hd))){(r, b) =>
            val (a::as) = r
            if(b == a.head) (b::a)::as else List(b)::r
        }.reverse
    }
}
</pre>
<p>Thanks, kmizushimaさん。</p>
]]></content:encoded>
			<wfw:commentRss>http://wordprogress.org/archives/366/feed</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Scalaから見たClojure　その２　congomongo</title>
		<link>http://wordprogress.org/archives/337</link>
		<comments>http://wordprogress.org/archives/337#comments</comments>
		<pubDate>Mon, 09 Nov 2009 13:40:11 +0000</pubDate>
		<dc:creator>アルケー</dc:creator>
				<category><![CDATA[未分類]]></category>
		<category><![CDATA[clojure]]></category>
		<category><![CDATA[congomongo]]></category>
		<category><![CDATA[mongodb]]></category>
		<category><![CDATA[Scala]]></category>

		<guid isPermaLink="false">http://wordprogress.org/?p=337</guid>
		<description><![CDATA[Scalaの欠点をあえてあげるとすれば、言語仕様が大きすぎるところ。
Scalaを使っている時、たいていは、便利・快適。なんだけれど、JSONのようにlight-weightなターゲットを扱う時には、「牛刀をもって鶏を割く(古)」・「馬から落ちて落馬した」的な、大げさ感・冗長感を感じることも。
この点、オブジェクト指向言語で「ない」ことを明言しているClojureは、JSONのようなものと相性が良さげ(これは、ClojureがListに限らずさまざまなデータ構造を扱うのを、Scalaに負けないくらい得意であることにもよる）。
ということで、JSON(BSON)ベースの文書指向データベースmongodbのclojure対応の試み、前々から興味深く思っていたんだけれど、githubにプロジェクトを立ててくれたみたい。
昨日立ったばかりのプロジェクトなんだけれど、例がけっこう充実している！
◇１件のデータのインサート 「私はrobbyという名前のロボットです」
１件のデータのインサート 「私はrobbyという名前のロボットです」
(insert! :robots
         {:name "robby"}
◇一括インサート！ 10,000件まとめて・・のはず
(mass-insert!
  :points
  (for [x (range 100) y (range 100)]
    {:x x
     :y y
     :z (* x y)})) 

 =&#62;  nil

(fetch-count :points)
=&#62; 100000

mongodbはScalaからさわったんだけれど、正直clojureからの方が感触よさげ。
]]></description>
			<content:encoded><![CDATA[<p>Scalaの欠点をあえてあげるとすれば、言語仕様が大きすぎるところ。</p>
<p>Scalaを使っている時、たいていは、便利・快適。なんだけれど、JSONのようにlight-weightなターゲットを扱う時には、「<a href="http://www.kokin.rr-livelife.net/koto/koto_ki/koto_ki_4.html">牛刀をもって鶏を割く</a>(古)」・「馬から落ちて落馬した」的な、大げさ感・冗長感を感じることも。</p>
<p>この点、オブジェクト指向言語で「ない」ことを明言しているClojureは、JSONのようなものと相性が良さげ(これは、ClojureがListに限らずさまざまなデータ構造を扱うのを、Scalaに負けないくらい得意であることにもよる）。</p>
<p>ということで、JSON(BSON)ベースの文書指向データベース<a href="http://www.mongodb.org/display/DOCS/Home">mongodb</a>のclojure対応の試み、前々から興味深く思っていたんだけれど、<a href="http://github.com/somnium/congomongo">githubにプロジェクトを立ててくれた</a>みたい。</p>
<p>昨日立ったばかりのプロジェクトなんだけれど、例がけっこう充実している！</p>
<h3>◇１件のデータのインサート 「私はrobbyという名前のロボットです」</h3>
<div id="_mcePaste" style="position: absolute; left: -10000px; top: 100px; width: 1px; height: 1px; overflow-x: hidden; overflow-y: hidden;">１件のデータのインサート 「私はrobbyという名前のロボットです」</div>
<pre style="margin-top: 1em !important; margin-right: 0px !important; margin-bottom: 1em !important; margin-left: 0px !important; font: normal normal normal 115%/normal Monaco, 'Courier New', 'DejaVu Sans Mono', 'Bitstream Vera Sans Mono', monospace; line-height: 1.5em !important; font-size: 12px; background-color: #f8f8ff !important; color: #444444 !important; overflow-x: auto !important; overflow-y: auto !important; padding: 0.5em !important; border: 1px !important solid !important #dedede !important;"><code style="font: normal normal normal 115%/normal Monaco, 'Courier New', 'DejaVu Sans Mono', 'Bitstream Vera Sans Mono', monospace; line-height: 1.4em; font-size: 12px; background-color: #f8f8ff !important; color: #444444 !important; padding: 0px !important; margin: 0px; border: 1px !important none !important #dedede !important;">(insert! :robots
         {:name "robby"}</code></pre>
<h3><span style="line-height: 16px;">◇一括インサート！ 10,000件まとめて・・のはず</span></h3>
<pre style="margin-top: 1em !important; margin-right: 0px !important; margin-bottom: 1em !important; margin-left: 0px !important; font: normal normal normal 115%/normal Monaco, 'Courier New', 'DejaVu Sans Mono', 'Bitstream Vera Sans Mono', monospace; line-height: 1.5em !important; font-size: 12px; background-color: #f8f8ff !important; color: #444444 !important; overflow-x: auto !important; overflow-y: auto !important; padding: 0.5em !important; border: 1px !important solid !important #dedede !important;"><code style="font: normal normal normal 115%/normal Monaco, 'Courier New', 'DejaVu Sans Mono', 'Bitstream Vera Sans Mono', monospace; line-height: 1.4em; font-size: 12px; background-color: #f8f8ff !important; color: #444444 !important; padding: 0px !important; margin: 0px; border: 1px !important none !important #dedede !important;">(mass-insert!
  :points
  (for [x (range 100) y (range 100)]
    {:x x
     :y y
     :z (* x y)})) 

 =&gt;  nil

(fetch-count :points)
=&gt; 100000
</code></pre>
<p>mongodbはScalaからさわったんだけれど、正直clojureからの方が感触よさげ。</p>
]]></content:encoded>
			<wfw:commentRss>http://wordprogress.org/archives/337/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Clojureから見たScala　その１　メモ化なフィボナッチ数列の紹介</title>
		<link>http://wordprogress.org/archives/314</link>
		<comments>http://wordprogress.org/archives/314#comments</comments>
		<pubDate>Sat, 07 Nov 2009 21:31:34 +0000</pubDate>
		<dc:creator>アルケー</dc:creator>
				<category><![CDATA[Scala]]></category>
		<category><![CDATA[clojure]]></category>
		<category><![CDATA[長門有希]]></category>

		<guid isPermaLink="false">http://wordprogress.org/?p=314</guid>
		<description><![CDATA[clojure-clrの近況を見てClojure萌え再発ついでに。
後発のClojureの側からScalaを見るのが利にかなっていると思ったので、Scalaから見たClojure、改め、今後は 長門有希が観測する涼宮ハルヒClojureから見たScalaでいこうと思い立つ。ということで、ちょっと前にScalaで見たフィボナッチ数列をClojureで。・・・と思ったら、本家にきれいなメモ化の実装が既に本家に置いてありますね。
atomsでフィボナッチ数列@本家clojureサイト

clojureでは、mutableなデータを明示的に扱う。メモ化するデータを、(atom {})にいれていくのがポイント。STMを含め、clojureのmutableなデータの扱いはセンスが良い(clojureのSTMの概要については、InfoQ記事)。
ベンチマークまでつけてくれている。単純な再帰に比べメモ化版の実行速度は10,000倍以上

自分が半分寝ながら書いたScala版メモ化より、ぜんぜんきれい(というか、シンプルな言語系同士の比較ということで、dan氏のJavaScriptでメモ化の実装と見比べるのがいいかも[再び紹介、「フィボナッチ数列にO()を学ぶ」)。もちろん、Scalaだってやればできる子(というか、できすぎる子)なので、ちゃんとしたフィボナッチ実装はいくつも転がっているが。
※ついでに、ScalaでSTM/better Actor実装のプロジェクトも絶賛活動中 =&#62; 並列処理に興味ある人は、Scala界最強のハッカーの一人であろう、jboner氏のakka を心して観察せよ。
]]></description>
			<content:encoded><![CDATA[<p><a href="http://wordprogress.org/archives/312">clojure-clrの近況</a>を見てClojure萌え再発ついでに。</p>
<p>後発のClojureの側からScalaを見るのが利にかなっていると思ったので、Scalaから見たClojure、改め、今後は <span style="text-decoration: line-through;">長門有希が観測する涼宮ハルヒ</span>Clojureから見たScalaでいこうと思い立つ。ということで、<a href="http://wordprogress.org/archives/278">ちょっと前にScalaで見たフィボナッチ数列</a>をClojureで。・・・と思ったら、本家にきれいなメモ化の実装が既に本家に置いてありますね。</p>
<p><a href="http://clojure.org/atoms">atomsでフィボナッチ数列@本家clojureサイト</a></p>
<ul>
<li>clojureでは、mutableなデータを明示的に扱う。メモ化するデータを、(atom {})にいれていくのがポイント。STMを含め、clojureのmutableなデータの扱いはセンスが良い(clojureのSTMの概要については、<a href="http://www.infoq.com/jp/news/2009/02/clojure-interview-halloway">InfoQ記事</a>)。</li>
<li>ベンチマークまでつけてくれている。単純な再帰に比べメモ化版の実行速度は10,000倍以上</li>
</ul>
<p>自分が半分寝ながら書いたScala版メモ化より、ぜんぜんきれい(というか、シンプルな言語系同士の比較ということで、dan氏のJavaScriptでメモ化の実装と見比べるのがいいかも[再び紹介、「<a href="http://blog.livedoor.jp/dankogai/archives/50958771.html">フィボナッチ数列にO()を学ぶ</a>」)。もちろん、Scalaだってやればできる子(というか、できすぎる子)なので、ちゃんとしたフィボナッチ実装はいくつも転がっているが。</p>
<p><em>※ついでに、S<span style="color: #800000;">calaでSTM/better Actor実装のプロジェクトも絶賛活動中</span> =&gt; 並列処理に興味ある人は、Scala界最強のハッカーの一人であろう、jboner氏の</em><em><a href="http://github.com/jboner/akka">akka</a> を</em><em>心して観察せよ。</em></p>
]]></content:encoded>
			<wfw:commentRss>http://wordprogress.org/archives/314/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>ScalaとJavaScript　その2dankogai氏の「フィボナッチ数列にO()を学ぶ」</title>
		<link>http://wordprogress.org/archives/278</link>
		<comments>http://wordprogress.org/archives/278#comments</comments>
		<pubDate>Fri, 06 Nov 2009 14:39:26 +0000</pubDate>
		<dc:creator>アルケー</dc:creator>
				<category><![CDATA[Scala]]></category>
		<category><![CDATA[啓蒙]]></category>
		<category><![CDATA[JavaScript]]></category>

		<guid isPermaLink="false">http://wordprogress.org/?p=278</guid>
		<description><![CDATA[前エントリのクロージャ導入ネタついでの発展的例題として、フィボナッチ数列あたりがいいかなと考えて探していたのだが、またしてもdankogai氏に行き着いた。「フィボナッチ数列にO()を学ぶ」、これが実に分かりやすい。いや、この人はほんとに頭がいいのかも、と初めて(?)思った。
[その他、長門clojure版のフィボナッチ駆け足解説も見つかったので、これはこれで別エントリで]
なので、例によって、Scalaにて写経:  ※JavaScriptのコードは元サイト側で、例題をちょこちょこ書き換えevalして即実行できるようになっているので、省略。・・この面、たしかにJavaScriptは教育向き。
◇再帰を用いたナイーブな実装　:　「計算量」O(2n)
実装(ちょっとだけScala風にさせてもらった)　※(たとえ、Scalaであっても)計算効率が悪いアルゴリズムなので遅い
def fibo (n :Int) : Int =
	if (n &#60; 2) n else {fibo(n-2) + fibo(n-1)}

val fiboList = {for (i &#60;-1 to 10) yield fibo(i)}.toList

実行例

scala&#62; fiboList foreach println _
1
1
2
3
5
8
13
21
34
55
◇クロージャを活用した実装　:　「計算量」O(n)
うん、良い例題。しかし、JavaScriptも結構簡潔だなぁ。やはり、動的言語の方が教育向きか。
def fib(n:Int) = {
  def f(a:Int, b:Int, c:Int) :Int=
    if (c &#60;= 2)  a else f(a+b, a, c-1)
  f(1, 1, [...]]]></description>
			<content:encoded><![CDATA[<p>前エントリの<a href="http://wordprogress.org/archives/257">クロージャ導入ネタ</a>ついでの発展的例題として、フィボナッチ数列あたりがいいかなと考えて探していたのだが、またしてもdankogai氏に行き着いた。「<a href="http://blog.livedoor.jp/dankogai/archives/50958771.html">フィボナッチ数列にO()を学ぶ</a>」、これが実に分かりやすい。いや、この人はほんとに頭がいいのかも、と初めて(?)思った。<br />
[<span style="color: #800000;">その他、</span><span style="text-decoration: line-through;"><span style="color: #800000;">長門</span></span><span style="color: #800000;">clojure版のフィボナッチ駆け足解説も見つかったので、これはこれで別エントリで</span>]</p>
<p>なので、例によって、Scalaにて写経: <em> ※JavaScriptのコードは元サイト側で、例題をちょこちょこ書き換えevalして即実行できるようになっているので、省略。・・この面、たしかにJavaScriptは教育向き。</em></p>
<h4>◇再帰を用いたナイーブな実装　:　「計算量」O(2<sup>n</sup>)</h4>
<p>実装(ちょっとだけScala風にさせてもらった)　※(たとえ、Scalaであっても)計算効率が悪いアルゴリズムなので遅い</p>
<pre class="brush:scala">def fibo (n :Int) : Int =
	if (n &lt; 2) n else {fibo(n-2) + fibo(n-1)}

val fiboList = {for (i &lt;-1 to 10) yield fibo(i)}.toList</pre>
<ul>
<li>実行例</li>
</ul>
<pre style="margin-top: 0px; margin-right: 1em; margin-bottom: 0px; margin-left: 1em; background-color: #f8f8f8; white-space: pre-wrap; word-wrap: break-word; padding: 1ex; border: 1px solid #707b8d;">scala&gt; fiboList foreach println _
1
1
2
3
5
8
13
21
34
55</pre>
<h4>◇クロージャを活用した実装　:　「計算量」O(n)</h4>
<p>うん、良い例題。しかし、JavaScriptも結構簡潔だなぁ。やはり、動的言語の方が教育向きか。</p>
<pre class="brush:scala">def fib(n:Int) = {
  def f(a:Int, b:Int, c:Int) :Int=
    if (c &lt;= 2)  a else f(a+b, a, c-1)
  f(1, 1, n)
}</pre>
<ul>
<li>実行例</li>
</ul>
<pre style="margin-top: 0px; margin-right: 1em; margin-bottom: 0px; margin-left: 1em; background-color: #f8f8f8; white-space: pre-wrap; word-wrap: break-word; padding: 1ex; border: 1px solid #707b8d;">scala&gt; for (n &lt;- 1 to 20) print (fib(n)+"\t")
1       1       2       3       5       8       13      21      34      55      89      144     233     377     610
987     1597    2584    4181    6765</pre>
<h4>◇メモ化(memoization)　:　「計算量」O(1)?</h4>
<p>あれれ、そのままでScalaにもっていくと、Scalaの方はちょっとくどいぞ・・・ArrayでなくてListを使おうかと思ったが、簡潔になる方法が簡単に思いつかない。パターンマッチを使ってもきれいに書けないなぁ。</p>
<pre class="brush:scala">val num = 30 //num番目までの結果を得る

var fibs =new Array[Int](num+1)

def fib(n:Int) :Int = {
	if (fibs(n) &gt; 0) return fibs(n)
	if (n &lt;=  2) return 1
	val f = {fib(n-1) + fib(n-2)}
	fibs(n) = f
	return f
}</pre>
<ul>
<li>実行例</li>
</ul>
<pre style="margin-top: 0px; margin-right: 1em; margin-bottom: 0px; margin-left: 1em; background-color: #f8f8f8; white-space: pre-wrap; word-wrap: break-word; padding: 1ex; border: 1px solid #707b8d;">scala&gt; for (n &lt;- 1 to num)  println("" + n + "\t" + fib(n))
1       1
2       1
3       2
4       3
5       5
6       8
7       13
8       21
9       34
10      55
11      89
12      144
13      233
14      377
15      610
16      987
17      1597
18      2584
19      4181
20      6765
21      10946
22      17711
23      28657
24      46368
25      75025
26      121393
27      196418
28      317811
29      514229
30      832040</pre>
<p>うん、さすがにメモ化は速い。Scalaでもう少しきれいに、と考えたのだが、眠くなってきたので、<a href="http://d.hatena.ne.jp/syttru/20081028/1225215533">簡潔な実装をしている方のコード</a>を一部改させてもらう。ほんとは元コードのBigIntの方が良い。</p>
<pre class="brush:scala">var nums = Map(1-&gt;1, 2-&gt;1)
def calc(i:Int): Int={
    if(!nums.contains(i)){
      nums += (i -&gt; (calc(i-1) + calc(i-2)))
    }
    nums(i)
  }
  for(i&lt;-1 to 30)
    println("" + i + "\t" + calc(i))</pre>
<p>まぁ、要するにArrayの代わりにMapを使う。実行速度面ではMapの方が多少遅いだろうが、プログラムは簡潔。<br />
Actorを使った実装とか、さらにScalaで工夫している人もいたが省略・・・眠る前に今日の振り返り　:　JavaScript、教育用にやっぱり使えそう<em> (いざ、JavaScriptで書けと言われるとF#の#lightモードみたいなのが欲しくなるのだが・・JQueryは・・・以下略 Zzzz&#8230;)</em></p>
]]></content:encoded>
			<wfw:commentRss>http://wordprogress.org/archives/278/feed</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
	</channel>
</rss>
