avatar
j*n
2
re
avatar
p*o
3
换Intel系统的代价太大,不知能不能将就着在AMD处理器(x4 945)下弄
上周看某论坛有人说,雪豹在AMD+VMware里能跑得动,但xcode编译不了,就没有下文了
不知道哪位有没有成功的经历?
avatar
z*e
4
举个例子,一个obj,三个func1,func2,func3
顺序执行func1, func2, func3
有下面两种方式书写,你觉得哪种好?
第一种
obj.func1().func2().func3();
优化一下,根据.做换行
obj.func1()
.func2()
.func3();
第二种
func3(func2(func1(obj)));
优化下,缩进,换行
func3(
func2(
func1(obj)));
哪种更好?
avatar
f*e
5
再涨50%工资就接受

【在 l******n 的大作中提到】
: recruiter不停的说,要我接受,靠
avatar
j*n
6
怎么贴视频啊,除了youtube的,youku的怎么贴啊
avatar
s*n
7
老罗你也做私活啊?
应该可以吧,都vm了,编译跟跟什么物理cpu能有什么关系。
avatar
p*2
8
第一种
所以js scala能大火

【在 z****e 的大作中提到】
: 举个例子,一个obj,三个func1,func2,func3
: 顺序执行func1, func2, func3
: 有下面两种方式书写,你觉得哪种好?
: 第一种
: obj.func1().func2().func3();
: 优化一下,根据.做换行
: obj.func1()
: .func2()
: .func3();
: 第二种

avatar
l*u
9
re
"show me the money"

【在 f*****e 的大作中提到】
: 再涨50%工资就接受
avatar
p*o
10
做research之用,搜集些数据~
还是有关系的……VMware不是纯粹的模拟器,
而总是优先直接在物理CPU上执行,执行不了才动态翻译
编译器当然是平台相关的
细节我就不清楚了~

【在 s*******n 的大作中提到】
: 老罗你也做私活啊?
: 应该可以吧,都vm了,编译跟跟什么物理cpu能有什么关系。

avatar
h*i
11
第三种:
-> obj
func1()
func2()
func3();
和第一种看上去一样。所以这些都是表面的东西。
第一种只能mutate obj, 不灵活。而第二第三可以mutate,也可以不mutate。

【在 z****e 的大作中提到】
: 举个例子,一个obj,三个func1,func2,func3
: 顺序执行func1, func2, func3
: 有下面两种方式书写,你觉得哪种好?
: 第一种
: obj.func1().func2().func3();
: 优化一下,根据.做换行
: obj.func1()
: .func2()
: .func3();
: 第二种

avatar
l*n
12
说了,recruiter说不可能,其实实事也是
呵呵

【在 f*****e 的大作中提到】
: 再涨50%工资就接受
avatar
l*s
13
二爷玩过clojure这么说可不应该啊。

【在 p*****2 的大作中提到】
: 第一种
: 所以js scala能大火

avatar
h*i
14
玩过和用来吃饭是两回事。
没有用Clojure来作唯一的语言,给自己造成一个破釜沉舟,背水一战的状况的,我个
人认为很难学会Clojure,因为这些人撞到墙的时候总会习惯性的用IP思维来解决问题
,这些人没有经历过”有一段时间觉得自己都不会编程了“的状况,其实没有翻过坎的
。以为自己会了,其实还没入门。

【在 l*********s 的大作中提到】
: 二爷玩过clojure这么说可不应该啊。
avatar
d*n
15
第一中setter 最合适
obj
.setAttribX()
.setAttribY()
.run()
要是getter就不能死板成第一中
var x = obj.getX()

【在 z****e 的大作中提到】
: 举个例子,一个obj,三个func1,func2,func3
: 顺序执行func1, func2, func3
: 有下面两种方式书写,你觉得哪种好?
: 第一种
: obj.func1().func2().func3();
: 优化一下,根据.做换行
: obj.func1()
: .func2()
: .func3();
: 第二种

avatar
h*i
16
是啊,第一种就最适合mutate obj, 不适合干其他事。而第二三种也适合干其他的。

【在 d****n 的大作中提到】
: 第一中setter 最合适
: obj
: .setAttribX()
: .setAttribY()
: .run()
: 要是getter就不能死板成第一中
: var x = obj.getX()

avatar
l*n
17
f . g . h

【在 z****e 的大作中提到】
: 举个例子,一个obj,三个func1,func2,func3
: 顺序执行func1, func2, func3
: 有下面两种方式书写,你觉得哪种好?
: 第一种
: obj.func1().func2().func3();
: 优化一下,根据.做换行
: obj.func1()
: .func2()
: .func3();
: 第二种

