作者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