作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
Smalltalk 蓝皮书说编译器优化了 ifTrue:ifFalse:
和 friend 使用特殊的操作码,以避免创建闭包并对实际的 bool 对象进行动态调度。
如果我正确理解了这一点,那么:
o ifTrue: [ ^ 'yes' ] ifElse: [ ^ 'no' ]
push o
jump_if_false 1
return 'yes'
jump 2
1:
return 'no'
2:
o
,这将正常工作是
Boolean
,但我不明白如果不是会发生什么。毕竟编译器不知道是什么类型
o
是。它不能保证它是一个 bool 值。它甚至不知道
ifTrue:ifFalse:
方法具有传统的语义。
Fnord ifTrue: tb ifFalse: fb
"muhahaha"
tb value: self.
fb value: self and: 9.
^ 7
最佳答案
这是字节码(在我使用的方言中)
1 frameless prolog
2 load R with instance o ; o is an ivar in my code
4 test jump false 13
7 load R with literal 'yes'
9 return
10 jump 16
13 load R with literal 'no'
15 return
16 return self
cmp eax, false ; test jump false
jz @2
cmp eax, true
jz @1
call mustBeBoolean ; <--- here!
@1: mov eax, 'true'
ret
jmp @3 ; jump
@2: mov eax, 'no'
ret
@3: move eax, esi
ret
#ifTrue:ifFalse:
的接收者是否是 JIT 编译器(a.k.a. nativizer)是否为 bool 值。更准确地说,
test jump false
的本土化字节码发出的代码将发送
mustBeBoolean
如果接收者不是 bool 值,则通知。
#ifTrue:ifFalse:
的实现如果发件人内联(显式) block 参数,则在另一个类中将不起作用,如下所示:
receiver ifTrue: ['yes'] ifFalse: ['no']
#mustBeBoolean
如果
receiver
是
Fnord
的一个实例(即使
receiver
理解
#ifTrue:ifFalse:
。)原因是,在这种情况下,编译器将优化
#ifTrue:ifFalse:
正如我们在上面看到的,而不是将其作为常规消息发送。
receiver ifTrue: [:a | <whatever>] ifFalse: [:a :b | <your code>]
fa := [:a | <whatever>].
fb := [:a :b | <yourcode>].
receiver ifTrue: fa ifFalse: fb
#ifTrue:ifFalse:
将被发送。
关于smalltalk - 优化 ifTrue :ifFalse: in Smalltalk,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32662354/
Smalltalk 蓝皮书说编译器优化了 ifTrue:ifFalse:和 friend 使用特殊的操作码,以避免创建闭包并对实际的 bool 对象进行动态调度。 如果我正确理解了这一点,那么: o
通常 Smalltalk 中的 if 看起来像这样 condition ifTrue: [ ... ] ifFalse: [ ... ]. 但是,我找不到是否允许省略其
a > b ifTrue:[ 'greater' ] ifFalse:[ 'less or equal' ] 我的理解是, bool a > b 接收消息 ifTrue:[ 'greater' ],然
在 Scala 中,我逐渐失去了 Java/C 以面向控制流的方式思考的习惯,并习惯于先获取我感兴趣的对象,然后通常应用类似 match 的东西。或 map()或 foreach()用于收藏。我非常喜
我是一名优秀的程序员,十分优秀!