我的应用程序有很多活动,也使用本机库.使用Eclipse生成的默认ProGuard配置ProGuard删除了很多东西--OnClick方法,静态成员,我的本机库使用的回调方法......是否有一种简单的方法来指示ProGuard不从我的包中删除任何东西?删除东西只能节省大约2.5%的应用程序大小,但会完全破坏我的应用程序.在ProGuard配置中逐类配置,测试和维护它将是一件痛苦的事.
考虑类中的以下方法Juicer:
Juicer >> juiceOf: aString
| fruit juice |
fruit := self gather: aString.
juice := self extractJuiceFrom: fruit.
^juice withoutSeeds
Run Code Online (Sandbox Code Playgroud)
它生成以下字节码
25 self ; 1
26 pushTemp: 0 ; 2
27 send: gather:
28 popIntoTemp: 1 ; 3
29 self ; 4
30 pushTemp: 1 ; 5
31 send: extractJuiceFrom:
32 popIntoTemp: 2 ; 6 <-
33 pushTemp: 2 ; 7 <-
34 send: withoutSeeds
35 returnTop
Run Code Online (Sandbox Code Playgroud)
现在请注意,32和33取消了:
25 self ; 1
26 pushTemp: 0 ; 2 …Run Code Online (Sandbox Code Playgroud) 我想使用Smalltalk(Pharo)来更好地重构我的图像处理和用其他语言编写的计算机视觉代码/算法.我没有在网上找到很多使用Smalltalk处理图像(或视频帧)的例子.我想知道是否
i)有一个opencv /图像/计算机视觉库可用于Smalltalk,易于安装或
ii)有人可以举例说明如何访问图像中的像素数据并使用Smalltalk对其进行阈值处理.
我正在开发一个应用程序,我有一个圆心和半径,我在Leaflet的帮助下绘制圆圈.
我在圆周的最北端放置了一个标记,使其可以拖动.
var circle = L.circle(coords, radius).addTo(map);
convertRadiusToLatitude = parseInt(response.radius)/111111;
var coordsOnRadius = [parseFloat(response.lat) + convertRadiusToLatitude, parseFloat(response.long)];
var markerOnRadius = L.marker(coordsOnRadius, {draggable: true}).addTo(map);
Run Code Online (Sandbox Code Playgroud)
现在,这将标记添加到圆周,现在我希望它只能在我使用参数方程的圆周上拖动.
参数方程
x = Xc + R * cos(theta)
y = Yc + R * sin(theta)
Run Code Online (Sandbox Code Playgroud)
拖动代码
markerOnRadius.on('drag', function(e){
bearing = marker.getLatLng().bearingTo(markerOnRadius.getLatLng());
var markerOnRadiusX = parseFloat(response.lat) + ((0.000009 * parseFloat(response.radius)) * Math.cos( toRad(bearing) ));
var markerOnRadiusY = parseFloat(response.long) + ((0.000009 * parseFloat(response.radius)) * Math.sin( toRad(bearing) ));
markerOnRadius.setLatLng([markerOnRadiusX, markerOnRadiusY]);
});
Run Code Online (Sandbox Code Playgroud)
该bearingTo方法:
L.LatLng.prototype.bearingTo = function(other) {
var …Run Code Online (Sandbox Code Playgroud) 假设我们有以下方法序列:
m1
self m2: [^1]
m2: block
self m3: block.
Processor := nil "crash!"
m3: block
[block value] ensure: [^2]
Run Code Online (Sandbox Code Playgroud)
问题是什么是价值anObject m1?
换句话说,语义是否被[ˆ2]定义为一个确定的块?有两种可能性:
m1将返回1.请注意,我不会问会发生什么.我对执行流程的定义很感兴趣.
编辑
COROLLARY 1(Lukas在下面的回答中证实):编程风格不是很好!
在2001 年的一篇非常有趣的文章中,Allen Wirfs-Brock解释了如何在不重新启动(本机)堆栈的情况下实现块闭包.
从他揭露的许多想法出发,有一个我不太了解的想法,我认为在这里提出这个想法是个好主意.他说:
在块的生命周期中永远不能分配的任何变量(例如,封闭方法和块的参数)不需要放在环境中,而是在创建变量时将变量的副本放在闭包中
有两件事我不确定我是否理解得很好:
问题1必须有另一个原因.否则我没有看到增益(与实施优化的成本相比.)
对于问题2,取一个在方法中而不是在块中分配的非参数.为什么存储在堆栈中的oop在块的生命周期内保持不变?
我想我知道Q2的答案:因为块的执行不能与方法的执行交织在一起,即,当块存在时,封闭的上下文不会运行.但是,当块处于活动状态时,是否有任何方法可以临时修改堆栈?
今天我在Pharo中了解到执行:
[v := 1] ensure: [self halt. v := 2]
Run Code Online (Sandbox Code Playgroud)
v = 2,即使我们在halt窗口放弃过程(!),也会结束设置.
我发现这个值得商榷.对我来说,语义#ensure:意味着序列
self halt. v := 2
Run Code Online (Sandbox Code Playgroud)
必须执行,无论接收器块的情况如何,都不管参数块的逻辑如何.由于逻辑#halt包括终止过程的事件,我发现它对第二句的顽固评价具有侵扰性.
接下来我尝试了以下内容:
[v := 1] ensure: [1 / 0. v := 2]
Run Code Online (Sandbox Code Playgroud)
当ZeroDivide异常弹起我关上了调试器,仍然值v是2(同用#halt.)
最后,我评估了:
[v := 1] ensure: [n := 1 / 0. v := v + n]
Run Code Online (Sandbox Code Playgroud)
并在ZeroDivide异常上关闭调试器.这次的价值v是,1但我v + n无法评估无法评估的事实.换句话说,错误继续无声.
所以我的问题是.这种行为背后的理性是什么?该过程是否应该在"正常"情况下终止,即没有#ensure:涉及?
我是GNU Smalltalk的新手.我知道在大多数编程语言中,有一个import/ #include/ require命令可以让一个源文件访问另一个源文件的内容.我的问题是,如何在GNU Smalltalk中将一个文件导入另一个文件?任何帮助,将不胜感激.谢谢!
假设我有一个像这样的多行语句:
1 to: 5 do: [:i|
Transcript show: i.
Transcript cr].
Run Code Online (Sandbox Code Playgroud)
目前,当我将文本光标放在某行上(不选择任何内容)并按 Cmd+d 时,Pharo 会尝试执行当前行。但如果默认情况下(当没有选择任何内容时)Pharo 会执行当前语句(即所有这三行语句),而不仅仅是当前行,这对我来说会更方便。因为这是比“我想执行语句内的这一特定行”更常见的情况(“我想执行整个语句”)(在大多数情况下,这在语法上没有意义,因为第一行和第三行这里)。在这些后面的情况下(当我需要在语句中执行一行时)我会手动预先选择该行。
我怎样才能实现这个目标?
I'm implementing a Pascal parser from this EBNF defintion. There is something I don't understand in the following specifications:
variable
entire-variable | component-variable | referenced-variable
entire-variable
variable-identifier | field-identifier
component-variable
indexed-variable | field-designator | file-buffer
field-designator
record-variable "." field-identifier
Run Code Online (Sandbox Code Playgroud)
Assume we want to apply the variable production on a.b[0]. Since a conforms to the entire-variable production, this will prevent component-variable from detecting the field-designator a.b and therefore the . following a will stop the parser.