a*****e 发帖数: 1700 | 1 首先,没有任何 FP 语言是不支持 mutable 的!持有这种观点的,请先去补习一下基
础知识。
鉴别 FP (其实是 declarative)和 imperative 的关键是看它们对 mutability 的区分:
A. every variable is mutable. 多数 duck typed 脚本语言都是这类。
B. mutable by default, immutable by declaration. Java, C, C++ 等勉强属于这类。
C. immutable by default, mutable by declaration. SML, Clojure,
Haskell 属于这类。
然后 B 和 C 都还可以进一步细分,根据 declaration 到底是说变量,还是类型,还
是操作,以下是一些例子。但这之前,有必要先讲讲闭包歧义这个问题:
闭包(Closure)是说将一个函数体里面的非本地变量的值和当前环境(lexical scope
)变量的值做绑定。要弄清楚这里面的语义,在大多数语言里都势必牵涉到一个实现的
问题,就是如果当前环境里一个局部变量... 阅读全帖 |
|
a*****e 发帖数: 1700 | 2 我觉得你不妨反过来考虑一下,为啥让变量变成 mutable?
解释 mutable 必须引入一个 memory 或者 store 或者 heap 的概念,什么在一个 box
里面写个字啦,擦掉它又写个新的字啦,诸如此类。
而将变量替换为值则是一个非常基础的代数概念,有中学水平的都能够理解。这足够解
释 FP 的语义。如果需要 mutable,引入 heap allocated mutable object 即可,没
必要必须要让变量成为 mutable,没必要让 mutable 变量进入核心语义,干扰其他概
念的理解(比如闭包,具体例子我上面给了 http://eev.ee/blog/2011/04/24/gotcha-python-scoping-closures/ ) |
|
a*****e 发帖数: 1700 | 3 我知道你理解的差距在哪里了,你以为 FP 不支持 mutability,其实 FP 只是(倾向
于)不支持 mutable variable 而已。Haskell 里面特地用 ST monad 支持 mutable
array 实现,和 imperative language 里面的 mutable array 完全没区别啊 |
|
d*******r 发帖数: 3299 | 4 一个帖子,转来大家讨论一下
最近使用 closure 和 anonymous function 遇到些问题, 大家探讨一下。
简单说就是当临时写一个 closure 或者 anonymous function 当 callback 使用时候
,如果让这个 closure access 了 external scope 里面的 variable, 就容易出现 "
access mutable variable " 的问题 (WebStorm 就会报 warning).
比如这个帖子里面描述的例子:
http://samwize.com/2013/09/01/how-you-can-pass-a-variable-into-
里面的 callback 引用并使用了 external scope 里面的 i, 所以出错了。
他是通过用 bind( {i: i} ) 将 i 的值传入注册时候的 callback 来解决的,当然也
有其他方案, 比如将 dummy(i, function(response)) 改成 dummy(i, function(
response, i)) 也行。
我在想... 阅读全帖 |
|
d*******r 发帖数: 3299 | 5 没说多线程呀,帖子说的是 "因为 single threaded 只是可以让 Node 的代码 access
shared variables 时候不用 lock"。都不用 lock 了,所以所谓 "平行执行的
callbacks" 还是在 single threaded 的主 thread 执行的 (可以算是虚拟平行执行)
,这些执行流程 access shared variable 的问题,是说如果那个 shared variable
是 mutable 的话,多个 (虚拟平行执行的) callbacks 可能修改这个 variable 而不
互相通知。
所以用 closure access external mutable variable 才是有可能有危险的。
我觉得 WebStorm 的 warning 还是挺靠谱的。 |
|
a*****e 发帖数: 1700 | 6 FP 里面默认变量都是 immutable 并且所有参数传递都是 pass by value。如果需要
mutable 变量,那么可以用一个 1-cell mutable array object 来代替。不能再简单
了吧?这语义理解起来比任何 imperative language 不知道简单多少倍。
反过来,在 imperative 语言里面加入 FP 的 feature, 比如 closure,则会造成语义
不清晰的问题。问一下写 js 或 python 的人多少人真正理解 closure 是怎么读写环
境变量的?十个里面有九个能答错。举例;
http://eev.ee/blog/2011/04/24/gotcha-python-scoping-closures/ |
|
a*****e 发帖数: 1700 | 7 你知道 SSA 吗?LLVM 编译 C/C++ 到 SSA form,里面的变量都是 immutable 的,只
有 heap 和 stack 是 mutable 的,完全不妨碍实现任何功能。
所以你说这些,用 mutable heap object 在 FP 里面都直接做,难度在哪里? |
|
a*****e 发帖数: 1700 | 8 你如果转而谈论 immutable data structure,那是一个不同的问题,和所有的 data
structure 设计一样,immutable data structure 有它适用的场景(比如实现
persistency),也有它不适用的场景(比如反复 allocation 是一种浪费)。在恰当
的环境下选用恰当的 data structure,无论你用什么语言,都是必须的。
但从语言设计的角度,根本不是什么 immutable data structure 的问题,就是
mutable variable vs immutable variable 的问题,或者进一步说,是 mutability
是否应该反映到 type 层面的问题。 |
|
H********g 发帖数: 43926 | 9 【 以下文字转载自 Military 讨论区 】
发信人: mocc (无可), 信区: Military
标 题: Man's world is mutable, seas become mulberry field
发信站: BBS 未名空间站 (Thu Oct 26 19:07:10 2017, 美东)
我楞了三十秒,才想起这是主席的哪句诗 |
|
o**********a 发帖数: 330 | 10 Totally java新手,请大家指教。
Date d = new Date();
System.out.println(d.hashCode()+"=>"+d);
d.setYear(45);
System.out.println(d.hashCode()+"=>"+d);
output
-1353940027=>Wed Mar 27 23:40:59 CDT 2013
-212907598=>Tue Mar 27 23:40:59 CDT 1945
请问上面这个例子能不能证明Date is mutable?
hashcode()给出的是不是object的内存地址?
我觉得hashcode()给出的不是内存地址 |
|
Y**G 发帖数: 1089 | 11 Date 是mutable的
hashcode 不代表内存地址
hashCode 是可以override的 |
|
d*******o 发帖数: 952 | 12 javascript the good parts里有一句"objects in javascript are mutable keyed
collection", 这句话该怎么理解? |
|
d*******r 发帖数: 3299 | 13 closure accesses external mutable variables 挺危险的... WebStorm 是要报
warning 的呀
我觉得这个理解是对的:
如果想 callback 里的逻辑使用 callback 注册时候的 someObjectRef 的值,岂不是
传入 callback 的时候就得 copy/clone someObjectRef 当时的值?
... ...
这样做的话,就有点像其他 concurrent 模型里面的 "send a variable copy through
a message, but not give reference to the variable". |
|
d*******r 发帖数: 3299 | 14 二爷你还没仔细读帖子吧,帖子里说的很清楚了呀,而且帖子里面那个例子就是很好的
说明,我copy下来跑过
而且如果你 Google: closure access mutable variable 的话,是有很多其他人的讨
论的 |
|
d*******r 发帖数: 3299 | 15 二爷我没有 bash Node 呀,Node 确实写并发挺方便的,特别是各种 Net/File IO,最
近用着确实挺爽的.
我只是觉得写 JS Closure 的时候,我需要注意这个 access external mutable
variables 的问题。
刚刚扫了一眼 CoffeeScript, Coffee 有个 do 关键词就是跟这个有关.
http://coffeescript.org/
When using a JavaScript loop to generate functions, it's common to insert a
closure wrapper in order to ensure that loop variables are closed over, and
all the generated functions don't just share the final values. CoffeeScript
provides the do keyword, which immediately invokes a passed function,... 阅读全帖 |
|
|
z****e 发帖数: 54598 | 17 fp的mutable para/object/var仅限于scope内
一旦超出scope,你的fp就没有意义了
就变得跟class耦合起来,就变得fp不像fp,oop不像oop
四不像,fp很容易写成四不像,然后小手就不停滴发疯
每一个rookie进来之后,都要花很长时间学习这些隐形的限制
而且为什么还非常的抽象,你看有几个能把为社么fp要这样要那样表达清楚的?
几乎每一片都是天书,鸡同鸭讲,皇帝的新衣 |
|
z****e 发帖数: 54598 | 18 发信人: sui (黑圈圈), 信区: Programming
标 题: Re: 对 (im)mutability 的误解和深度理解
发信站: BBS 未名空间站 (Thu Feb 12 21:05:43 2015, 美东)
没看懂。
计算机概念,如果不能举栗说明,很难讲清楚。 |
|
z****e 发帖数: 54598 | 19 举个例子
游戏里面,同一个物体会不停滴有各种状态
最简单的,一架灰机飞过地图
x,y是其坐标,那(x,y)就是一个变量组合
那每一ms我们刷新一次的话
1s之后,就会爆出1000个内存块
随着游戏中物体的不断增加
这个增长会有些太过于快了点吧?
如果是mutable的话,就很容易了
直接修改原值就好了
box |
|
z****e 发帖数: 54598 | 20 我相信有一样大卖的东西
因为它可以改成mutable的var
不过那样的话,跟oop又有啥太大区别呢?
那你的意思就是这个是fp和oop的主要差别是不?
虽然我不怎么在乎内存的使用,但是immutable还是不用了
这个太夸张了
当然除非有限的状态集
但是这个也有enum来搞,enum应该就是immutable的一种吧? |
|
z****e 发帖数: 54598 | 21 不是呀
我觉得这样无限度滴使用immutable显然是不对的
你看这样
class->mutable, enum->immutable
你觉得好不好呢? |
|
a*****e 发帖数: 1700 | 22 注意是将 mutability 反映到 type 层面,而不是无限度适用 immutable 啊~~~ |
|
z****e 发帖数: 54598 | 23 还有一点
对于immutable的目的没有表述出来
因为如果不设置成immutable
在多线程的环境中
就会出现不确定性
那就是输入一致的时候,输出不同
同一个东西有可能出现两种结果
所以干脆全部弄成immutable的,不让你改
所以为了保证这一点
每一次出现新的value,都需要重新生成一个新的变量
这个真心不适合一些特别活跃的物体
适合数字文本处理这些,能够赋值一次,走完整个生命周期
然后销毁,不过这个确定性也可以挪用到其他地方去
oop也可以做成这样,无非包多一层,不要用static var就好了
但是oop一般不要求你做成immutable的,所以不同的状态下
有可能函数结果不同,但是这个东西无非是一个留意嘛
也就是说做成immutable容易搞嘛,oop其实也可以这么做
但是immutable对于那种状态非常活跃的对象,十分不合适啊
需要声明其为mutable heap object,而这么做的话
就不能绝对保证多线程环境下的确定性了,就不是pure fp了
我相信这种东西还是会出现的,比如游戏,游戏实在是不适合做fp
越是即时的越不合适,batch倒是比较适合immut... 阅读全帖 |
|
c*******9 发帖数: 9032 | 24 目前游戏多是模似现实的,现实就是一种假象,所以用mutable这种假想楖念更方便。
真像是"人不可能两次通过同一条河"。 |
|
h*i 发帖数: 3446 | 25 你还是概念不清,混淆了两个我前面已经指出的不同概念:mutable变量,一个客观对
象(identity)的属性的变化,这是两个不同的东西。前者是一个具体的计算机实现,
而后者是一个功能需求。
如果你的“inherently mutable”是指一个对象的属性会发生变化,也就是指一个功能
需求,那么,你提这个“inherently mutable”的东西是不能用来作为immutable数据
的反例的,因为immutable数据也是用来实现这种功能需求的一种方法。
如果你的“inherently mutable”是指mutable变量这个具体实现,那么你是可以提这
个来做反例。但是,你没有提出任何问题是mutable变量能解决,而immutable数据不能
解决的。你提到的银行账号问题,这两个实现都有一样的问题,因此你的论证失败了。
我也是基于你的“inherently mutable”是指mutable变量的假设来说这句“没有什么
是inherently mutable的东西“的。我的意思是说,mutable的变量是现实世界中不存
在的东西,是人想出来的概念,然后用一种计算机实现来模拟... 阅读全帖 |
|
d**********o 发帖数: 1321 | 26 hw3b c-.y file
上面这一楼贴了载止hw3b deadline时我match的结果(也就是老师可以以这些不match
的ERROR为借口不给后来我补上的成绩),但是因为当时我还是没有写完,后来感恩节
期间就接着又写了一些,而且hw5是based on hw3 & hw3b的基础上(当我hw5是based
on更好的hw3的结果时,我应该可以得更多的分吧)。
hw4因为写得比较顺利,就不曾保留任何交上去作业的output,没有什么一目了然的结
果是我可以贴在这里的。原本我是想要把自己最的一次作业hw5贴出来的,但那已经是
一个完整的compiler,而且以后我还需要用自己的course project来找工作,所以一定
就不贴最终结果了。那就贴一个hw3b的c-.y文件吧,它集中的hw1、hw2、hw3、 hw3b的
结果,是我自己hw3b *.y文件的最完整版本。这些作业里面也有很多机关一一人为增加
的难度,比如那六七个IO相关的function,不仅traverse tree、build syntax tree的
时候会成为一个考点(把它们作为一个node连在syntax... 阅读全帖 |
|
d**********o 发帖数: 1321 | 27 hw3b c-.y file
上面这一楼贴了载止hw3b deadline时我match的结果(也就是老师可以以这些不match
的ERROR为借口不给后来我补上的成绩),但是因为当时我还是没有写完,后来感恩节
期间就接着又写了一些,而且hw5是based on hw3 & hw3b的基础上(当我hw5是based
on更好的hw3的结果时,我应该可以得更多的分吧)。
hw4因为写得比较顺利,就不曾保留任何交上去作业的output,没有什么一目了然的结
果是我可以贴在这里的。原本我是想要把自己最的一次作业hw5贴出来的,但那已经是
一个完整的compiler,而且以后我还需要用自己的course project来找工作,所以一定
就不贴最终结果了。那就贴一个hw3b的c-.y文件吧,它集中的hw1、hw2、hw3、 hw3b的
结果,是我自己hw3b *.y文件的最完整版本。这些作业里面也有很多机关一一人为增加
的难度,比如那六七个IO相关的function,不仅traverse tree、build syntax tree的
时候会成为一个考点(把它们作为一个node连在syntax... 阅读全帖 |
|
N*n 发帖数: 456 | 28
wasn
我自己查了一下。。总算明白immutable 所指
以下转引
*************************
FP中的函数中的所有变量不允许进行再绑定。在FP中一个变量x当他被赋予一个值1以后
他永远就是1。那么x就被称为是immutable的。相反在imperative语言的里x却是
mutable的,那么当你执行imperative 语言中的某个函数A(x,y)。其x,y会受到某个"遥
远"变量的影响而使得A的结果出现任何一种你未曾经预料到的情况。这称为"side-
effection"-边界效应。而FP中A(1,2)的结果是不会改变的,有什么样的输入一定会有
什么样的输出,因此他是"no side-effection"。
Ajoo这位前人对immutable编程的经验
1。对象状态不会变化,程序bug就会少很多。有一个mutable set函数,在set前和set
后对象就处于两个不同的状态。所以说immutable减少了对象的状态。
2。没有变化,就没有线程同步问题。对象自然是线程安全的。这和用同步(包括用
shared_ptr)不同,后者是通过额外的,需要一定... 阅读全帖 |
|
S******n 发帖数: 132 | 29 第一个电话面试,答得不好
C++的几道题
1. why mutable, when should we use mutable?
我就按定义说了,想在const成员函数里面改变member variable,就需要mutable
然后他说你既然把函数定义成了const,就不应该去改变member variable,然后问我什
么情况下需要mutable,这样说来我就真不知道了,谁来解答一下
2. order of construction for member variables.
3. extern 用法: extern int c = 0; 合法吗?什么情况下需要用extern,有什么优
劣性
4. static用法
5. volatile用法,什么情况下使用,举例
这个我也答得不好,因为没用过,就记得概念,实际应用就不知道了
6. Fibonacci函数,要compile-time得到结果
template metaprogramming这个东西金融公司里面用得多吗?
template平时工作中用的多吗?如果真的挺重要,我还得努力补习一下
7. deque vs vector
好... 阅读全帖 |
|
l****q 发帖数: 177 | 30 http://www.refinery29.com/2014/03/64501/susan-miller-horoscopes
Sometimes, it's better to know what's lurking in the shadows, waiting for
you, than to be surprised. Especially if what's out there is kinda scary.
Okay, maybe we're being a tad dramatic, but we all know your horoscope
sometimes holds unpleasant things. And, it's best to be prepared. So, we
asked astrologer extraordinaire Susan Miller to do a deep dive into each of
your signs, and tell us what you need to watch out for when next mon... 阅读全帖 |
|
j*****7 发帖数: 10575 | 31 Sect. IX. — THIS, therefore, is also essentially necessary and wholesome
for Christians to know: That God foreknows nothing by contingency, but that
He foresees, purposes, and does all things according to His immutable,
eternal, and infallible will. By this thunderbolt, “Free-will” is thrown
prostrate, and utterly dashed to pieces. Those, therefore, who would assert
“Free-will,” must either deny this thunderbolt, or pretend not to see it,
or push it from them. But, however, before I establish th... 阅读全帖 |
|
a*****e 发帖数: 1700 | 32 如果你要问我,我会说几乎没有什么是 FP 不适合的,就连内核以及嵌入式,FPGA 等
都有 FP 的解决方案。
这里我并不是说内核或者嵌入设备去跑 FP 语言的 runtime,而是说用 FP 的工具设计
的 DSL 跑在内核和嵌入设备上。比如你可以搜一下 se4L,它的一个实现是用 Haskell
写的,被用于证明所生成的内核的正确性。
I'm a big believer in DSL. 合理设计的 DSL 能够快速完成目标 domain 的编程要求
,所需要的只是一个有效的 DSL 开发环境,FP 在这方面非常适合。就象是一套合理设
计的库函数或者框架什么的,能够大幅度提高开发效率。但是库函数的组合调用通常都
是写在源程序里,写好就不可以改动。而 DSL 则是它本身可以被分析重组,写好之后
,还可以用程序处理变换,验证性质,生成高效代码等。元语言 (meta programming)
的技术目前也在抬头,但我认为还是 DSL 更灵活,因为 meta programming 所操作的
对象还是一个 general purpose 的语言所写的程序结构,很多时候我们只需要 domai... 阅读全帖 |
|
a*****e 发帖数: 1700 | 33 如果你要问我,我会说几乎没有什么是 FP 不适合的,就连内核以及嵌入式,FPGA 等
都有 FP 的解决方案。
这里我并不是说内核或者嵌入设备去跑 FP 语言的 runtime,而是说用 FP 的工具设计
的 DSL 跑在内核和嵌入设备上。比如你可以搜一下 se4L,它的一个实现是用 Haskell
写的,被用于证明所生成的内核的正确性。
I'm a big believer in DSL. 合理设计的 DSL 能够快速完成目标 domain 的编程要求
,所需要的只是一个有效的 DSL 开发环境,FP 在这方面非常适合。就象是一套合理设
计的库函数或者框架什么的,能够大幅度提高开发效率。但是库函数的组合调用通常都
是写在源程序里,写好就不可以改动。而 DSL 则是它本身可以被分析重组,写好之后
,还可以用程序处理变换,验证性质,生成高效代码等。元语言 (meta programming)
的技术目前也在抬头,但我认为还是 DSL 更灵活,因为 meta programming 所操作的
对象还是一个 general purpose 的语言所写的程序结构,很多时候我们只需要 domai... 阅读全帖 |
|
n****1 发帖数: 1136 | 34 记得scheme里面的encapsulation是用closure实现的, 就是我上面贴的代码。
clojure不熟
scala虽然有mutable, 但我记得它是强烈鼓励使用immutable的, 让coder意识到
referential transparent的重要性,从而减低mutable的影响面积。 从这个角度上来
说, scala是个好的开始。
scheme也有mutable, 但SICP里面可没少强调setq的危害。
但java/python/ruby/js这些基本没有这个概念, mutable state像空气一样充斥着每
一个角落, 所以到了需要高并发时就傻逼了, 就得看scala/clojure了。 |
|
z****e 发帖数: 54598 | 35 是这样的呀,不同的语言在不同的地方选择了不同的option
最后变成了不同的东西,以满足不同人物的需要
简单说就是oop部分是java(static+mutable),fp部分是clj(dynamic+immutable)
脚本部分是groovy(dynamic+mutable),scala部分是(static+immutable)
当然不是绝对,但是提倡时这样,很好玩啊,四个东西分开了
然后各种框架是j2ee那些,但是这里面scala最有野心
scala最好玩的就是尝试把这一切都给做了,做成一个super超集
变成java+clj+j2ee,甚至现在开始打算包括脚本了,结果很热闹
一切的争议其实都是围绕着object的存在感
object在fp中是被批判的,因为会隐藏其内部属性
所以建议都用map/list etc.
但是我不同意这种看法,我觉得object应该存在
因为diversity,把人简化成一个map/list
变成一组冷冰冰的数字和符号,那这个有些不太对
我相信从属关系才是本质,就像我们人这个皮囊包括了很多内脏一样
上帝造人的时候就是oop啊,细胞也是一个包一个
还有就是... 阅读全帖 |
|
p**z 发帖数: 65 | 36 首先,我同意 Python 里的 name 也叫做 variable。Python 自己文档里面就是混用的
。但是它的真正行为确实是一个名字,跟其他 statically typed 语言的变量有所不同
。另外,原帖中 by value 和 by reference 的表述并不准确,因为那是我以 VB.NET
的行为来打比方的,并没有严格按照这两个术语的原意。
我简单看了一下 Python 和 Java 的文档,觉得它们还是有很大不同的。
对于 Python,可以看一下它的 language reference, 3.1. Objects, values and
types, 以及 4.1. Naming and binding。如果我理解没有错的话,Python 没有简单数
据类型,所有的数据都是对象。每个对象有自己的唯一的身份(不可改变),类型(不
可改变),内容(有些 immutable,比如整数,浮点数,字符串;有些 mutable,比如
list,dictionary)。Python 是 dynamic typing 的,就是说一个名字(变量)使用
前不用声明数据类型。它的实... 阅读全帖 |
|
b*******S 发帖数: 17 | 37 看完了一般的tutorial,就是像是list,string,class,function怎麼用之後
如果有時間 可以看這本Programming in Python 3: A Complete Introduction to the
Python Language
http://www.amazon.com/Programming-Python-Complete-Introduction-
進階的內容包括如樓上所說的decorator(我覺得沒甚用)
比較要注意而且tricky的會問的是 mutable跟immutable
要知道那些變數型態市mutable,那些是immutable
還有這兩種有甚麼不同(performance;還有multithread下的同步)
另外一個trick的是在python的default parameter如果採用mutable跟immutable會有不
同結果 (前著會讓initialization只做一次 是非常奇怪的行為) |
|
H****S 发帖数: 1359 | 38 kinda remember someone talked about this in his blog. Here is the idea,
import java.util.concurrent._
import scala.collection.mutable
val hq = mutable.Buffer[Condition]
val oq = mutable.Buffer[Condition]
val lock = new ReentrantLock()
def h() {
lock.lock()
try {
if (hq.size >= 1 && oq.size >= 1) {
val ch = hq.last
ch.signal()
val co = oq.last
oh.signal()
hq.trimEnd(1)
oq.trimEnd(1)
println("h")
} else {
val ch = lock.newCond... 阅读全帖 |
|
w**********t 发帖数: 19 | 39 Pisces Horoscope for July 2011
By Susan Miller
This certainly is a big time of the year for you, with a lot of news coming
in from all quarters. Last month, your area of home and family was lighting
up, and so you may have been busy moving, doing a renovation, reorganizing
your space, or ordering a thorough cleaning of windows and upholstery.
Alternatively, you might have spent quite a bit of time being with your
mother or father, perhaps because one of your parents was not feeling well
or neede... 阅读全帖 |
|
j*****7 发帖数: 10575 | 40 Sect. X. — I COULD wish, indeed, that we were furnished with some better
term for this discussion, than this commonly used term, necessity, which
cannot rightly be used, either with reference to the human will, or the
divine. It is of a signification too harsh and ill-suited for this subject,
forcing upon the mind an idea of compulsion, and that which is altogether
contrary to will; whereas, the subject which we are discussing, does not
require such an idea: for Will, whether divine or human, do... 阅读全帖 |
|
k**********g 发帖数: 989 | 41
首先所有底层的第三方代码要进行代码审查,看看有没有要修补,要上锁或加倍留意的
地方,例如mutable singleton,thread local data。其中的「锁」会用两种方式确保
正确运作而不锁死∶数据依赖和任务依赖。巩固代码後,下面的工作可分为三方面∶任
务包装,数据包装,界面包装。这包装和encapsulation不同,本质是换汤不换药,不
过是把代码结构稍为修改了。任务包装是把可执行的耗时任务分割为单元,细分为CPU
intensive和IO intensive,再分装为Callable。要确保每一个单元提交到Executor後
,能在任意thread成功执行。数据包装是把数据分类为Write once read many(WORM)或
是mutable。WORM会变成Futures。Mutable按需要可能改写成immutable pattern(类似
copy on modify)或用上述的依赖链使其单线程化。(即使单线程化,不相关的任务仍
可并列执行。)界面包装是把上述的改写用最简洁易用的方式表达,确保接口的组合性
(composability)。
经常会用到 ... 阅读全帖 |
|
h*i 发帖数: 3446 | 42 mutable data也会用到,但不是必须的。一般atom用得最多,存全局状态方便。我写过
的几个Web应用一般都会用到几个atom,主要是为了方便。如果不图方便,可以用
component这种DI framework,这样就连atom都不用了。我一般是两者都用,常用到的
状态,比如DB connection啥的,用component,只只出现在一个地方的的状态用atom。
但如果是写libary,经常是一个mutable data都没有的。Clojure故意把mutable data
搞得很难用。最容易用的atom,也要搞一些boilerplate,先要定义,然后用的时候要
swap!, swap!的时候还要记得把值包在一个函数里面,最后要deref,一堆事要做。
基本上来说,Clojure日常的代码,bread and butter, 都是用immutable data的,这
个坎必须翻过去才能正常写代码,CL程序员和Java程序员都一样的需要翻这个坎。 |
|
a*****e 发帖数: 1700 | 43 这个例子只能说明 mutable by default 需要遵守一定规则 (使用 non-escaping 局部
变量)才能安全,想用它来例证 mutable by default 好?逻辑上讲不通。
为什么我说 non-escaping,因为如果使用 closure 捕捉局部变量成为环境变量,就
escape 了它们原先的定义域,mutation 会导致意想不到的状况,和使用全局 mutable
变量类似。 |
|
z****e 发帖数: 54598 | 44 你的fp学得一塌糊涂
早说了,fp不是不可以mutable
所有的fp language都可以设置mutable var
不可以mutable是我故意用来坑你们的
不懂的人就不要装了,装啥呀
那个alaine不是写了吗?第一段就写得很清楚了
呢? |
|
z****e 发帖数: 54598 | 45 java - static type + mutable object
scala - static type + immutable object
groovy - dynamic type + mutable object
clojure - dynamic type + immutable object
你说说go最像哪一个,当然不绝对,尤其是后者
基本上所有语言都可以有选择地mutable,但是fp一般immutable是default
前者的话,swift和dart都是optional static/dynamic type
可以选择的type,所以swift&dart更像下一代的语言 |
|
g*****g 发帖数: 34805 | 46 So I read your link, is it just me or that you are using OO to write your
system? Did I not see encapulation, mutable, stateful there? Those ain't FP,
are they?
"
Large applications often consist of many stateful processes which must be
started and stopped in a particular order. The component model makes those
relationships explicit and declarative, instead of implicit in imperative
code.
Components provide some basic guidance for structuring a Clojure application
, with boundaries between diffe... 阅读全帖 |
|
N********n 发帖数: 8363 | 47 你先说要搞immutable,我指出很多现实问题的本质是"inherently mutable"
你又说没有所谓的"inherently mutable",我就拿银行账户做反例,指出存取
账户是典型的"inherently mutable"操作。copy/append/"指针"等immutable
数据结构的小trick在这里没用。 |
|
N********n 发帖数: 8363 | 48
identity啥的都是说辞。其实就是FP/immutable没那么神。race condition
导致处理mutable问题很复杂。immutable号称可以简化编程。那好,OOP靠边
站,请FP露一手吧。用immutable方式操作银行账户,把原地操作换成FP指定
的copy/append,楼上折腾半天结果连基本的存储操作都搞错。mutable环境下
头疼的RC问题换immutable照样没招,那些copy/append都是无用功。
至于保存immutable数据做audit,那不就是版本控制么。那是软件系统需求,
跟程序语言有啥关系?常用的github / svm / tfs / cvs / perforce 就是
典型的immutable存储。需要的话OOP照样写一个,又不是FP独有的概念。
世界上不是一切都是mutable,但也不是一切都immutable。你开车去加油站,
你的油箱是变成新油箱了,还是就在原箱加满油?你的车轮每转一圈就被复制
成新轮子了,还是原来的老轮子?凡事量身而做,把immutable当成真理然后去
生搬硬套,那是书呆子本末倒置闹笑话。 |
|
g****t 发帖数: 31659 | 49 所有的数学书,物理书里面的map 都是不改
变量的,函数内也没有状态一说,immutable的思路不能轻视。
从实践来讲。我多年前写的有的code因为是reference transpancy,避免过一次编译器
重大事故。我并不知道什么是fp.
所以我个人看法,凡是明确描述数学物理模型的
代码,尽量和数学定义的函数一致。这样避免自造轮子。
如果需要算法
变种,用别的办法lift up到高一层,不要两种函数混一起。
: identity啥的都是说辞。其实就是FP/immutable没那么神。race
condition
: 导致处理mutable问题很复杂。immutable号称可以简化编程。那好,OOP
靠边
: 站,请FP露一手吧。用immutable方式操作银行账户,把原地操作换成FP
指定
: 的copy/append,楼上折腾半天结果连基本的存储操作都搞错。mutable环
境下
: 头疼的RC问题换immutable照样没招,那些copy/append都是无用功。
: 至于保存immutable数据做audit,那不就是版本控... 阅读全帖 |
|
P********l 发帖数: 452 | 50 http://www.sureinterview.com/shwqst/545001
code:
public void findRange(double[] data, double rangeStart, double rangeEnd,
Mutable pStart, Mutable pEnd) {
pStart.setValue(-1);
pEnd.setValue(-1);
if (data == null || data.length == 0)
return;
int posStart = 0, posEnd = data.length - 1;
// find where the data roughly is.
int inRange = 0;
while (posStart <= posEnd) {
inRange = (posStart + posEnd) / 2;
if (data[in... 阅读全帖 |
|