看板 PLT 關於我們 聯絡資訊
※ 引述《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
noctem:thanks! 07/07 10:23
godfat:還有 type hint 這種東西喔 @@ 效能也未免差太多了... 07/07 10:35
noctem:居然差到三位數耶.. 是因為 runtime 的型別檢查很花時間嗎 07/07 13:54
Schelfaniel:就是這 type hint 讓 clojure 效能可以追上 Scala 的 07/07 15:05
godfat:試了一下,果真是 "hint", 寫錯也能跑,但是超超超超慢.... 07/07 15:10
noctem:欸欸欸,那為什麼 type 錯了還可以跑呢?? @_@ 07/07 17:02
sbrhsieh:這樣的數據有點.....我想已不純粹是慢在 reflection 07/07 20:16
sbrhsieh:有沒有人在玩 KAWA(Scheme on JVM)? 07/07 20:35
godfat:更正,type hint 給錯的速度跟沒給是一樣的,但真的能跑... 07/07 20:40