【问题标题】:What is the correct way to define and call functions in GNU Smalltalk?在 GNU Smalltalk 中定义和调用函数的正确方法是什么?
【发布时间】:2013-06-22 20:57:25
【问题描述】:
Transcript show: 'Derp'.

printSomething: 'Derpy'.

"The method above produced this error:"
"prog.st:3: expected expression"

printSomething: what
    10 timesRepeat: [
        Transcript show:what.
        Transcript cr.
    ].

我现在正在尝试自学 Smalltalk,但我仍然不知道如何调用我编写的函数。我尝试使用语句printSomething: 'Derpy'. 调用带有参数'Derpy' 的函数printSomething,但它没有调用该函数,而是产生了以下错误:prog.st:3: expected expression

我在这里做错了什么,在 Smalltalk 中调用带参数的函数的正确方法是什么?到目前为止,我读过的教程都没有回答我的问题,我还是有点困惑。

【问题讨论】:

  • 您的代码中有大小写错误。方法名有一个大写的 P,但你试图用小写的 p 来调用它。
  • @fzwo 尽管如此,即使纠正了大写错误,也会产生相同的错误。我还没有弄清楚 Smalltalk 函数调用的正确语法。
  • 下次添加一个标签,说明您使用的是哪个 Smalltalk。 GNU Smalltalk 和 Squeak/Pharo 在处理源代码方面的工作方式截然不同。

标签: smalltalk gnu-smalltalk


【解决方案1】:

我怀疑你的错误是双重的:

Object class: #Example [
    instanceVariableNames: ''
    classVariableNames: ''
    poolDictionaries: ''
    category: 'Smalltalk Examples'
]

Example class extend [
    printSomething: what
        10 timesRepeat: [
            Transcript show:what.
        ]
]

Eval [
    Transcript show: 'Derp'.
    (Example new) printSomething: 'Derpy'.
]

注意Eval [] 块,并且您创建了Example 的实例,而不是NameOfSubclass

【讨论】:

  • 此答案与 Smalltalk 的哪些方言有关?
  • GNU Smalltalk,与 OP 链接到的代码的语法相匹配。
【解决方案2】:

Smalltalk 是一种纯面向对象的语言。您只能向对象发送消息,该对象调用在其类中定义的方法。

您在哪个类上定义了 printSomething?如果将其定义为实例方法,则需要在该类的实例上调用它。例如:

MyClass new printSomething: 'Derpy'

如果您将其定义为类方法,则可以将其直接发送给类本身。

【讨论】:

  • 也许可以查看 Pharo Smalltalk 和优秀的在线书籍:www.pharo-project.org。这可能对您有更多帮助,尤其是对于学习 Smalltalk 的一般性知识。
【解决方案3】:

你在哪个类中定义了方法?您没有指定要向哪个类发送消息(告诉它执行该方法)。

Transcript show: 'Derp'. 的情况下,您正在向全局变量Transcript(Stream 类的一个实例)发送消息,而show: 是在Transcript 或其一个上实现的类方法超类。

如果方法是在您发送的同一类上定义的,self 是要使用的关键字,所以它应该是 self printSomething: 'Derpy'.

【讨论】:

  • 我没有在类中定义方法:Smalltalk中的所有方法都必须在类中定义吗?
  • 那么你在哪里/如何定义它?我有点生疏,不同的 Smalltalk 环境做某些事情(比如在工作区中定义东西)不同,但总的来说,Smalltalk 非常非常面向对象。
  • 您不能在 Smalltalk 中定义函数,只能定义方法。另外:Transcript 不是一个类,而是一个包含 Stream 类实例的全局变量。
  • @JohanB 谢谢,我已将答案编辑为正确的 WRT 成绩单。
  • @AndersonGreen 我不知道如何在 ideone 中创建或编辑类,抱歉。正如 Johan 所说,在 Smalltalk 中无法定义函数,因此如果您无法在 IDE 中创建或编辑类,则无法创建方法。我想在这种情况下,ideone 对于超出在预先存在的类的实例上调用方法的任何东西都不是很好(所有其他面向对象的语言也是如此,除了它们中的大多数不是严格/干净的对象- 面向 Smalltalk,并允许使用函数)。
【解决方案4】:

尝试学习 smalltalk 时,请使用 smalltalk 环境。不要使用命令行界面,不要使用在线网络工具。两者都非常有用,但不适合学习smalltalk。他们没有提供您需要的反馈来快速学习 smalltalk。 如果它不允许你在调试器中编写大部分代码,你就不会学习 smalltalk。

为学习smalltalk而开发的书籍和环境是Pharo By Example。从那里使用图像和虚拟机。 Pharo 正在快速发展,使用更新的版本会令人困惑。

【讨论】:

  • 对于 GNU Smalltalk,命令行界面一个 Smalltalk 环境! (这是一个 REPL。)
  • 是的。所以不要用它来学习 smalltalk。我也不推荐 topaz 来学习 smalltalk。或 Amber(不过。现在随时都可以使用调试器)。
【解决方案5】:

在 gnu-smalltalk 3.2.5 中。

Object subclass: Example [
    printSomething: what
    [
        10 timesRepeat: [
            Transcript show:what.
        ]
    ]
]

Eval [
    Transcript show: 'Derp'.
    (Example new) printSomething: 'Derpy'.
]

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-06-18
    • 1970-01-01
    • 2021-07-18
    • 2023-04-05
    • 2019-07-16
    • 1970-01-01
    • 2017-02-12
    相关资源
    最近更新 更多