last day (35 days later) » 

4:16 PM
我在看你的文章
我得说你对这些运算顺序确实花了功夫。。
@xzczd 咱跑慢了。。
in Wolfram Mathematica, 1 min ago, by kirma
Nobody expects the Chinese invasion!
 
 
这例子够醉的,我此前绝对意识不到
@xzczd 我感觉还是谈得浅了点,等有时间了我得看看你引的那本参考书
比如这个,Plus[2, Unevaluated[3]]可以得到结果,Plus[2, Unevaluated[RandomReal[]]]却不能
 
在我看来Mr.Wizard所说的本质上就是这个
你所说的那帖,其实问题里提的东西比答案里提的东西还复杂
问题里提到的那个Wagner的书里提的现象。就是那个“如果头部里含了变换规则就怎么怎么样”的那个,才是真搞不清楚。
 
他那贴我没看明白。。se的贴我很多都没耐心看完(通常都能看到你在下面的评论)
这个现象可以用你的理‌​论解释不?
 
4:41 PM
呼,可算把我们刚才谈天的要点翻译完了。
 
哈哈,还是你的英语好,我的很半桶水,尽管se算是提高了一部分
@xzczd
 
好的,继续说Unevaluated
你所举的这个例子,就是我上面说的
在问题里提及了的、实质上比Mr.Wizard在答案里谈的内容要坑得多的内容
问题开头引了Wagner的书里提及的一个有关计算次序的结论
If no applicable rules where found and any of the part_i has the head Unevaluated, restore that head.
 
你是说匹配参数的时候头是Unevaluated,Unevaluated就会直接放弃计算?
 
也就是说,如果一个头部(Head)里面不存在可以变换参数(Argument)的规则,并且那个参数的头部是显式的Unevaluated
那这个 Unevaluated就不会计算
不是,确切地说是Unevaluated就会留在那里不动
不发生任何改变
这就是Plus[2, Unevaluated[RandomReal[]]]保持原样的原因
它其实比较接近于
ClearAll[f]
f[2, Unevaluated[RandomReal[]]]
因为RandomReal[]必须计算一次才能变成一个数,在未计算的时候,它就只是个符号表达式
 
醉了,那为什么这又可以了?
ClearAll[f]
f[x_, y_] := x + y
f[2, Unevaluated[RandomReal[]]]
 
4:51 PM
……壳被剥掉了啊同学
认真看我讲显式存在的那篇文章
——更进一步地,上面的代码其实很接近于:
ClearAll[f, g]
f[2, Unevaluated[g[]]]
你给的那个例子,因为f里面存在可以变换参数的规则,所以Unevaluated被用掉了啊
首先f[2, Unevaluated[RandomReal[]]]执行
如Wagner书的解释,Mathematica会先检查f里面有没有可以变换这两个参数(2和Unevaluated@RandomReal[])的规则
一看,还真有欸
In[464]:= f // DownValues

Out[464]= {HoldPattern[f[x_, y_]] :> x + y}
于是Mathematica就遵照这条Downvalue对两个参数进行变换
在这一步变换里,Unevaluated被用掉了
 
Graphics[Thread[{Unevaluated[RandomColor[]], {Disk[{83, 69}, 2],
Disk[{34, 32}, 2], Disk[{69, 91}, 1]}}]]
那这里的Unevaluated没计算是因为List为头的参数,所以没计算?
Thread[{Unevaluated[RandomColor[]], {Disk[{83, 69}, 2],
Disk[{34, 32}, 2], Disk[{69, 91}, 1]}}]
你刚说的这几句我得好好理解一下。。
 
那这里的Unevaluated没计算是因为List为头的参数,所以没计算?
————
你要注意到Unevaluated只能抗一次计算,并且是紧贴着的那一层
 
你会不会改房间名?我觉得应该把Unevaluated写进去,你刚那几句很有价值,方便查询
 
room topic changed to Discussion about Unevaluated between yode and xzczd (Mainly in Chinese): (no tags)
后续的Thread的变换,其实是针对List结构的。在这个时间点上它已经“看”不到里面的Unevaluated了
 
好像还没解释为什么Plus[2, Unevaluated[2]]又计算了?Plus[2, Unevaluated[RandomReal[]]]没计算是因为Plus没有下值,DownValues[Plus]为{}
@xzczd
 
5:05 PM
这就是这个地方的坑点啊
对此唯一合理的解释是,对Unevaluated来说,“规则”并不单指下值
既然1+1能算成2,那说明Plus依某种规则执行了某种变换
但是这个变换规则是不可视的
哪些内置函数,在什么情况下会做变换?没人知道
内置函数隐含的变换规则我们看不见,不像我们自己定义的那些函数
 
你的意思是说它计算了是因为存在一种看不见的规则,但不是下值?
 
你现在的Reputation已经能看到被删的帖了吧?
 
自己删的?
 
你看看BoLe的答案评论里的内容
……看来是看不到呢
来给你看看什么叫三观尽毁
 
我得说这Unevaluated还是有点怪,尽管你刚刚的解释能说明一些情况
 
