いいぞ、いいぞ、速いぞGauche♪・・・JVMや.NETのREPL(対話型環境)は、たしかに立ち上がりがどっこらセックス・・・(しつこく小飼弾言を引用)
Lispを取り上げるなら、LispなりのFizzBuzzを取り上げておいたほうが良いだろう。IronSchemeで行こうと思ったが、実行環境のことなどわからなすぎなので、Gaucheに寄り道。
WIndows環境のGaucheは実験中、らしいですが、こういうお遊びではさくっと動いてくれてます。
upzip後の起動とライブラリ(sfri)のインポートまで :
PS C:\Gauche\bin> .\gosh.exe
gosh> (use srfi-1)
#
◇GaucheでFizzBuzz
「Lisp脳」の謎に迫るをほぼそのまま引用させていただく ※FizzBuzz自体が初めての人はリンク先の「Lisp脳」から学んでほしい。
condの中の条件は、[・・・]で囲むのが好みなので こんなかんじ:
gosh> (print
(map
(lambda (x) (
cond
[(= (modulo x 15) 0) "FizzBuzz"]
[...]
Gauche, Scala
Hide
.NET上のLisp実装であるIronScheme。なぜ、.NET上で実装したのか気になるところではあるが、目の前にあるバーゲン品で購入したvistaならば、インストール後、C:\Program Files\IronScheme\IronScheme.Console.exeをクリックすると即実行できるので、とりあえず、試して見る。
◇IronScheme
ちょっと手抜きで実行した画面をそのままキャプチャ
(count ‘(1 2 3))がエラー ・・ Clojureとは違い、長さを測るのはlengthなのね。
shiroさんの『プログラミングGauche』(O’ REILLY))の46頁にあるfoldは実行できない ・・ S式の基本に戻って(+ x y)を積み重ねる。
◇Scala
Gaucheのfoldに相当するのは、foldLeft とか。例えば、こんな感じ :
scala> (List(2,3,4) foldLeft 1) {(x,y) => x+y}
res3: Int = 10
scala> (List(2,3,4).foldLeft (1)) {(x,y) => x+y}
res4: Int = 10
scala>(List(2,3,4) foldLeft 1) {_+_}
res5: Int = 10
左から順に加えていくfoldLeft、ふだんあまり使ってないが、自分が書くならば3番目の書き方かな。
ちなみに、foldLeft相当の記号として:/がある。はじめて見た時には違和感があったけど、左から順にぱたぱた倒れていく、とかイメージすれば、まぁ覚えられるかな。
(1 /: List(2,3,4))(_+_)
(1 /: (2 :: 3 :: 4 :: Nil))(_+_)
/:
◇再びIronScheme
・・・でも、Gaucheのfoldの方がシンプルだなぁ。
IronSchemeでも、Scheme実装であるGaucheのfoldのコードが動くので、以下のように自前でfoldを定義すれば、IronSchemeでもfoldできる。
・・・しかし、IronScheme.Console.exeは使い勝手が微妙。すでに、IronSchemeはIronSchemeで、独自のエコシステムを作りつつあるのだろうが、それを覚える気になるか、自分??
Gauche, IronScheme, Scala
Hide