avatar
p*2
18
为什么第一种只能mutate?

【在 h*i 的大作中提到】
: 第三种:
: -> obj
: func1()
: func2()
: func3();
: 和第一种看上去一样。所以这些都是表面的东西。
: 第一种只能mutate obj, 不灵活。而第二第三可以mutate,也可以不mutate。

avatar
p*2
19
为什么不应该
clojure唯一的缺点就是没有oo的方便

【在 l*********s 的大作中提到】
: 二爷玩过clojure这么说可不应该啊。
avatar
p*2
20
你认为我是那种人?

【在 h*i 的大作中提到】
: 玩过和用来吃饭是两回事。
: 没有用Clojure来作唯一的语言,给自己造成一个破釜沉舟,背水一战的状况的,我个
: 人认为很难学会Clojure,因为这些人撞到墙的时候总会习惯性的用IP思维来解决问题
: ,这些人没有经历过”有一段时间觉得自己都不会编程了“的状况,其实没有翻过坎的
: 。以为自己会了,其实还没入门。

avatar
l*s
21
第三种写法和第一种一样。实际上不管是clojure还是scala,写java都比裸写java更方
便。

【在 p*****2 的大作中提到】
: 为什么不应该
: clojure唯一的缺点就是没有oo的方便

avatar
h*i
22
最自然吧,第一种意思就是在obj本身上面进行各种折腾,再折腾,还是obj.所以自然
就是in place mutation的意思。
另外两种的自然意思是把obj从一系列管道中传送过去,在传送过程中,什么都可能发
生,所以是更灵活的一种思维,可以mutate, 也可以不mutate,都很自然。

【在 p*****2 的大作中提到】
: 为什么第一种只能mutate?
avatar
h*i
23
不知道。没考过你。

【在 p*****2 的大作中提到】
: 你认为我是那种人?
avatar
h*i
24
第三种写法可以与第一种写法一样,也可以不一样。obj如果是个mutable object,
func们都是obj上的method, 那就是一样的。但如果不是,那就可以不一样,所以更灵
活。

【在 l*********s 的大作中提到】
: 第三种写法和第一种一样。实际上不管是clojure还是scala,写java都比裸写java更方
: 便。

avatar
p*2
25

你理解局限了。建议学学scala

【在 h*i 的大作中提到】
: 最自然吧,第一种意思就是在obj本身上面进行各种折腾,再折腾,还是obj.所以自然
: 就是in place mutation的意思。
: 另外两种的自然意思是把obj从一系列管道中传送过去,在传送过程中,什么都可能发
: 生,所以是更灵活的一种思维,可以mutate, 也可以不mutate,都很自然。

avatar
h*i
26
好吧。展开说说局限性?

【在 p*****2 的大作中提到】
:
: 你理解局限了。建议学学scala

avatar
h*c
27
方便我lol copy/paste就好,我老改改,上自己主页
avatar
p*2
28
他这个没说是mutate的 可以是immutable的

【在 h*i 的大作中提到】
: 好吧。展开说说局限性?
avatar
z*e
29
所谓第三种是语法糖
这个是无法在语言level上enforce的
也就是说,总有人不会去遵守
需要严格的code review制度来强制别人规范其代码
也就是code style的控制
这种控制几乎无一例外失败了
这就是为什么二爷反对用pure fp的原因
只有fp的教徒才会认为code style会被严格遵守

【在 l*********s 的大作中提到】
: 第三种写法和第一种一样。实际上不管是clojure还是scala,写java都比裸写java更方
: 便。

avatar
z*e
30
&rxjava

【在 p*****2 的大作中提到】
: 第一种
: 所以js scala能大火

avatar
z*e
31
不一样
多了一层语法糖
所以你甚至无法在各种例子中看到第三种写法

【在 l*********s 的大作中提到】
: 第三种写法和第一种一样。实际上不管是clojure还是scala,写java都比裸写java更方
: 便。

avatar
z*e
32
典型的语法糖
需要解释->是啥意思
远不如func(obj)或者obj.func()直观
便于理解,语法糖一多,人就精分了

【在 h*i 的大作中提到】
: 第三种:
: -> obj
: func1()
: func2()
: func3();
: 和第一种看上去一样。所以这些都是表面的东西。
: 第一种只能mutate obj, 不灵活。而第二第三可以mutate,也可以不mutate。

avatar
z*e
33
二爷才是真懂,你这是除了pure fp其他都不懂
实际上第一种是主流

【在 l*********s 的大作中提到】
: 二爷玩过clojure这么说可不应该啊。
avatar
l*s
34
正常情况都是第3种,第2种纯属自虐。

