7

我正在尝试通过实践来学习 Smalltalk,因此我通过构建一个简单的“Matrix”类来掌握语法和风格。

首先,如果链接到一个好的 Smalltak 教程(尽管这完全是可选的),我将不胜感激,最好是不涉及使用 GUI 的教程(我宁愿键入 my .sts 而不是在层次结构资源管理器中查找代替他们的方法)。

然后,在 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.
]

我怎么能做那种断言?

编辑:明确标记的问题。

4

10 回答 10

11

好的,这里有几块。

首先,我同意 markusQ,尽管我完全同情:我宁愿能够直接在 EMACS 中编写我的代码。关于 Smalltalk 的一件事是,对于不想以 Smalltalk 方式做事的人来说,它确实是非常无情的。在这种情况下,Smalltalk 方式是使用浏览器。

其次,这是 Smalltalk 方式的部分原因是 Smalltalk 在很多方面其他语言不同。实际上,实际上,没有办法制作“单独的” Smalltalk 可执行文件:您所能做的就是制作 Smalltalk 的图像,并添加一些您自己的代码的相对较小的片段。当您使用外部编辑器编写代码时,就像您展示的语法一样,您实际上只是手动键入一种比 XML 更容易手动键入的导入/导出格式。但只是有点。

道德是,使用浏览器以 Smalltalk 方式进行。

Smalltalk 有一些相当不错的教程。我通常使用 Squeak,所以我看到的都是使用 Squeak,就像这里一样。

在 TDD 上,您很幸运,因为 Smalltalk 是第一个获得 xUnit 的地方。对于 Smalltalk,它被称为 SUnit,这里有一个很好的教程

您在那里使用的断言似乎基本上是一种“按合同设计”的方法。已经完成了向 Smalltalk 添加合同设计的工作,如这里。对于简单的断言,您可以像在这个 SO question中一样添加代码。

assert: aBlock 
    "Throw an assertion error if aBlock does not evaluates to true."
    aBlock value
        ifFalse: [AssertionFailure signal: 'Assertion failed']
于 2009-03-22T07:07:18.077 回答
9

我不想这么说(因为您明确表示您不想听到它),但请进入 IDE。在不使用 IDE 的情况下尝试了解 smalltalk 就像去巴黎并在麦当劳吃饭一样。当然,你在巴黎,但你并没有真正让自己接触到这一切。

smalltalk 的关键在于它都是对象。一直向下(整数和字符都是对象)一直向上(类、方法、浏览器、IDE 本身)都是对象。如果您坚持与之抗争,那么您将拥有与想要通过拖放东西来学习如何编写 C 的人一样多的运气。

于 2009-03-22T05:57:31.693 回答
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 加载它,或者它是否是那里的基础的一部分,但它肯定是可用的。

于 2009-03-22T15:57:35.417 回答
3

除了请求教程之外,我在这里看不到任何问题。你能澄清一下你想知道什么吗?

可以在此问题中找到适合初学者的良好资源列表: https ://stackoverflow.com/questions/481976/is-there-a-dive-into-smalltalk-book

于 2009-03-22T05:54:21.590 回答
1

所以,关于断言,Squeak Smalltalk 已经带来了 Object>>assert: 所以,我想你可以这样做:

self assert: self isNotEmpty.
self assert: result dimensions equal: (self height)@(anotherMatrix width)

如果您使用的是 GNU smalltalk,这可能会回答如何在那里进行断言:Smalltalk 和断言

尼可

于 2009-03-22T17:20:21.537 回答
1

关于断言,请查看最近发布的另一个问题。

关于 TDD,是的,调用gst-sunit -f matrix.st -f matrix-test.st BaseMatrixTests是最好的方法。其他一切都建立在此之上,例如,这些可能是您的选择:

  • 使您的包的所有 TestCase 子类都继承自一个虚假的子类,以便您可以AllMatrixTests*在 gst-sunit 的命令行上说(当您添加更多测试时)。
  • 在 matrix-test.st 中的 matrix.st 文件中,因此消除了一个 -f 选项。
  • 创建一个 Makefile 和 package.xml 文件来为您的包创建一个 .star 文件,如此所述。然后你就可以做到了gst-sunit -pMatrix
于 2009-03-23T08:46:08.877 回答
1

上面已建议添加#assert:Object,但我会添加#assertBlockClosure(或[] classGNU Smalltalk 中的任何内容)。

assert
    this value ifFalse: [AssertionFailure signal: 'Assertion failed']

并因此使用

[ value notNil ] assert.
[ value > 0 ] assert.
[ list isEmpty not ] assert.

等等。

于 2009-03-23T12:16:13.850 回答
0

Smalltalk Primer是对Smalltalk 的面向消息编程基础的介绍

于 2009-03-22T18:33:35.947 回答
0

http://stores.lulu.com/store.php?fAcctID=2748699(您也可以找到下载 pdf 的链接)

于 2009-12-24T16:11:52.593 回答
0

我宁愿键入我的 .sts 而不是在层次结构浏览器中寻找方法将方法放在它们的位置)。

你现在这么说,我也有同样的感觉,直到我花时间学习如何使用这些工具。

我是作为 Vim 的当前用户和 Emacs 的前用户这样说的。现在我已经学会了使用 Pharo 中的类浏览器和其他工具,我真的变得非常有效率。

话虽如此,如果您真的想走自己的路,GNU Smalltalk 是您的正确选择。

我想在这一点上指出,至少 Pharo 有一个 Matrix 类,你可以用它来获得灵感。吱吱声也应该。也许您会了解类浏览器检查 Matrix 有多么有用。;)

于 2011-08-16T03:53:51.683 回答