悟り体験を得たい

やぁこんばんわ、いかがお過ごしでしょう。
僕はプロジェクトが絶賛グダり中です。

そんなこんなで最近は物理的にも精神的にも余裕がなくなりちゅうです。なのでブログの移行もはかどってないです。でもたぶんtumblrします。


そういうわけで、忙しさを言い訳にここ一ヶ月ほど何もやる気が起きないのですが、こうなると無理矢理作業をはじめたところで集中出来ないので気分転換とリハビリをかねてLispやろうかと思いました。
Emacserのイメージが強いLispですが、かのポール・グレアム氏はVimmerだそうです。まめ知識ですね。

以前Clojureをやろうとしてブン投げ出してしまったわけですが、あれは僕みたくJavaLispも知らない人間が触るには少々コストが高く、性急で飽き性なクズには向かない環境でした。

というかJVMだのコンパイルだのわけわからんちん! あとなんかScalaでも感じるんですけど、「Javaの遺産を継承出来る!」っていうメリットが、言語としてデメリットになっている雰囲気感じます。まぁそこんところはよくわからないので、ニーズや個々人の経験に依るところが大きいのでしょう。


とりあえずはなんかしらの処理系をインストールするか実装するかしましょう。

brew install gauche

Lispには大量の方言やらがあるのですが、僕はGaucheというScheme系の奴を使うことにしました。
Schemeは、どちらかと言えばアカデミック向けで簡素な方言だという印象があったのですが、Gaucheは日本のハッカーが作ったそうで、実用に重きを置いたりしてるとかPerlの置き換えを狙ったとかそういうアレが気に入ったからです。


ハローワールドはあまりに味気ないのでFizzBuzzを書いてみます。

#!/usr/bin/env gosh

(use srfi-1)

(define
  (fizzbuzz x)
  (map
    (lambda(i)
        (cond
          ((= (remainder i 15) 0) "fizzbuzz")
          ((= (remainder i 3) 0) "fizz")
          ((= (remainder i 5) 0) "buzz")
          (else i)))
    (iota x 1)))

(print (fizzbuzz 100))

useはモジュールのインポートとかをする感じの関数ですが、Pythonのimport fromみたく中のクラスや関数のみ取得する書き方もあるみたいですね?

srfiとはScheme requests for implementationの略らしいです。詳しくはwikipediaなんかで。とりあえず他の言語でいう標準モジュールみたいなもんだと解釈しました。
srfi-1という名前で嫌な予感がしたのですが、そんな調子で100以上とかもっとある予感です。こういう名前付けがLispSchemeの文化なのだとしたら、あまり好きにはなれそうにないですね。
ちなみに1にはリスト系の関数が定義されているそうですが、なんとなくインポートしただけなので今回は別になんも使ってません。


リストを作って高階関数で処理をしていく、という切り口はもはやおなじみのアプローチなので違和感はないですね。


思ったよりも書きやすそうなので、日常のちょっとしたスクリプトとかは全然Gaucheでいけそうですね。どうやら既存のライブラリも豊富っぽいですし。
パラダイムの違う言語触るのはたのしいですね :)