【在 z****e 的大作中提到】
: 不一样
: 多了一层语法糖
: 所以你甚至无法在各种例子中看到第三种写法

avatar
z*e
35
如果你多看看fp的文档
你会发现第二种才是正常情况
不用那么复杂,自己多看看clj的文档吧
看看多少个金字塔搭建起来

【在 l*********s 的大作中提到】
: 正常情况都是第3种,第2种纯属自虐。
avatar
l*s
36
您老不是在说chaining么,clojure有更简洁的语法糖,这有啥可不服气的?clojure的
多层嵌套是比较花,但总比java一点小屁事都要罗哩叭嗦扯几屏强。

【在 z****e 的大作中提到】
: 如果你多看看fp的文档
: 你会发现第二种才是正常情况
: 不用那么复杂,自己多看看clj的文档吧
: 看看多少个金字塔搭建起来

avatar
z*e
37
瞎扯蛋,谁跟你说chain?
我说的是最基本的顺序操作
1->2->3,fp搞这个就是苦逼透顶,无数的人把代码写成你所谓的自虐的代码
不信自己看文档,iq正常的都能找出一大堆来
异步为了对付这个东西
特意去搞了rx框架出来,rxclojure项目根本不活跃
没有多少人参与,不死不活的,所以不得不寄托于语法糖来搞

【在 l*********s 的大作中提到】
: 您老不是在说chaining么,clojure有更简洁的语法糖,这有啥可不服气的?clojure的
: 多层嵌套是比较花,但总比java一点小屁事都要罗哩叭嗦扯几屏强。

avatar
z*e
38
直接返回this就好了
第二种本质上是
Util.func3(Util.func2(Util.func1(obj)));
所以说oop其实就是func的name space
就这个意思,但是一般oop程序员不会写成这样
fp写成这样的太多了,随便找

【在 d****n 的大作中提到】
: 第一中setter 最合适
: obj
: .setAttribX()
: .setAttribY()
: .run()
: 要是getter就不能死板成第一中
: var x = obj.getX()

avatar
z*e
39
因为需要返回this
但是第二种只能immutable
obj的scope可没有被控制住,除非是值传递
但这里是obj,不是int
因为指针指向的是同一个内存块,primitive types不会有问题
值传递ok,但是如果是结构体,就会冲突,除非clone给每一个thread
这个例子其实是很好的一个mutable好过immutable的例子

【在 p*****2 的大作中提到】
: 为什么第一种只能mutate?
avatar
a*e
40
又挖坑?你这两种情况下,函数输入输出类型都不一样,根本无法比较。

【在 z****e 的大作中提到】
: 举个例子,一个obj,三个func1,func2,func3
: 顺序执行func1, func2, func3
: 有下面两种方式书写,你觉得哪种好?
: 第一种
: obj.func1().func2().func3();
: 优化一下,根据.做换行
: obj.func1()
: .func2()
: .func3();
: 第二种

avatar
p*2
41

不需要返回this,返回新生成的object就可以了。

【在 z****e 的大作中提到】
: 因为需要返回this
: 但是第二种只能immutable
: obj的scope可没有被控制住,除非是值传递
: 但这里是obj,不是int
: 因为指针指向的是同一个内存块,primitive types不会有问题
: 值传递ok,但是如果是结构体,就会冲突,除非clone给每一个thread
: 这个例子其实是很好的一个mutable好过immutable的例子

avatar
z*e
42
裸写clj根本没可能
括号数死
没括号的haskell另说

【在 l*********s 的大作中提到】
: 第三种写法和第一种一样。实际上不管是clojure还是scala,写java都比裸写java更方
: 便。

avatar
z*e
43
嗯,有道理,这样就不用mutable了

【在 p*****2 的大作中提到】
:
: 不需要返回this,返回新生成的object就可以了。

avatar
z*e
44
这是以后非常常见的两种编程风格
你别告诉我你没见到过这两种风格
你用rxjava,到处是第一种写法,例子中都是这种写法
你用clojure,到处是第二种写法,例子中都是
如果你认为无法比,那就不要比

【在 a*****e 的大作中提到】
: 又挖坑?你这两种情况下,函数输入输出类型都不一样,根本无法比较。
avatar
a*e
45
clojure 是 lisp 系,当然到处用括号,很稀奇吗?
你第一种写法,最常见的无非是三个都是同一 obj 的成员函数,没参数,返回修改过
的 obj。但是也可以是返回全新的 obj,也可以是分属三个 class,分别返回下一个
class 的 obj。你不把类型写出来,怎么比较?

