在Smalltalk中,系统浏览器是几乎任何东西的核心工具.Glamour似乎是使用声明性脚本语言构建通用浏览器的软件包.从论文中可以看到VisualWorks和Pharo,但我在这里只讨论Pharo版本.
除了Glamour相对于旧方法的技术优势之外,对于OmniBrowser的支持似乎在2011/2012年停止.所以从2009年开始的Glamour可能是OmniBrowser的合理继承者.但是有一个令人惊讶的惊喜:另一个"浏览器项目"被创建,它被称为Nautilus.
可能是因为开发人员注意到作为浏览器实现框架和类浏览器很难维护,OmniBrowser在Glamour中被"拆分"用于浏览器框架和Nautilus for Smalltalk Class Browsing.引自Nautilus chpater:"它的目的是浏览RPackage,与RB重构引擎兼容,具有环境意识并与公告合作"
我想解析
'This,is,an,example,text'
Run Code Online (Sandbox Code Playgroud)
就像在findTokens中一样
'This,is,an,example,text' findTokens: $,
an OrderedCollection('This' 'is' 'an' 'example' 'text')
Run Code Online (Sandbox Code Playgroud)
但无法弄清楚怎么用PetitParser,delimitedBy:和separatedBy:没有帮助我,我尝试过
( #any asParser delimitedBy: $, asParser ) plus flatten parse: 'This,is,an,example,text'
Run Code Online (Sandbox Code Playgroud)
但显然没有用
最近在线发布了一个Spec文档,它与Polymorph项目有什么关系?阅读这些项目的未来会很高兴.Polymorph是否已停产?
我已经克隆了 VM 并为我的平台安装了所有依赖项。现在我有点困惑,因为一些指南建议应该开始 Pharo 图像来生成从俚语翻译的 C 源代码。
"Unix"
PharoVMBuilder buildUnix32.
"OSX"
PharoVMBuilder buildMacOSX32.
"Windows"
PharoVMBuilder buildWin32.
Run Code Online (Sandbox Code Playgroud)
但是,当您无法在您的平台中启动 VM 时,您如何生成 VM?这听起来像鸡和蛋的问题。
这意味着如果您无法在该平台上启动映像,则无法构建 VM?
似乎Smalltalk实现错过了一个算法,该算法返回String中子字符串的所有索引.最相似的只返回一个元素的索引,例如:firstIndexesOf:in:,findSubstring:,findAnySubstring:variants.
Ruby中有实现,但第一个依赖于Ruby hack,第二个不能忽略重叠的字符串,最后一个使用Enumerator类,我不知道如何转换为Smalltalk.我想知道这个Python实现是否是最好的开始路径,因为考虑两种情况,重叠或不重叠,并且不使用正则表达式.
我的目标是找到一个提供以下行为的包或方法:
'ABDCDEFBDAC' indicesOf: 'BD'. "#(2 8)"
Run Code Online (Sandbox Code Playgroud)
考虑重叠时:
'nnnn' indicesOf: 'nn' overlapping: true. "#(0 2)"
Run Code Online (Sandbox Code Playgroud)
不考虑重叠时:
'nnnn' indicesOf 'nn' overlapping: false. "#(0 1 2)"
Run Code Online (Sandbox Code Playgroud)
在Pharo中,当在Playground中选择文本时,扫描程序会检测子字符串并突出显示匹配项.但是我找不到这个的String实现.
到目前为止,我的最大努力导致了String(Pharo 6)中的这种实现:
indicesOfSubstring: subString
| indices i |
indices := OrderedCollection new: self size.
i := 0.
[ (i := self findString: subString startingAt: i + 1) > 0 ] whileTrue: [
indices addLast: i ].
^ indices
Run Code Online (Sandbox Code Playgroud) 我想使用重构浏览器以编程方式将实例变量添加到现有类:
| theClass className |
className := #MyClass.
theClass := (RBClass existingNamed: className)
model: (RBNamespace new classNamed: className; yourself);
yourself.
theClass addInstanceVariable: 'testIVar'
Run Code Online (Sandbox Code Playgroud)
但是这个类没有用新的实例变量修改,我错过了什么?
我想使用以下代码段在Pharo中生成组合:
| col |
col := Set new.
(0 to: 7) asArray
combinations: 5
atATimeDo: [ : combination | col add: combination ].
^ col
Run Code Online (Sandbox Code Playgroud)
我不知道我做错了什么,但总是导致重复相同的集合:
"a Set(#(7 7 7 7 7) #(7 7 7 7 7) #(7 7 7 7 7) #(7 7 7 7 7) #(7 7 7 7 7) #(7 7 7 7 7) #(7 7 7 7 7) #(7 7 7 7 7) #(7 7 7 7 7) #(7 7 7 7 7) #(7 7 7 …Run Code Online (Sandbox Code Playgroud) 我在Pharo Smalltalk中编写类,但我认为这个问题对其他Smalltalk实现有效.
我知道一种实现具有特定属性的实例的方法是为实例创建提供类方法,然后建议使用类创建方法.但是任何用户都知道可以随时使用new或basicNew.
我想到使new和basicNew无效引发异常,但这似乎是太过激烈的措施,有时我可能需要创建实例来调试.
是否有其他库或机制来强制执行这些特定属性?
一个以前的SO问题提出了有关这成语是在执行efficency方面更好的时间问题:
[ (var := exp) > 0 ] whileTrue: [ ... ]
Run Code Online (Sandbox Code Playgroud)
与
[ var := exp.
var > 0 ] whileTrue: [ ... ]
Run Code Online (Sandbox Code Playgroud)
直观地看,第一种形式似乎在执行期间更有效,因为它节省了一个额外的声明(第二种形式).在大多数Smalltalks中都是如此吗?
试着用两个愚蠢的基准测试:
| var acc |
var := 10000.
[ [ (var := var / 2) < 0 ] whileTrue: [ acc := acc + 1 ] ] bench.
| var acc |
var := 10000.
[ [ var := var / 2. var < 0 ] whileTrue: [ acc := acc + …Run Code Online (Sandbox Code Playgroud) smalltalk ×9
pharo ×8
visualworks ×4
squeak ×2
benchmarking ×1
collections ×1
combinations ×1
morphic ×1
oop ×1
parsing ×1
petitparser ×1
refactoring ×1
ruby ×1
string ×1