我正在努力学习Smalltalk,所以我通过建立一个简单的“Matrix”类来掌握语法和风格。
首先,如果链接到一个好的Smalltak教程(尽管这完全是可选的),我将不胜感激,最好不要使用GUI(我宁愿输入我的.st
s而不是层次结构探索器周围的鱼将方法放在他们的位置)。
然后,在TDD上:对于这个项目,我正在调用gst-sunit -f matrix.st -f matrix-test.st BaseMatrixTests
,并且肯定会有更好的方法。 有吗?
最后,关于断言:我正在尝试编写一个方法并将断言置于其中,例如:
Matrix>>multiplyBy: anotherMatrix [
[ self isNotEmpty ] assert.
"Do Multiplication"
[ result dimensions = (self height)@(anotherMatrix width) ] assert.
]
我该怎么做这种断言?
编辑:明确标出的问题。
答案 0 :(得分:11)
好的,这里有几件。
首先,我同意markusQ,虽然我完全同情:我宁愿能够直接在EMACS中编写我的代码。关于Smalltalk的一个问题是,对于那些不想做Smalltalk Way事情的人来说真的是非常无情。在这种情况下,Smalltalk方式是使用浏览器。
其次,这就是Smalltalk方式的部分原因是,Smalltalk在很多方面都不像其他语言 。实际上,实际上没有办法制作一个“单独的”Smalltalk可执行文件:你所能做的只是创建一个Smalltalk的图像,并添加一些相对较小的自己代码片段。当你使用外部编辑器编写代码时就像你展示的语法一样,你只需要手工输入一种导入/导出格式,这种格式比XML更容易手动输入。但只是有点。
道德是,用浏览器做Smalltalk方式。
有一些关于Smalltalk的相当不错的教程。我经常使用Squeak,所以我看到的是使用Squeak,here。
在TDD上,你很幸运,因为Smalltalk是第一个获得xUnit的地方。对于Smalltalk,它叫做SUnit,有一个很好的教程here。
你在那里使用断言似乎基本上是“按合同设计”的方法。已经完成了通过合同向Smalltalk添加设计的工作,here。对于简单断言,您可以像this SO question中一样添加代码。
assert: aBlock
"Throw an assertion error if aBlock does not evaluates to true."
aBlock value
ifFalse: [AssertionFailure signal: 'Assertion failed']
答案 1 :(得分:9)
我讨厌说(因为你明确表示你不想听),但进入IDE。试图在不使用IDE的情况下让你的头脑转向smalltalk,就像去巴黎吃麦当劳一样。当然,你在巴黎,但你并没有真正让自己暴露于它的全部。
关于smalltalk的关键是它是所有对象。一直向下(整数和字符是对象)和一直向上(类,方法,浏览器,IDE本身)是所有对象。如果你坚持打击它,你将获得与想要学习如何通过拖放来写C的运气一样多的运气。
答案 2 :(得分:6)
如果您下载了Cincom Smalltalk Non-Commercial,则有许多在线教程。从这里开始:
http://www.cincomsmalltalk.com/userblogs/cincom/blogView?content=tutorials
如果你下载了Squeak,请从这里开始:
http://wiki.squeak.org/squeak/792
是的,您确实需要使用IDE与Smalltalk一起有效地工作。
在测试时,加载SUnit。在Cincom Smalltalk中,它是一个可加载的组件;我已经介绍了在上面链接的视频教程中加载(和使用)它。我不完全确定如何为Squeak加载它,或者它是否是它的基础的一部分,但它肯定可用于它。
答案 3 :(得分:3)
除了教程请求之外,我在这里没有看到任何问题。你能澄清一下你想知道的是什么吗?
在这个问题中可以找到一个很好的初学者资源列表:https://stackoverflow.com/questions/481976/is-there-a-dive-into-smalltalk-book
答案 4 :(得分:1)
所以,关于断言,Squeak Smalltalk已经带来了对象>>断言: 所以,我想你可以做到:
self assert: self isNotEmpty.
self assert: result dimensions equal: (self height)@(anotherMatrix width)
如果您正在使用GNU smalltalk,这可能会回答如何在那里进行断言:Smalltalk and Assertions
尼科
答案 5 :(得分:1)
关于断言,请查看最近发布的另一个问题。
关于TDD,是的,调用gst-sunit -f matrix.st -f matrix-test.st BaseMatrixTests
是最好的方法。其他所有东西都建立在这一点上,例如,这些可能是替代方案:
AllMatrixTests*
(当你添加更多的测试时)。gst-sunit -pMatrix
。答案 6 :(得分:1)
上面已建议将#assert:
添加到Object
,而是将#assert
添加到BlockClosure
(或GNU中[] class
的任何内容Smalltalk中)。
assert
this value ifFalse: [AssertionFailure signal: 'Assertion failed']
因此在
中使用[ value notNil ] assert.
[ value > 0 ] assert.
[ list isEmpty not ] assert.
等等。
答案 7 :(得分:0)
Smalltalk Primer介绍使用Smalltalk进行面向消息的编程要点
答案 8 :(得分:0)
http://stores.lulu.com/store.php?fAcctID=2748699(您还可以找到下载pdf的链接)
答案 9 :(得分:0)
我宁愿输入我的.sts而不是在层次结构浏览器周围钓鱼,以便将方法放在适当的位置。)
你现在这么说,直到我花了一些时间学习如何使用这些工具,我才有同感。
我说这是Vim的当前用户和Emacs的前用户。我现在已经学习了绳索,现在我已经非常有效地使用Pharo中的类浏览器和其他工具了。
话虽如此,如果您真的想按照自己的方式行事,GNU Smalltalk是您的正确选择。
我想在这一点上指出,至少Pharo有一个Matrix类,你可以用它作为灵感。吱吱也应该。也许您将了解类浏览器检查Matrix的有用程度。 ;)