Re: [閒聊] 最近寫 clojure 有感

看板PLT作者 (Schelfaniel)時間15年前 (2009/07/07 10:12), 編輯推噓5(504)
留言9則, 4人參與, 最新討論串3/4 (看更多)
※ 引述《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

07/07 10:23, , 1F
thanks!
07/07 10:23, 1F

07/07 10:35, , 2F
還有 type hint 這種東西喔 @@ 效能也未免差太多了...
07/07 10:35, 2F

07/07 13:54, , 3F
居然差到三位數耶.. 是因為 runtime 的型別檢查很花時間嗎
07/07 13:54, 3F

07/07 15:05, , 4F
就是這 type hint 讓 clojure 效能可以追上 Scala 的
07/07 15:05, 4F

07/07 15:10, , 5F
試了一下,果真是 "hint", 寫錯也能跑,但是超超超超慢....
07/07 15:10, 5F

07/07 17:02, , 6F
欸欸欸,那為什麼 type 錯了還可以跑呢?? @_@
07/07 17:02, 6F

07/07 20:16, , 7F
這樣的數據有點.....我想已不純粹是慢在 reflection
07/07 20:16, 7F

07/07 20:35, , 8F
有沒有人在玩 KAWA(Scheme on JVM)?
07/07 20:35, 8F

07/07 20:40, , 9F
更正,type hint 給錯的速度跟沒給是一樣的,但真的能跑...
07/07 20:40, 9F
文章代碼(AID): #1AKgy08d (PLT)
文章代碼(AID): #1AKgy08d (PLT)