作者Schelfaniel (Schelfaniel)
看板PLT
標題Re: [閒聊] 最近寫 clojure 有感
時間Tue Jul 7 10:12:15 2009
※ 引述《noctem (noctem)》之銘言:
: ※ 引述《Schelfaniel (Schelfaniel)》之銘言:
: : clojure 首先它走 JVM,所以很多函式庫的部份不成問題,
: : 除了本身 Java 的限制,像是 Java 太底層還是要呼叫 C 的等等
: : 但是反過來說 clojure 語法現代化很多,和 Java 的結合性也很高,
: : clojure 提供了很多專為 Java 設計的,如 proxy 指令,
: : 就是專為 Java 事件回呼函式用的,
: 看了 Ruby 板的範例,語法上還是蠻有 LISP 家族的風格。
: 中括號和大括號分別是什麼意思呢?冒號有特別意義嗎?
中括號是 vector,但是很多情形是用在表示參數,如 let fn 等的參數
user=> (type [1 2 3])
clojure.lang.LazilyPersistentVector
user=> (let [x 1] x)
1
大括號是 hashtable
user=> (type {'a 'b})
clojure.lang.PersistentArrayMap
冒號是 keyword
user=> (type :a)
clojure.lang.Keyword
基本上它 hashtable 都習慣用冒號,像是
{:name "godfat" :type 'super-programmer}
就是 key 值是 :name 的內容是 "godfat"
:type 'super-programmer
: 此外 clojure 和 LISP 有哪些不同呢?
其實,有一些我目前也只試用一些淺顯的功能,詳細的比較官網上有寫
http://clojure.org/lisps
: 1. purely functional?
我覺得還是沒有 Haskell 純啦,但是比 Common Lisp 純,
至少, Common Lisp 可以寫得 OO 的,但 clojure 會很自然得寫得 functional
我是覺得比 Haskell 好入門 :QQ
: 2. 是 static 還是 dynamic typing?
dynamic typing,不過,由於 Java 是 static typing
在呼叫 Java 函數時,會變成使用 Java 的 Reflection 機制(會比較慢),
因此 clojure 提供的 Type Hint 也就是在參數中加入提示
可以比較一下 foo 和 foo2,都是呼叫 Java 的 .length,
但是 foo2 時提示了 x 的型態是 String
(註:此時如果型態不是 String 就會出錯)
速度上就馬上從 dynamic language 的速度提升到像是 static language 的速度。
user=> (defn foo [x] (.length x))
#'user/foo
user=> (time (dotimes [_ 1000000] (foo "a")))
"Elapsed time: 20217.463888 msecs"
user=> (defn foo2 [#^String x] (.length x))
#'user/foo2
user=> (time (dotimes [_ 1000000] (foo2 "a")))
"Elapsed time: 28.428942 msecs"
--
※ 發信站: 批踢踢實業坊(ptt.cc)
◆ From: 163.29.28.137
1F:推 noctem:thanks! 07/07 10:23
2F:推 godfat:還有 type hint 這種東西喔 @@ 效能也未免差太多了... 07/07 10:35
3F:→ noctem:居然差到三位數耶.. 是因為 runtime 的型別檢查很花時間嗎 07/07 13:54
4F:→ Schelfaniel:就是這 type hint 讓 clojure 效能可以追上 Scala 的 07/07 15:05
5F:推 godfat:試了一下,果真是 "hint", 寫錯也能跑,但是超超超超慢.... 07/07 15:10
6F:推 noctem:欸欸欸,那為什麼 type 錯了還可以跑呢?? @_@ 07/07 17:02
7F:→ sbrhsieh:這樣的數據有點.....我想已不純粹是慢在 reflection 07/07 20:16
8F:推 sbrhsieh:有沒有人在玩 KAWA(Scheme on JVM)? 07/07 20:35
9F:→ godfat:更正,type hint 給錯的速度跟沒給是一樣的,但真的能跑... 07/07 20:40