ラベル clojure の投稿を表示しています。 すべての投稿を表示
ラベル clojure の投稿を表示しています。 すべての投稿を表示

2010/09/08

syntax-rules: define-overload (clojure の defn みたいなもの)

引数の数にマッチして呼び出される本体が変わる clojure の defn を思い出したので書いてみました。
書いてみると別にどうということはありませんね・・・。

なぜ define-overload という名前かというと、始めて defn を見たときの感想が C# のオーバーロードっぽいなぁだったので。。かっこいい名前が思いつきませんでした。そういや syntax-rules にも似てますよね。

まずはマクロを書く前に展開イメージを

以下マクロ本体


プログラミングClojure

2010/07/07

プログラミング Clojure 読了

先日、遅ればせながら プログラミングClojure を読み始めました。
で、読み終わったわけですが、Clojure カッコイイですね!読了後の感想も上記のものと同様です。
clojureql に興味が湧きました。

ところで

最近、Lisp 本が続きました。
次は何か別の本が読みたいですね。ということで、アドレナリンジャンキー プロジェクトの現在と未来を映す86パターン を読み始めました。

これまた @finalfusion さんに頂いた本です!
これ、めっちゃめちゃおもしろいです。乱暴に言うとソフトウェア開発の「あるある」。

プログラミングClojureアドレナリンジャンキー プロジェクトの現在と未来を映す86パターン


2010/06/29

Re: Clojure カッコイイ!

そういえば先日、@shunsuk さんから「Clojure を使うメリットって何?」と聞かれました。困りました。
  1. S式で Java が書ける
  2. Java の経験があって Lisp が好きな人はうれしい
この二つしか思い浮かびませんでした・・・。結局、両方とも同じ意味ですよね。。個人的にはこれくらいしかメリットが思い浮かびませんでした。Clojure の特徴はいろいろあると思うのですが、「Clojure でないと困る」とか「こういう時は Clojure が最適!」っていうケースがあるのか正直わかりませんし知りません。

私自身も、これから Clojure をメインで使いたいとか、プログラミングClojure を読み終えてからさらに勉強してみたいとも思えませんし・・・。

プログラミングClojure を読み終わったらもう一度考えてみたいと思います。っていうか、教えてエロい人!

追記

やっぱり、JVM で走って Java と仲の良い Lisp だからってことで FA?

プログラミングClojure

Clojure カッコイイ!

おもしろいページがあったのでメモ。

以下余談

遅ればせながら、プログラミングClojure を読んでいます。頂いてから随分経ってしまいました。。Clojure カッコイイですねぇ。おもしろいです。
今5章まで読んだところですが、5章(関数型プログラミング)とてもおもしろいです。
ここまでで良いなーと思った点は
  • 関数定義のコメント
  • doc 関数
  • 同名の関数で引数の数ごとに処理を記述できる(オーバーロードとか syntax-rules っぽいなーなどと)
  • 型ヒント
  • なんでもシーケンス
  • なんでも遅延シーケンス
  • Java の呼び出しが自然 (「S式で書ける Java」といった印象)
そういえば、多値とか継続はないっぽい?

やっぱり気になる。。といった点は
  1. 引数ベクタで[]しか使えない
  2. cond や let の括弧が少ない
両方とも好みの問題だと思います。1 は見る分には慣れてきました。書く時はやはり()で書けた方が好きです。2 は相変わらず見づらいです。でも両方とも大して気になりません。


プログラミングClojure

2010/06/24

syntax-rules: across (Clojure の .. ぽいもの)