5:13 PM
是奇怪啊。我在Mr.Wizard的答案下面链的那个你看了吗
Rule和RuleDelayed会反复自动计算,直到把它们可见的Unevaluated给吃光
Times[2, Unevaluated[RandomReal[]]]gives 2 Unevaluated[RandomReal[] – andre Aug 18 '16 at 19:53


@andre Plus[0, Unevaluated[RandomReal[]]] numerizes too; one notices 1 and 0 are default values for arguments of Times and Plus. – BoLe Aug 18 '16 at 19:59
1

@BoLe There is no rule for Plus[1, Unevaluated[RandomReal[]]] (i.e. for Plus[1, RandomReal[]] with RandomReal[] not evaluated to a number). But there are rules for what you are proposing, so Unevaluated gets stripped. For Plus[1, 2, Unevaluated[RandomReal[]]] it's probably something like Plus[a_, b_, rest_] := Plus[InternalPlus[a,b], rest
来,文字版
 
怎么连删除了的评论都可以看??
 
Reputation超过一定值就能看到被删除的答案了
 
另外,怎么有些人有权力删除别人的评论。。
 
这是同一帖下面BoLe的答案(已删
 
哦,混这么久,我才知道。。
 
5:17 PM
@yode 这网站是有管理员的你应该知道吧……
 
我主要bounty了很多值,要不然会多两三千
嗯嗯,我知道
 
另外你假如看到该删的评论(不一定是恶意评论,也有可能是报废的评论,比如说“你这有个Typo”“啊谢谢我已修改”这样的),你可以Flag它
如果管理员觉得你说得有道理,就会把那个评论清掉
我就常这么干
——Flag就是那个小旗子,你看到了吗
 
我感觉那m_good老针对我。囧
 
……有吗?
 
嗯嗯,我几乎没用过
哈哈,感觉
 
5:19 PM
你是说你前段时间在主聊天室里贴的那个?
我觉得还好啊其实。
 
我之前对人给我tag一个duplicate很慌,后面才知道其实不是恶意
 
那帖说实话我感觉你有点反应过度了
@yode ……为什么这么多人都觉得duplicate是种惩罚
 
我用英语的时候不能把握说话的语气,搞不清人家是不开心了还是开玩笑
 
……那就往好了想啊。
Mma.SE整体风气算很好了我觉得。大家都很客气。
(不过现在林子大了,也不是没有不好的鸟吧……
 
嗯嗯,是的,国内没这环境。。
我再请教你一下,就得睡了,明天得去上海
你觉得Append是不是很慢?
 
5:23 PM
啊,问吧。(我也差不多该睡了囧
@yode 尽量避免Append不是江湖规矩吗 :D
不过
有一点必须指出的是
 
它们说这函数的时间复杂度是O(n^2),有些人还说是O(n^3)。。
 
它的速度其实和Join相当
 
我不知道这评价是怎么来的
 
(这个是 草红样 最早指出来的
 
但我感觉这是个效率很高的函数。。
 
5:25 PM
复杂度啥的我不懂
不过你没有把它和AppendTo搞混吧?
Leonid的那本书开头部分谈了这个问题
 
我感觉非常其怪,我觉得他的复杂度无论如何也是O(1)的,因为参数只能是一个
 
应该和反复复制有关
 
不是,你可以测试一下,我感觉它很慢,原因是List的原因,而不是它自己的原因
Append和AppendTo是一样的吧(效率上)
 
效率不算高是真的。先分配空间再往里填的话就比较快
@yode ……不,完全不一样
 
如果把对象换成Association,能非起
它现在也支持Association
 
5:27 PM
AppendTo非常慢,这个有定论
因为它相当于a=Append[a,b]
Association是另一回事。AppendTo作用于Association是很快的
Leonid的某个谈Association的答案说了这个
 
嗯嗯,所以我认为它慢是因为List这种数据结构
 
……你要这么说当然也可以
因为Mathematica几乎没有按地址传递啊
往List里塞元素只能反复拷,所以就慢了
 
是的。。我新的那贴.net也有这体会。。别人按址循环,我直接ToExpress就全出来了。。
Szabolcs来了,我怎么记得他是懂中文的~
 
他是懂啊
他在Chinese.SE还有号呢
目测日常交流没问题。@Szabolcs 我说的对吗 :D
 
@xzczd 多谢指教,我得休息了。晚安 :)
 
5:35 PM
嗯,我也睡了。
啊,又来了个同胞
 
咦?我记得他也是中国人?
 
Szabolcs是匈牙利人
 
哦哦,我说xslittlegrass同学
 
嗯,所以我说又来了个同胞啊 :D
啊真扛不住了……昨天就睡得晚,今天又搞到一点半了……
我真睡了……
@yode 啊,睡前最后一句。你那个关于.netlink的问题接收我那个Paste[]的答案吗?我下线了,你直接留言就好……
 
晚安 :)
 
5:43 PM
@xzczd 我建议放comment里,因为跟主题不是很一致,但能提供信息
可惜我了那么用心的答案,那么壮观,居然没人upvote~哈
 
哪个问题?我帮顶一下
 
0
A: How to make a get image by a NETObject

yodeDone Needs["NETLink`"]; InstallNET[]; LoadNETType /@ {"System.Windows.Forms.Clipboard", "System.Drawing.Rectangle", "System.Drawing.Imaging.ImageLockMode", "System.Runtime.InteropServices.Marshal"}; img = Clipboard`GetImage[]; width = img[Width]; height = img[Height]; lock = img[ Lock...

不过我很多用心的答案SE都不怎么赏脸。Orz...
 
是的啊,我经常花几天写个答案也没什么赞
 
然而这种回答却捞了20个,我都有点不好意思了。。
 
不过我觉得写答案对于我的主要作用还是逼迫自己去把问题搞清楚
 
5:47 PM
常年在[differential-equations]下杯具的某笑而不语
真真睡了。
 
晚安:)
 
哈哈,晚安,各位~
 

  last day (35 days later) »