【在 z****e 的大作中提到】
: 这是以后非常常见的两种编程风格
: 你别告诉我你没见到过这两种风格
: 你用rxjava,到处是第一种写法,例子中都是这种写法
: 你用clojure,到处是第二种写法,例子中都是
: 如果你认为无法比,那就不要比

avatar
z*e
46

不稀奇,我说的是clj没有ide没法写,因为括号数死,看清楚context
这跟obj属于什么class有半毛钱关系?

【在 a*****e 的大作中提到】
: clojure 是 lisp 系,当然到处用括号,很稀奇吗?
: 你第一种写法,最常见的无非是三个都是同一 obj 的成员函数,没参数,返回修改过
: 的 obj。但是也可以是返回全新的 obj,也可以是分属三个 class,分别返回下一个
: class 的 obj。你不把类型写出来,怎么比较?

avatar
d*n
47
第一种其实就是样子货,看起来玄,exception怎么办?那层出来的?那层catch?
除非写些 setX (x) {this.X =x; return this;} 的 花架子。
都被js带坏了

【在 z****e 的大作中提到】
: 直接返回this就好了
: 第二种本质上是
: Util.func3(Util.func2(Util.func1(obj)));
: 所以说oop其实就是func的name space
: 就这个意思,但是一般oop程序员不会写成这样
: fp写成这样的太多了,随便找

avatar
p*2
48

可以用Option。

【在 d****n 的大作中提到】
: 第一种其实就是样子货,看起来玄,exception怎么办?那层出来的?那层catch?
: 除非写些 setX (x) {this.X =x; return this;} 的 花架子。
: 都被js带坏了

avatar
d*n
49
本人菜,烦请给展开讲讲

【在 p*****2 的大作中提到】
:
: 可以用Option。

avatar
z*e
50
现在一般公司都不让抛异常

【在 d****n 的大作中提到】
: 第一种其实就是样子货,看起来玄,exception怎么办?那层出来的?那层catch?
: 除非写些 setX (x) {this.X =x; return this;} 的 花架子。
: 都被js带坏了

avatar
d*n
51
那就更应该抛弃第一种写法。
(鄙人的小project,随便throw。 lol)

【在 z****e 的大作中提到】
: 现在一般公司都不让抛异常
avatar
p*2
52

就是Maybe Monad。

【在 d****n 的大作中提到】
: 本人菜,烦请给展开讲讲
avatar
p*2
53

第一种如果是按照FP来写的话,没有问题。如果你想更清楚一些,可以用for
comprehension

【在 d****n 的大作中提到】
: 那就更应该抛弃第一种写法。
: (鄙人的小project,随便throw。 lol)

avatar
d*n
54
不熟悉monard。
楼主不是说 1st class么。俺才干进来说说。
FP学过,没用过。

【在 p*****2 的大作中提到】
:
: 第一种如果是按照FP来写的话,没有问题。如果你想更清楚一些,可以用for
: comprehension

avatar
d*n
55
syntax sugar 吧
http://en.wikipedia.org/wiki/Monad_%28functional_programming%29
一样也逃脱不了 if esle 写两遍。
真正的exception 呢?
不如老老实实展开写,好读,好维护。
高级的feature要高级的syntanx sugar,太饶了

【在 p*****2 的大作中提到】
:
: 第一种如果是按照FP来写的话,没有问题。如果你想更清楚一些,可以用for
: comprehension

avatar
z*e
56
异常在外面catch
fp一样有异常会抛出来

【在 d****n 的大作中提到】
: syntax sugar 吧
: http://en.wikipedia.org/wiki/Monad_%28functional_programming%29
: 一样也逃脱不了 if esle 写两遍。
: 真正的exception 呢?
: 不如老老实实展开写,好读,好维护。
: 高级的feature要高级的syntanx sugar,太饶了

avatar
p*2
57
monad是design pattern 不是syntax sugar。try monad是可以包含异常信息的。

【在 d****n 的大作中提到】
: syntax sugar 吧
: http://en.wikipedia.org/wiki/Monad_%28functional_programming%29
: 一样也逃脱不了 if esle 写两遍。
: 真正的exception 呢?
: 不如老老实实展开写,好读,好维护。
: 高级的feature要高级的syntanx sugar,太饶了

avatar
d*n
58
obj
.setX()
.setY()
.setZ()
.error(function(exception){
/*so far a consistent way to catch all exceptions*/
/*if x y z throws same pattern/type exceptions*/
})
//or catch here
catch(e){
switch e {
case X: //
case Y: //
case X: //
}
}
那么问题来了,1 这样写累不累?2 debug break point 往哪行放?
对比平民写法
obj.setX()
catch (e){ /*this shall be exception X, otherwise, die*/}
obj.setY()
catch (e){ /*this shall be exception Y, otherwise, die*/}
obj.setZ()
catch (e){ /*this shall be exception Z, otherwise, die*/}
至少我自己会避免这样写。写着舒服,中看不中用。

