没觉得不可思议😪
恩,一次书写满地跑。我前后端都写,不过主要精力还是在数据分析,机器学习上面。
你熟悉 js 的话,ClojureScript 挺容易上手的。
ClojureScript 超级爽呀,我现在写前端单页面或者游戏,不用在 Chrome 上调试,直接在 Emacs 的 repl 上开发就能完成了。
它几乎可以非常快速的开发出非常复杂的前端或者游戏来,甚至像 js 编辑器那么复杂的交互,普通的 ClojureScript 水平都可以很快开发出来。
以前我不喜欢前端的,因为 ClojureScript,我爱上前端开发啦 这里有简单的一个 ClojureScript 写的 js 游戏:https://github.com/clojurescript-scope-games/flappy-bird-demo, 也可以看看演示的视频:
@geniousli 我开发了 3 年多 Ruby,最终还是选择了 Lisp,Clojure 是 Lisp 的方言,对于我来说,Clojure 的开发效率比 Ruby 还高,而且函数式编程非常清晰明了。
很享受那种写代码停不下来的感觉,不用担心副作用操作,我的老大写 Clojure 都不用调试的,因为写纯函数,只要思路推导正确,结果就是正确的。
公司产品主要是后台 Clojure 的 Web API, 前端单页面 ClojureScript, 还有 Clojure 调用 Spark 流式大数据分析等。个人还用 Clojure 写安卓的一些原生应用 (未开源), 开源的项目小例子:讯飞语音 sdk
在北京一家公司,北京好多 Clojure 的公司呀
我几乎完全用 Lisp 来工作,前端单页面用 ClojureScript, Clojure 写后端 API, 还有写 Clojure 调用 Spark 流式数据分析,个人还用 Clojure 写 Android 应用。编辑器用 Emacs Lisp 写帮助编辑函数,爽到爆
没有 Emacs Lisp,我就不会去学习 SICP, 没有学习 SICP,我就不会工作去写 Clojure.
写 C++ 不错呀,现在最高薪的算法工程师 (30w~50w) 都基本熟练 C++, 而且大部分高性能机器学习和深度学习库,算法都是 C++ 实现的. 会 Ruby 只是能做做网站,顶多系统管理。不要执着于公司,只是名称而已
大部分函数式编程语言,都很享受 C-c C-k大法好
的 开发体验。
而且 Lisp 语言还很享受 C-x C-e大法好
的 开发 体验。
Lisp 大部分人,都集中在帝都,深圳目前我知道的只有熊聊用 Clojure 做后端 API. 广州的汇丰用 Clojure 做后端,混合 Java 编程. 本人也在帝都做 Clojure 开发。
好了,你可以去学 Clojure 了
@luikore Scheme 和 Racket, 是 Lisp 界的标准,这一点不容置疑,学透 SICP 可以完全升级一个程序员的 内功。
但 Scheme 的问题是停留在教育层面的,虽然 Racket 尝试生产方面,毕竟还没成功。
Scheme 和 Clojure 是很像的,但是 Clojure 的生产效率是非常高的,它和 Java 之间的互操作,都是简单得让你惊奇。而且 Ruby 底子好的人,看 Java 代码是不难的。
Clojure 后端开发 非常成熟,ClojureScript 前端开发体验也是一流的,而且 Clojure 在大数据和数据分析领域也是非常成熟的,如 Storm, Cascalog, 包括 Clojure 调用 Spark 也是非常容易的。
Common Lisp 已经是混合多范式了,虽然根植于 Lisp, 我不想用它的原因是,CLOS 不应该继承到 它的核心里面,使得 Clisp 过度复杂。
@Peter 如果你们学习 Lambda 演算,连 它的 鼻祖都 不知道,那有何意义呢?
Ruby 社区很多高手,比如 @luikore 等,都是修炼过 SICP 的,如果你不知道他们为什么这么厉害,只能说你们在社区白混了。
今年的RubyConf China 2017, 都已经有三个主题是 关于函数式的了,难道你们还要停留在学习的舒适区吗?
干掉了 SICP,十个 Ruby 元编程都不在话下
要认识的 Ruby 元编程的真正价值,就要从元编程的鼻祖 Lisp 开始,真正做到了 代码就是数据,数据就是代码,真正的代码和数据的完美统一。
真正掌握元编程的人,任何语法都限制不了一个程序员。
(macroexpand-1 '(-> 100 (+ 1) (+ 2) (+ 3))) ;;=> (+ (+ (+ 100 1) 2) 3)
(defmacro unless [expr form]
(list `if expr nil form))
(macroexpand-1 '(unless false "Hi, Clojure!"))
;; => (if false nil "Hi, Clojure!") ;; 代码展开的样子
Clojure 除了具备了 Lisp 开发的 最佳体验 (Emacs + REPL) 开发,没有比这个开发体验更好的,我用过如此多的语言里面。
而且 Clojure 的资源几乎是无限的,Java 资源轻易封装使用,如我自己封装的一些 : 讯飞 Clojure 的 SDK, Hanlping, 阿里云 aliyun-oss-clj 等等。
而且 ClojureScript 函数式来写复杂前端都轻易搞定:https://github.com/chanshunli/clojurescript-study, https://github.com/clojurescript-scope-games/flappy-bird-demo 等等。也是 Lisp 的开发体验,甚至不需要离开编辑器就完成了复杂单页面或者游戏。
还有我用 Clojure 调用 Spark 数据分析,机器学习等:如 https://github.com/clojure-spark/sparkling-streaming-ml
我还用 Clojure 来写安卓 APP 收集传感器数据,做流式数据在线学习 等,
Java 能做的,Clojure 一样能做,而且速度快的 惊人,曾经我认为 Ruby 是最好的语言,但是我错了,能够开发 Clojure 是我命运的眷顾,让我知道 什么才是程序员的幸福 , Clojure 给我的感觉是,优美的极点 + 无穷的强大几乎没有它干不了的事情。
吃透了 SICP, 一般的程序员的功力就干不过你了。所以它不是那么容易吃透的呀。
->
& ->>
的区别是 :
(macroexpand-1 '(-> 100 (+ 1) (+ 2) (+ 3))) ;;=> (+ (+ (+ 100 1) 2) 3)
(macroexpand-1 '(->> 100 (+ 1) (+ 2) (+ 3))) ;;=> (+ 3 (+ 2 (+ 1 100)))
这是函数式圣经级别读物,我第一次看到这部著作的时候,也直接丢掉了。
Jim Weirich 的演讲, 让我深度思考了函数式,使得我重新读完这部书的前面四章,被 SICP 震惊了,发现我错了。才知道邱奇是多么的伟大,Lisp 是多么伟大。
很多计算机的设计思想 和 精髓,是不可忽略的,尤其是 Lisp, 几乎对所有的语言的设计 都 产生了很大的影响力。
Lisp 语言里面一般都是用 partial, 函数式数据分析,还有在线数据流机器学习,实在是太方便了。
(def sigma
(fn [sf f a b]
(->> (range a (inc b))
(map #(f %))
(reduce sf))))
(def sum-of-number (partial sigma + (fn [n] n)))
(def sum-of-square (partial sigma + #(* % %)))
(sum-of-number 1 10) ;;=> 55
(sum-of-square 1 10) ;;=> 385
(def pi (partial sigma *))
(pi (fn [n] n) 1 3) ;;=> 6
(defn ratings->matrix [data]
(let [cardinality (-> data
(spark/map #(.product %))
(spark/reduce max)
(inc))]
(->> data
(spark/group-by #(.user %))
(spark/values)
(spark/map (to-sparse-vector cardinality))
(to-matrix))))
我也是因为 读《计算的本质 - 深入剖析程序和计算机》,才知道背后 有这么 牛 B 的 SICP, 作者 Tom 只是借鉴 SICP 思想而已,然后用 Ruby 语言表达。
SICP 这本书改变了我,让我转向了 Clojure 开发,释放 Lisp 函数式强大的原力。
@alixiaomiao @lanzhiheng 不要看《计算的本质 - 深入剖析程序和计算机》啦,看 SICP 吧,SICP 才是圣经级别读物。
《计算的本质 - 深入剖析程序和计算机》展现的只是 SICP 的冰山一角 ... ...
视频只能看到招式,很难掌握发力和动作要领,通过图解 + 受力分析 + 训练阶段分析,更利于目标和进步。
过去几年 看视频看了很多,也自学咏春的那些招式,但是都不得要领,练拳还是必须师傅教,加上自 己用心领悟 + 总结
火币用的是 Clojure 呀
不难看懂的,因为 Lisp 语言都会用 macroexpand 展开来看 代码是如何被 "编辑"了的 , 宏做了什么列表 (代码和数据,一切都是列表) 操作,如下面的两个例子:
(-> 100 (+ 1) (+ 2) (+ 3)) ;; => 106
(macroexpand-1 '(-> 100 (+ 1) (+ 2) (+ 3)))
;; => (+ (+ (+ 100 1) 2) 3) ;; 代码展开的样子
(defmacro unless [expr form]
(list `if expr nil form))
(macroexpand-1 '(unless false "Hi, Clojure!"))
;; => (if false nil "Hi, Clojure!") ;; 代码展开的样子
最重要的是,Clojure 的宏具有强大的杀伤力,却不会影响性能,因为宏的编译时和运行时是分开的。在运行时前,代码已经编译好了。
学了 Clojure 和 Emacs Lisp 之后,我才知道 Matz 为什么这么喜欢 Lisp 了
Elisp 改变了 Matz 的人生。
元编程的最高境界就是 Lisp 了
来个 Clojure 版本,->
(-> "a b c d"
(str/split #" ")
(#(str/join "-" %))
str/capitalize)
;;=> "A-b-c-d"
Clojure ->
宏的源码太简单了,@mizuhashi
(defmacro ->
[x & forms]
(loop [x x, forms forms]
(if forms
(let [form (first forms)
threaded (if (seq? form)
(with-meta `(~(first form) ~x ~@(next form)) (meta form))
(list form x))]
(recur threaded (next forms)))
x)))
Lisp 强大的宏能力
@Rei Ruby 社区不要只是满足于 Web 开发,Matz 都说了 Ruby 的数据科学领域太空白了 与 Python 相比。
Ruby 是曾经非常优秀,但是它的优点 都 被 其他语言 抄走了,自己 却 还在原来的地方。
在大数据,机器学习,深度学习,并行计算,分布式 横行的 时代,难道 还 指望 做个 网站就能 人生 成功吗?
你们做 Web 早,当然享受了 Web 好处和回报,但是新一代的程序员呢 ? 不要因为语言限制了个人的能力。
函数式编程根本不用 debugger, 只要用 repl 就完全足够了,足够好了,纯函数根本不用 debugger, 不像面向对象。我们老大写 Clojure 或者是 Haskell, 连 repl 都不用,直接默写纯函数,我运行他写的代码几乎 没有错误。 第三方库多如牛毛,除了纯 Clojure 库很多之外 , Java 的库非常轻易使用,你知道 Java 库就像银河星球那么多吗?
看 https://github.com/clojure/clojure 最近的commit还是5月份的
:
Clojure 已经非常成熟了,那你可以看看 ClojureScript: https://github.com/clojure/clojurescript 22 小时前就更新过。
clojure 写web太蛋疼吧?没有什么像样的框架。
: 多如牛毛的框架可以用,我们公司全都是用 Clojure, 前端单页面用 ClojureScript, 还有数据分析也用 Clojure. API 有 https://github.com/weavejester/compojure, ring 等插件 和 ruby 的 rack 插件 一样好用,前端框架有 https://github.com/omcljs/om, reagent 等,全栈有 www.luminusweb.net 等,大数据领域有 Storm, Cascalog 等 ( 还有很多公司 Clojure 调用 Spark 做机器学习,数据分析), 所有 Java 能做的事情 Clojure 都能做,甚至是前端,还有安卓开发,而且做得很棒。
如果你觉得资源还不够,还有像大海一样多的 Java 资源可以随意使用,几行代码就封装好了一个 Java 库了,如 讯飞语音 SDK 封装 , 等等
当初觉得 Ruby 太限制个人能力了,才放弃 Ruby 的,只能做 Web 相关的东西还有运维... 而且连前端单页面也写不了,ClojureScript 就可以两百行写一个单页面游戏, 数据分析和机器学习更干不了...