【问题标题】:Using extended classes in gst (GNU smalltalk)?在 gst (GNU smalltalk) 中使用扩展类?
【发布时间】:2016-08-31 11:55:46
【问题描述】:

这是this one 的后续问题。

假设我已经设法使用新方法“square”扩展了 Integer 类。现在我想用它。

从文件中调用新方法很简单:

Integer extend [
    square [
        | r |
        r := self * self.
        ^r
    ]
]

x := 5 square.
x printNl.

在这里,我可以在 bash 中调用 $ gst myprogram.st,它会打印 25。但是如果我想在 GNU smalltalk 应用程序中使用该方法怎么办?像这样:

$ gst
st> 5 square
25
st>

这可能与图像有关,我不确定。 This tutorial 说我可以编辑 ~/.st/kernel/Builtins.st 文件来编辑加载到内核中的文件,但我没有这样的文件。

【问题讨论】:

  • 我编辑了标题以表明问题是关于gst 并删除了bash 标签,因为这与bash 没有任何关系。
  • 如果该文件不存在,那么您可以直接创建它。虽然给出了链接,但您可能希望/需要将默认链接复制到那里并进行编辑,而不是创建一个空链接。
  • 不幸的是,GNU Smalltalk 没有FileLoader 方法,尽管我认为我读到他们正在考虑它。与此同时,我所做的是收集扩展并将它们放入package。然后您可以使用PackageLoader 加载类。如果我更改源,我使用Makefilegst-package 来重建包。正如您所说,另一种选择是将其保存为图像文件并在需要时重新加载图像文件。一旦你使用包进行设置,就很容易了。
  • 顺便说一句,在链接参考中,它建议您可以将square 方法缩短为square [ ^self * self ]。不需要额外的变量。

标签: smalltalk gnu-smalltalk


【解决方案1】:

我不会编辑加载到内核中的内容。为了详细说明我的评论,除了使用图像文件之外,将先前创建的文件加载到 GNU Smalltalk 环境中的一种方法是使用 packages

一个示例 package.xml 文件,它根据文档定义包,如下所示:

<package>
  <name>MyPackage</name>

  <!-- Include any prerequisite packages here, if you need them -->
  <prereq>PrequisitePackageName</prereq>

  <filein>Foo.st</filein>
  <filein>Bar.st</filein>
</package>

用于构建包的示例Makefile 可能如下所示:

# MyPackage makefile
#
PACKAGE_DIR = ~/.st
PACKAGE_SPEC = package.xml
PACKAGE_FILE = $(PACKAGE_DIR)/MyPackage.star
PACKAGE_SRC = \
        Foo.st \
        Bar.st

$(PACKAGE_FILE):        $(PACKAGE_SRC) $(PACKAGE_SPEC)
        gst-package -t ~/.st $(PACKAGE_SPEC)

在您的工作目录中包含Foo.stBar.st 的上述文件,您可以执行make,它将构建.star 包文件并将其放入~/.st(其中gst 将去寻找包裹作为第一个寻找的地方)。当你运行你的环境时,你可以使用PackageLoader来加载它:

$ gst
GNU Smalltalk ready

st> PackageLoader fileInPackage: 'MyPackage'
Loading package PrerequisitePackage
Loading package MyPackage
PackageLoader
st>

那么你就可以开始摇滚了……:)

【讨论】:

  • 似乎不起作用。我已经加载了包(我已经测试并确保是这种情况),但是一旦我调用st&gt; 5 square,我就会收到错误消息Object: 5 error: did not understand #square
  • 让我详细说明:$ make -> make: '/home/moss/.st/MyPackage.star' is up to date. $ gst -> GNU SmallTalkready st&gt; PackageLoader fileInPackage: 'MyPackage' -> [...] Loading package MyPackage [...] st&gt; 5 square -> Object: 5 error: did not understand #square
  • @Mossmyr 我这里没什么可说的。我需要知道MyPackage.star 里面有什么。我一直使用这种方法,它对我有用。我假设您的 PACKAGE_SRC 文件至少有一个文件可以执行 Integer extend [ square [ ...] ]?
  • @Mossmyr 我刚刚做了一个快速测试,完全按照我在回答中概述的方式进行,效果很好。在我的测试中,MyPackage 仅由一个文件构建,Ext.st 包含Integer extend [ square [ ... ] ]。更改 package.xmlMakefile 以反映它仅包含 Ext.st,以保持简单。
  • 我真的很蠢。我想应用它的类是它自己的类,而不是 Integer 的扩展。我忘了更改它...我现在已经接受了您的回答,感谢您的努力:)
猜你喜欢
  • 2020-06-27
  • 2017-02-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-04-30
  • 1970-01-01
相关资源
最近更新 更多