プログラミングClojure P.62~ 「Clojure から Java を使う」より。
(.getLocation (.getCodeSource (.getProtectionDomain (.getClass '(1 2)))))

(.. '(1 2) getClass getProtectionDomain getCodeSource getLocation)
と書けますよーということのようです。

Java だと
'(1 2).getClass().getProtectionDomain().getCodeSourse().getLocation();
みたいなイメージで良いんでしょうかね。


scheme (gauche) の syntax-rules で書くと下記のような感じでしょうか。
良い名前が思いつきませんでした。当初は chain にしてましたが、なんとなく across に変えました。。

書いてみたコードは以下のようなもの。


追記

本家ソースはこれかな。

追記2

コメント欄で教えていただきました!名前が良いなぁ。
let1 要らないですね。。

プログラミングClojure

2010/06/20

なんで Lisp/Scheme の変数名は長いの?

そういえば。さっきの記事を書き終わって思い出しました。shiro さんがこんなことを仰っていた。
Lisp/Schemeの変数名が長くなりがちなのは、変数名にしか読者への情報を乗せられないということもあるな。静的型なら型名に情報を乗せて、変数名自体は一文字でもけっこういける。
だが型情報だけが乗せたい情報というわけでもない。とすれば一般的にメタ情報を乗せる仕組みをつくればいいか?
Clojureのmetaはそういう仕組みではあるな。
なるほどー。

ところで Clojure の meta ってなんだろ。プログラミングClojure P.54 の「メタデータ」のところのことかな。せっかく頂いたのにまだ読んでいない・・・。

追記

長いシンボルを補完できるエディタがあったからだと思います RT @valvallow: なんで Lisp/Scheme の変数名は長いの? http://ff.im/-moAHF

@wasabiz それもあるけど、組み込み関数の命名とかさ。Common Lispは「クソ長い」の。AT&TのC文化圏では「命名は短く」ってのがあって、それはテキストエディタで打つとメンドくせえし間違えるから。CLは関数名を「自動補完で記述する」前提があるんですよ。


追記


プログラミングGaucheプログラミングClojure

2010/01/08

Clojure + slime + meadow





2010/01/25にgaucheハッカーと画家の訳者であるshiroさん訳でProgramming Clojureの日本語訳が出るそうなので欲しいところです。
しかし私は今ニートなので購入するか(あるいはできるのか)非常に悩ましいところです。
とりあえず環境を作って少ーし試してみました。
少し試して疲れたので続きはまた今度。

環境はclojure boxが手っ取り早いです。



実はclispとslimeを突っ込んではいたもののほとんど触っておらず、slimeの使い方がまだいまいちよくわかりません。

ところでClojureってCommon LispでもSchemeでもないそうですね。Arcなんかと同様、新しいLispの方言ってとこなんでしょうかね?

今回は以下のページを見ながらぽちぽち書いて、なるほど動くな、と試してみた程度。
clojureはGAEで動くらしいのでやっぱやってみたいですよね。
ついでにGAEのSDKも整備してdemoを動かして「すげー」しました。



(defn dbl [x]
  (* x x))
;; C-c C-c

(dbl 5)
;; C-x C-e
; -> 25

; SLIME 2010-01-06
user> (dbl 5)
25
user>


; factorial
(defn fact [n]
  (if (= n 0)
    1
    (* n (fact (- n 1)))))

user> (fact 10)
3628800

user> (+ 1 2)
3
user> (println "hello, world")


(defn hello [name]
  (println "Hello, " name))

(def vowel? (set "aeiou"))
(defn pig-latin [word]
  (let [first-letter (first word)]
    (if (vowel? first-letter)
      (str word "ay")
      (str (subs word 1) first-letter "ay"))))

(println (pig-latin "red"))
; -> edray

(println (pig-latin "orange"))
; -> orangeay


(require 'clojure.contrib.str-utils)
(doc clojure.contrib.str-utils/str-join)
; ->
;; -------------------------
;; clojure.contrib.str-utils/str-join
;; ([separator sequence])
;;   Returns a string of all elements in 'sequence', separated by
;;   'separator'.  Like Perl's 'join'.


(let [x 1]
  (let [x 3]
       (println (str "x = " x))))
; -> x = 3

(count [1 2 "three" 4 5])
; -> 5

(reverse [5 4 3 2 1])
; -> (1 2 3 4 5)

(map #(+ % 3) [2 4 6])
; -> (5 7 9)

(map + [2 4 7][5 6][1 2 3 4])
; -> (8 12)

(map + [1 2 3][1 2 3][1 2 3])
; -> (3 6 9)

(apply + [1 2 3 4 5 6 7 8 9 10])
; -> 55

(def languages
     ["lisp" "scheme" "clojure" "arc"])

(first languages)
; -> "lisp"
(second languages)
; -> "scheme
(third languages)
; -> errorr?
(last languages)
; -> "arc"
(nth languages 0)
; -> "lisp"
(nth languages 3)
; -> arc

(next languages)
; -> ("scheme" "clojure" "arc")
(butlast languages)
; -> ("lispp" "scheme" "clojure")
(drop-last 2 languages)
; -> ("lisp" "scheme")
(filter #(> (count %) 3) languages)
; -> ("lisp" "scheme" "clojure")



ハッカーと画家 コンピュータ時代の創造者たちProgramming Clojure (Pragmatic Programmers)Practical Clojure (The Definitive Guide)プログラミングClojure