【在 z****e 的大作中提到】
: 异常在外面catch
: fp一样有异常会抛出来

avatar
p*2
59

你这个不是fp

【在 d****n 的大作中提到】
: obj
: .setX()
: .setY()
: .setZ()
: .error(function(exception){
: /*so far a consistent way to catch all exceptions*/
: /*if x y z throws same pattern/type exceptions*/
: })
: //or catch here
: catch(e){

avatar
d*n
60
楼主说
“举个例子,一个obj,三个func1,func2,func3”
我理解obj就不是fp,对么?

【在 p*****2 的大作中提到】
:
: 你这个不是fp

avatar
d*n
61
干活去了,等二爷和赵测继续讨教经验
avatar
p*2
62

不对。应该是这样的
Option
.flatMap
.filter
.map
当然我指的是functional programming。这样你就不会抛出异常了。如果你想保留
exception信息的话可以用Try,但是java8还不支持,Scala就可以。这种pattern跟
Java的try/catch不一样,是Functional的。使得你可以完全关注与业务逻辑和代码,
而不需要care exception。

【在 d****n 的大作中提到】
: 楼主说
: “举个例子,一个obj,三个func1,func2,func3”
: 我理解obj就不是fp,对么?

avatar
d*n
63
好吧,继续关注你的scala经验。linkdin的抛弃让scala 在我心目
中失衡。不敢尝试了。
avatar
p*2
64

L算啥呀?

【在 d****n 的大作中提到】
: 好吧,继续关注你的scala经验。linkdin的抛弃让scala 在我心目
: 中失衡。不敢尝试了。

avatar
d*n
65
一个语言,新特性不是最重要的,最重要的是看谁在维护。
几个大牛不足以维护一个语言,要一个community才行。
不能啥都想尝个新鲜。jvm要是真有倒了那一天,天下的java-er怎么办?
现代计算机无外呼 stack+heap。语言怎么倒腾都行

【在 p*****2 的大作中提到】
:
: L算啥呀?

avatar
p*2
66

scala就是jvm上的呀。

【在 d****n 的大作中提到】
: 一个语言,新特性不是最重要的,最重要的是看谁在维护。
: 几个大牛不足以维护一个语言,要一个community才行。
: 不能啥都想尝个新鲜。jvm要是真有倒了那一天,天下的java-er怎么办?
: 现代计算机无外呼 stack+heap。语言怎么倒腾都行

avatar
d*n
67
唉,二爷木木。我说的就是这些东西。

【在 p*****2 的大作中提到】
:
: scala就是jvm上的呀。

avatar
z*e
68
monad是aop的一种
所以oop的话用aop就可以搞类似的操作
就是oop写成monad也不难

【在 p*****2 的大作中提到】
:
: scala就是jvm上的呀。

avatar
z*e
69
第一个方法exception抛出之后,第二个和第三个方法就不应该执行
所以你没有必要每个方法放一个try catch
所有三个方法整个放一个try catch就好了,效果跟monad是一样的
monad的try catch就是在最外层给你抽象了一层包装

【在 d****n 的大作中提到】
: obj
: .setX()
: .setY()
: .setZ()
: .error(function(exception){
: /*so far a consistent way to catch all exceptions*/
: /*if x y z throws same pattern/type exceptions*/
: })
: //or catch here
: catch(e){

avatar
l*t
70
死抱着aop是学不会monad的。try monad是带着exception的。任何时候想处理了停下
flatmap解包就是了。

【在 z****e 的大作中提到】
: monad是aop的一种
: 所以oop的话用aop就可以搞类似的操作
: 就是oop写成monad也不难

avatar
z*e
71
我可没有死抱着不放,不过logman好像比较喜欢做各种比较
比如pattern matching vs switch
不过也好,这样便于看清楚本质区别

【在 l******t 的大作中提到】
: 死抱着aop是学不会monad的。try monad是带着exception的。任何时候想处理了停下
: flatmap解包就是了。

相关阅读
logo
联系我们隐私协议©2024 redian.news
Redian新闻
Redian.news刊载任何文章,不代表同意其说法或描述,仅为提供更多信息,也不构成任何建议。文章信息的合法性及真实性由其作者负责,与Redian.news及其运营公司无关。欢迎投稿,如发现稿件侵权,或作者不愿在本网发表文章,请版权拥有者通知本网处理。