<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="zh">
	<id>https://arolstar52-zhtest.hf.space/index.php?action=history&amp;feed=atom&amp;title=GNU_Smalltalk</id>
	<title>GNU Smalltalk - 版本历史</title>
	<link rel="self" type="application/atom+xml" href="https://arolstar52-zhtest.hf.space/index.php?action=history&amp;feed=atom&amp;title=GNU_Smalltalk"/>
	<link rel="alternate" type="text/html" href="https://arolstar52-zhtest.hf.space/index.php?title=GNU_Smalltalk&amp;action=history"/>
	<updated>2026-07-13T19:17:15Z</updated>
	<subtitle>本wiki上该页面的版本历史</subtitle>
	<generator>MediaWiki 1.43.9</generator>
	<entry>
		<id>https://arolstar52-zhtest.hf.space/index.php?title=GNU_Smalltalk&amp;diff=3923351&amp;oldid=prev</id>
		<title>2025年12月26日 (五) 18:08 imported&gt;ExultantEditor</title>
		<link rel="alternate" type="text/html" href="https://arolstar52-zhtest.hf.space/index.php?title=GNU_Smalltalk&amp;diff=3923351&amp;oldid=prev"/>
		<updated>2025-12-26T18:08:02Z</updated>

		<summary type="html">&lt;p&gt;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;新页面&lt;/b&gt;&lt;/p&gt;&lt;div&gt;{{Infobox programming language&lt;br /&gt;
| name = GNU Smalltalk&lt;br /&gt;
| logo = GNU Smalltalk logo.svg&lt;br /&gt;
| logo size = 160px&lt;br /&gt;
| screenshot = &lt;br /&gt;
| caption = &lt;br /&gt;
| designer               = &lt;br /&gt;
| developer              = Steve Byrne（直到1.1.5）,&amp;lt;br/&amp;gt;Paolo Bonzini（自从1.6）&amp;lt;ref&amp;gt;{{cite web|url=https://github.com/bonzini/smalltalk/blob/master/AUTHORS|title=AUTHORS|access-date=2022-02-10|archive-date=2022-03-18|archive-url=https://web.archive.org/web/20220318225600/https://github.com/bonzini/smalltalk/blob/master/AUTHORS}}&amp;lt;/ref&amp;gt;&lt;br /&gt;
| released = {{Start date and age|mf=yes|2003|01|12}}&lt;br /&gt;
| latest_release_version = 3.2.5&amp;lt;ref&amp;gt;{{cite web|url=https://git.savannah.gnu.org/cgit/smalltalk.git/log/?h=stable-3.2|title=index : smalltalk.git|access-date=2022-02-10|archive-date=2022-03-07|archive-url=https://web.archive.org/web/20220307080012/https://git.savannah.gnu.org/cgit/smalltalk.git/log/?h=stable-3.2}}&amp;lt;/ref&amp;gt;&lt;br /&gt;
| latest_release_date = {{Release date and age|2013|03|04}}&lt;br /&gt;
| latest_preview_version = &lt;br /&gt;
| latest_preview_date = &lt;br /&gt;
| paradigm = [[面向对象程序设计|面向对象]], [[脚本语言#动态语言|脚本]]&lt;br /&gt;
| operating_system = [[Unix]]（[[Linux]], [[Cygwin]], [[Mac OS X]]/[[Darwin (操作系统)|Darwin]]）&lt;br /&gt;
| platform = &lt;br /&gt;
| family = [[Smalltalk]]&lt;br /&gt;
| influenced = [[Smalltalk|ANSI Smalltalk]]&lt;br /&gt;
| file ext = .st&lt;br /&gt;
| license = [[GNU General Public License|GPL]]（针对虚拟机） + [[GNU Lesser General Public License|LGPL]]（针对类库和映像）&lt;br /&gt;
| website = [https://www.gnu.org/software/smalltalk/ https://www.gnu.org/software/smalltalk/]&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;GNU Smalltalk&amp;#039;&amp;#039;&amp;#039;是[[Smalltalk]][[编程语言]]的[[GNU计划]]实现。&lt;br /&gt;
&lt;br /&gt;
这个实现不同于其他Smalltalk环境，使用文本文件作为程序输入，并将其内容解释为Smalltalk代码&amp;lt;ref&amp;gt;{{cite web|url=https://www.gnu.org/software/smalltalk/manual/gst.html#Syntax|title=Syntax of GNU Smalltalk|access-date=2022-02-09|archive-date=2022-02-18|archive-url=https://web.archive.org/web/20220218214218/https://www.gnu.org/software/smalltalk/manual/gst.html#Syntax}}&amp;lt;/ref&amp;gt;。在这种方式下，GNU Smalltalk表现得更像是一种解释器，而非传统Smalltalk方式下的一种环境&amp;lt;ref&amp;gt;{{cite web|url=http://www.canol.info/books/computer_programming_using_gnu_smalltalk/|title=Computer Programming using GNU Smalltalk|access-date=2022-02-09|archive-date=2022-04-06|archive-url=https://web.archive.org/web/20220406043923/http://www.canol.info/books/computer_programming_using_gnu_smalltalk/}}&amp;lt;/ref&amp;gt;。GNU Smalltalk包括了对很多自由软件库的[[绑定]]，包括[[SQLite]]、[[SDL|libSDL]]、[[cairo]]、[[gettext]]和{{le|Expat (库)|Expat (library)|Expat}}等&amp;lt;ref&amp;gt;{{cite web|url=https://www.gnu.org/software/smalltalk/manual/gst.html#Packages|title=Packages|access-date=2022-02-09|archive-date=2022-02-18|archive-url=https://web.archive.org/web/20220218214218/https://www.gnu.org/software/smalltalk/manual/gst.html#Packages}}&amp;lt;/ref&amp;gt;。&lt;br /&gt;
&lt;br /&gt;
==简单例子==&lt;br /&gt;
下面的例子可工作在GNU Smalltalk 3.0和以后版本上。经典的[[Hello World|Hello, World!]]例子：&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;smalltalk&amp;quot;&amp;gt;&lt;br /&gt;
&amp;#039;Hello, World!&amp;#039; displayNl&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
GNU Smalltalk声明了三个文件：&amp;lt;code&amp;gt;stdin&amp;lt;/code&amp;gt;、&amp;lt;code&amp;gt;stdout&amp;lt;/code&amp;gt;和&amp;lt;code&amp;gt;stderr&amp;lt;/code&amp;gt;，作为文件串流类（&amp;lt;code&amp;gt;FileStream&amp;lt;/code&amp;gt;）的全局实例，并绑定了适合传递给C虚拟机的值。对象类（&amp;lt;code&amp;gt;Object&amp;lt;/code&amp;gt;）定义了特有于GNU Smalltalk的四个方法：&amp;lt;code&amp;gt;print&amp;lt;/code&amp;gt;、&amp;lt;code&amp;gt;printNl&amp;lt;/code&amp;gt;、&amp;lt;code&amp;gt;store&amp;lt;/code&amp;gt;和&amp;lt;code&amp;gt;storeNl&amp;lt;/code&amp;gt;。它们对接收者做一次&amp;lt;code&amp;gt;printOn:&amp;lt;/code&amp;gt;或&amp;lt;code&amp;gt;storeOn:&amp;lt;/code&amp;gt;至&amp;lt;code&amp;gt;Transcript&amp;lt;/code&amp;gt;对象。这个对象是文本搜集器类（&amp;lt;code&amp;gt;TextCollector&amp;lt;/code&amp;gt;）的唯一实例，它通常将写操作委托给&amp;lt;code&amp;gt;stdout&amp;lt;/code&amp;gt;。 &lt;br /&gt;
&lt;br /&gt;
一些基本的Smalltalk代码：&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;smalltalk&amp;quot;&amp;gt;&lt;br /&gt;
&amp;quot;所有东西，包括一个文字，都是一个对象，所以如下可行:&amp;quot;&lt;br /&gt;
-199 abs.                                               &amp;quot;199&amp;quot;&lt;br /&gt;
&amp;#039;gst is cool&amp;#039; size.                                     &amp;quot;11&amp;quot;&lt;br /&gt;
&amp;#039;Slick&amp;#039; indexOf: $c.                                    &amp;quot;4&amp;quot;&lt;br /&gt;
&amp;#039;Nice Day Isn&amp;#039;&amp;#039;t It?&amp;#039; asLowercase asSet asSortedCollection asString &amp;quot;&amp;#039; &amp;#039;&amp;#039;?acdeinsty&amp;#039;&amp;quot;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
两个&amp;lt;code&amp;gt;&amp;quot;&amp;lt;/code&amp;gt;包围的是注释；&amp;lt;code&amp;gt;$c&amp;lt;/code&amp;gt;是字符常量&amp;lt;code&amp;gt;c&amp;lt;/code&amp;gt;；两个&amp;lt;code&amp;gt;&amp;#039;&amp;lt;/code&amp;gt;包围的是字符串，字符串中的&amp;lt;code&amp;gt;&amp;lt;nowiki&amp;gt;&amp;#039;&amp;#039;&amp;lt;/nowiki&amp;gt;&amp;lt;/code&amp;gt;是&amp;lt;code&amp;gt;&amp;#039;&amp;lt;/code&amp;gt;的[[转义序列]]。&lt;br /&gt;
&lt;br /&gt;
==搜集==&lt;br /&gt;
构造和使用一个[[数组]]：&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;smalltalk&amp;quot;&amp;gt;&lt;br /&gt;
a := #(1 &amp;#039;hi&amp;#039; 3.14e0 1 2 (4 5)).&lt;br /&gt;
&lt;br /&gt;
a at: 3.       &amp;quot;3.14&amp;quot;&lt;br /&gt;
a reverse.     &amp;quot;((4 5) 2 1 3.14 &amp;#039;hi&amp;#039; 1)&amp;quot;&lt;br /&gt;
a asSet        &amp;quot;Set(1 &amp;#039;hi&amp;#039; 3.14 2 (4 5))&amp;quot;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
构造和使用一个[[散列表]]，它是散列搜集类（&amp;lt;code&amp;gt;HashedCollection&amp;lt;/code&amp;gt;）的子类即字典类（&amp;lt;code&amp;gt;Dictionary&amp;lt;/code&amp;gt;）的实例：&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;smalltalk&amp;quot;&amp;gt;&lt;br /&gt;
hash := Dictionary from: { &amp;#039;water&amp;#039; -&amp;gt; &amp;#039;wet&amp;#039;. &amp;#039;fire&amp;#039; -&amp;gt; &amp;#039;hot&amp;#039; }.&lt;br /&gt;
hash at: &amp;#039;fire&amp;#039;     &amp;quot;&amp;#039;hot&amp;#039;&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
hash keysAndValuesDo:&lt;br /&gt;
       [ :k :v | (&amp;#039;%1 is %2&amp;#039; % { k. v }) displayNl ].&lt;br /&gt;
&amp;quot;=&amp;gt; fire is hot&lt;br /&gt;
 =&amp;gt; water is wet&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&amp;quot;删除 &amp;#039;water&amp;#039; -&amp;gt; &amp;#039;wet&amp;#039;&amp;quot;&lt;br /&gt;
hash removeKey: &amp;#039;water&amp;#039;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
GNU Smalltalk在字符串类（&amp;lt;code&amp;gt;String&amp;lt;/code&amp;gt;），和作为它的超类的数组式搜集类（&amp;lt;code&amp;gt;ArrayedCollection&amp;lt;/code&amp;gt;）之间，又介入了特有的字符数组类（&amp;lt;code&amp;gt;CharacterArray&amp;lt;/code&amp;gt;），它的&amp;lt;code&amp;gt;%&amp;lt;/code&amp;gt;方法，将其接收者中具有的特殊[[转义序列]]，替换为由参数给出的搜集中的元素，其中&amp;lt;code&amp;gt;%n&amp;lt;/code&amp;gt;被替代为这个搜集的第&amp;lt;code&amp;gt;n&amp;lt;/code&amp;gt;个元素（&amp;lt;code&amp;gt;1 &amp;lt;= n &amp;lt;= 9&amp;lt;/code&amp;gt;或&amp;lt;code&amp;gt;A &amp;lt;= n &amp;lt;= Z&amp;lt;/code&amp;gt;）。这里给它的搜集，是在&amp;lt;code&amp;gt;{&amp;lt;/code&amp;gt;和&amp;lt;code&amp;gt;}&amp;lt;/code&amp;gt;之间包围的，当前Smalltalk变体一般都提供的动态数组，其中的元素可以在运行时间求值。&lt;br /&gt;
&lt;br /&gt;
==块和迭代器==&lt;br /&gt;
参数传递到是为[[闭包 (计算机科学)|闭包]]的一个块：&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;smalltalk&amp;quot;&amp;gt;&lt;br /&gt;
&amp;quot;remember被绑定到一个块.&amp;quot;&lt;br /&gt;
remember := [ :name | (&amp;#039;Hello, %1!&amp;#039; % { name }) displayNl ].&lt;br /&gt;
&lt;br /&gt;
&amp;quot;时机成熟时 -- 调用这个闭包!&amp;quot;&lt;br /&gt;
remember value: &amp;#039;world&amp;#039;&lt;br /&gt;
&amp;quot;=&amp;gt; Hello, world!&amp;quot;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
从一个方法返回由两个闭包构成的一个数组：&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;smalltalk&amp;quot;&amp;gt;&lt;br /&gt;
Integer extend [&lt;br /&gt;
    asClosure [&lt;br /&gt;
        | value |&lt;br /&gt;
        value := self.&lt;br /&gt;
        ^{ [ :x | value := x ]. [ value ] }&lt;br /&gt;
    ]&lt;br /&gt;
].&lt;br /&gt;
 &lt;br /&gt;
blocks := 10 asClosure.&lt;br /&gt;
setter := blocks first.&lt;br /&gt;
getter := blocks second.&lt;br /&gt;
getter value.       &amp;quot;10&amp;quot;&lt;br /&gt;
setter value: 21.   &amp;quot;21&amp;quot;&lt;br /&gt;
getter value        &amp;quot;21&amp;quot;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
这里用&amp;lt;code&amp;gt;extend&amp;lt;/code&amp;gt;为现存的类扩展新方法是GNU Smalltalk特有的语法。&lt;br /&gt;
&lt;br /&gt;
下面的[[考拉兹猜想]]例子，展示将两个块传递给接收者，并将结果信息发送回到调用者：&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;smalltalk&amp;quot;&amp;gt;&lt;br /&gt;
Integer extend [&lt;br /&gt;
    ifEven: evenBlock ifOdd: oddBlock [&lt;br /&gt;
        ^self even&lt;br /&gt;
            ifTrue: [ evenBlock value: self ]&lt;br /&gt;
            ifFalse: [ oddBlock value: self ]&lt;br /&gt;
    ]&lt;br /&gt;
].&lt;br /&gt;
&lt;br /&gt;
10 ifEven: [ :n | n / 2 ] ifOdd: [ :n | n * 3 + 1 ]    &amp;quot;5&amp;quot;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
搜集类（&amp;lt;code&amp;gt;Collection&amp;lt;/code&amp;gt;）的&amp;lt;code&amp;gt;collect:&amp;lt;/code&amp;gt;方法，将接收者的每个元素传递给一个块来求值，返回这些结果的搜集。这类似于[[函数式编程]]语言中[[map (高阶函数)|map]]函数。例如计算从&amp;lt;code&amp;gt;1&amp;lt;/code&amp;gt;到&amp;lt;code&amp;gt;10&amp;lt;/code&amp;gt;的平方：&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;smalltalk&amp;quot;&amp;gt;&lt;br /&gt;
(1 to: 10) collect: [ :x | x squared ] &amp;quot;(1 4 9 16 25 36 49 64 81 100 )&amp;quot;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
可迭代类（&amp;lt;code&amp;gt;Iterable&amp;lt;/code&amp;gt;）定义了由子类实现的&amp;lt;code&amp;gt;do:&amp;lt;/code&amp;gt;方法，将一个块[[迭代]]于接收者的每个元素之上。这也被称为[[迭代器#隐式迭代器|隐式迭代器]]。例如迭代于数组和区间之上：&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;smalltalk&amp;quot;&amp;gt;&lt;br /&gt;
array := #(1 &amp;#039;hi&amp;#039; 3.14e0).&lt;br /&gt;
array do: [ :item | item displayNl ].&lt;br /&gt;
&amp;quot;=&amp;gt; 1&amp;quot;&lt;br /&gt;
&amp;quot;=&amp;gt; hi&amp;quot;&lt;br /&gt;
&amp;quot;=&amp;gt; 3.14&amp;quot;&lt;br /&gt;
&lt;br /&gt;
(3 to: 6) do: [ :item | item displayNl ]&lt;br /&gt;
&amp;quot;=&amp;gt; 3&amp;quot;&lt;br /&gt;
&amp;quot;=&amp;gt; 4&amp;quot;&lt;br /&gt;
&amp;quot;=&amp;gt; 5&amp;quot;&lt;br /&gt;
&amp;quot;=&amp;gt; 6&amp;quot;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
可迭代类的&amp;lt;code&amp;gt;inject:into:&amp;lt;/code&amp;gt;方法，接受一个参数和一个块二者；它迭代于接收者的每个元素之上，在其上执行某个函数并保持结果为一个聚集。这类似于[[函数式编程]]语言中[[fold (高阶函数)|foldl]]函数。这个方法是凭借调用&amp;lt;code&amp;gt;do:&amp;lt;/code&amp;gt;方法实现的。例如：&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;smalltalk&amp;quot;&amp;gt;&lt;br /&gt;
#(1 3 5) inject: 10 into: [ :sum :element | sum + element ] &amp;quot;19&amp;quot;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
在第一个趟时，这个块接受&amp;lt;code&amp;gt;10&amp;lt;/code&amp;gt;（要注入的实际参数）作为&amp;lt;code&amp;gt;sum&amp;lt;/code&amp;gt; ，和&amp;lt;code&amp;gt;1&amp;lt;/code&amp;gt;（这个数组的第一个元素）作为元素，结果为&amp;lt;code&amp;gt;11&amp;lt;/code&amp;gt;。&amp;lt;code&amp;gt;11&amp;lt;/code&amp;gt;接着成为在下一趟时的&amp;lt;code&amp;gt;sum&amp;lt;/code&amp;gt;，这时向它加上&amp;lt;code&amp;gt;3&amp;lt;/code&amp;gt;得到&amp;lt;code&amp;gt;14&amp;lt;/code&amp;gt;。&amp;lt;code&amp;gt;14&amp;lt;/code&amp;gt;接着加上&amp;lt;code&amp;gt;5&amp;lt;/code&amp;gt;，最终返回&amp;lt;code&amp;gt;19&amp;lt;/code&amp;gt;。&lt;br /&gt;
&lt;br /&gt;
块可以和很多内建方法一起工作，下面例子向一个文件写一行文本，然后再读取它的每一行并显示：&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;smalltalk&amp;quot;&amp;gt;&lt;br /&gt;
(File name: &amp;#039;file.txt&amp;#039;) withWriteStreamDo:&lt;br /&gt;
    [ :file | file nextPutAll: &amp;#039;Wrote some text.&amp;#039;; nl ]&lt;br /&gt;
&lt;br /&gt;
(File name: &amp;#039;file.txt&amp;#039;) readStream linesDo:&lt;br /&gt;
    [ :each | each displayNl ] ; close&lt;br /&gt;
&amp;quot;=&amp;gt; Wrote some text.&amp;quot;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
文件类（&amp;lt;code&amp;gt;File&amp;lt;/code&amp;gt;）的特有于GNU Smalltalk的&amp;lt;code&amp;gt;name:&amp;lt;/code&amp;gt;方法，返回具有[[路径 (计算机科学)|绝对路径]]的文件名。GNU Smalltalk有特有的文件路径类（&amp;lt;code&amp;gt;FilePath&amp;lt;/code&amp;gt;），它的&amp;lt;code&amp;gt;withWriteStreamDo:&amp;lt;/code&amp;gt;方法，对接收者调用&amp;lt;code&amp;gt;writeStream&amp;lt;/code&amp;gt;方法打开一个只写的文件串流类（&amp;lt;code&amp;gt;FileStream&amp;lt;/code&amp;gt;）实例，在其上调用一个块，并在这个块的动态范围结束处保证（&amp;lt;code&amp;gt;ensure:&amp;lt;/code&amp;gt;）关闭这个串流；它的&amp;lt;code&amp;gt;readStream&amp;lt;/code&amp;gt;方法，在接收者上打开一个只读的文件串流类（&amp;lt;code&amp;gt;FileStream&amp;lt;/code&amp;gt;）实例。&lt;br /&gt;
&lt;br /&gt;
串流类（&amp;lt;code&amp;gt;Stream&amp;lt;/code&amp;gt;）的特有于GNU Smalltalk的&amp;lt;code&amp;gt;linesDo:&amp;lt;/code&amp;gt;方法，对它的接收者的每一行都求值它的参数块一次。 在GNU Smalltalk中，文件串流类（&amp;lt;code&amp;gt;FileStream&amp;lt;/code&amp;gt;）的超类，不再是作为可定位串流类（&amp;lt;code&amp;gt;PositionableStream&amp;lt;/code&amp;gt;）子类的读写串流类（&amp;lt;code&amp;gt;ReadWriteStream&amp;lt;/code&amp;gt;），而是其特有的作为串流类（&amp;lt;code&amp;gt;Stream&amp;lt;/code&amp;gt;）子类的文件描述符类（&amp;lt;code&amp;gt;FileDescriptor&amp;lt;/code&amp;gt;），它的&amp;lt;code&amp;gt;close&amp;lt;/code&amp;gt;方法关闭这个文件。&lt;br /&gt;
&lt;br /&gt;
==类==&lt;br /&gt;
&lt;br /&gt;
GNU Smalltalk建立新类采用特有的语法形式：&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;smalltalk&amp;quot;&amp;gt;&lt;br /&gt;
超类名字 subclass: 新类名字 [&lt;br /&gt;
    | 诸实例变量 |&lt;br /&gt;
    pragmas&lt;br /&gt;
    消息模式1 [ 诸语句 ]&lt;br /&gt;
    消息模式2 [ 诸语句 ]&lt;br /&gt;
    ...&lt;br /&gt;
    类变量1 := 表达式.&lt;br /&gt;
    类变量2 := 表达式.&lt;br /&gt;
    ...&lt;br /&gt;
]&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
类似的，为现存的类扩展新方法采用特有的语法形式：&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;smalltalk&amp;quot;&amp;gt;&lt;br /&gt;
类表达式 extend [&lt;br /&gt;
    ...&lt;br /&gt;
]&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
在Smalltalk有关书籍中有一个常见版式约定，将一个类中的方法引用为&amp;lt;code&amp;gt;类名字 &amp;gt;&amp;gt; 方法名字&amp;lt;/code&amp;gt;，这不是[[Squeak]]/[[Pharo]]语法的一部份，GNU Smalltalk将&amp;lt;code&amp;gt;类名字 class &amp;gt;&amp;gt; 方法名字&amp;lt;/code&amp;gt;作为定义类方法的语法形式。&lt;br /&gt;
&lt;br /&gt;
下面的代码定义叫做&amp;lt;code&amp;gt;Person&amp;lt;/code&amp;gt;的一个类，这个类有两个实例变量&amp;lt;code&amp;gt;name&amp;lt;/code&amp;gt;和&amp;lt;code&amp;gt;age&amp;lt;/code&amp;gt;，它们有各自的[[变异子与访问子]]。定义了有两个关键字参数的[[类方法]]，用来创建新的类实例。定义了单独用&amp;lt;code&amp;gt;age&amp;lt;/code&amp;gt;来进行比较的&amp;lt;code&amp;gt;&amp;amp;lt;&amp;lt;/code&amp;gt;方法，通过从&amp;lt;code&amp;gt;Magnitude&amp;lt;/code&amp;gt;派生，这个类自动继承了所有的其他比较方法的定义。这个类还通过覆写&amp;lt;code&amp;gt;printOn:&amp;lt;/code&amp;gt;的方式，定制了这个对象的打印（&amp;lt;code&amp;gt;print&amp;lt;/code&amp;gt;）/显示（&amp;lt;code&amp;gt;display&amp;lt;/code&amp;gt;）方式：&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;smalltalk&amp;quot;&amp;gt;&lt;br /&gt;
Magnitude subclass: Person [&lt;br /&gt;
    | name age |&lt;br /&gt;
    Person class &amp;gt;&amp;gt; name: name age: age [&lt;br /&gt;
        ^self new name: name; age: age; yourself&lt;br /&gt;
    ]&lt;br /&gt;
&lt;br /&gt;
    &amp;lt; aPerson [ ^self age &amp;lt; aPerson age ]&lt;br /&gt;
    name [ ^name ]&lt;br /&gt;
    name: value [ name := value ]&lt;br /&gt;
    age [ ^age ]&lt;br /&gt;
    age: value [ age := value ]&lt;br /&gt;
    printOn: aStream [ aStream nextPutAll: (&amp;#039;%1 (%2)&amp;#039; % { name. age }) ]&lt;br /&gt;
].&lt;br /&gt;
&lt;br /&gt;
group := {&lt;br /&gt;
    Person name: &amp;#039;Dan&amp;#039; age: 23.&lt;br /&gt;
    Person name: &amp;#039;Mark&amp;#039; age: 63.&lt;br /&gt;
    Person name: &amp;#039;Cod&amp;#039; age: 16&lt;br /&gt;
}.&lt;br /&gt;
&lt;br /&gt;
group asSortedCollection reverse&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
这里用&amp;lt;code&amp;gt;asSortedCollection&amp;lt;/code&amp;gt;方法对搜集进行排序，然后用&amp;lt;code&amp;gt;reverse&amp;lt;/code&amp;gt;方法来做反转。最终结果是按&amp;lt;code&amp;gt;age&amp;lt;/code&amp;gt;反序打印了三个人的信息：&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
OrderedCollection (Mark (63) Dan (23) Cod (16) )&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==异常==&lt;br /&gt;
要发起能够捕获的异常，需要调用异常类（&amp;lt;code&amp;gt;Exception&amp;lt;/code&amp;gt;）及其子类的&amp;lt;code&amp;gt;signal&amp;lt;/code&amp;gt;或&amp;lt;code&amp;gt;signal:&amp;lt;/code&amp;gt;方法。错误类（&amp;lt;code&amp;gt;Error&amp;lt;/code&amp;gt;）表示不可恢复的致命错误，警告类（&amp;lt;code&amp;gt;Warning&amp;lt;/code&amp;gt;）表示重要但可恢复的错误，停机类（&amp;lt;code&amp;gt;Halt&amp;lt;/code&amp;gt;）表示通常是漏洞（bug）的可恢复错误。例如：&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;smalltalk&amp;quot;&amp;gt;&lt;br /&gt;
Error signal.&lt;br /&gt;
Error signal: &amp;#039;Illegal arguments!&amp;#039;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
异常通过块闭包（&amp;lt;code&amp;gt;BlockClosure&amp;lt;/code&amp;gt;）的&amp;lt;code&amp;gt;on:do:&amp;lt;/code&amp;gt;方法来处理，还可以只捕获特定的异常（和它们的子类）：&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;smalltalk&amp;quot;&amp;gt;&lt;br /&gt;
[ 做些事情&lt;br /&gt;
] on: Exception do: [ :ex |&lt;br /&gt;
    处理ex中异常&lt;br /&gt;
]&lt;br /&gt;
&lt;br /&gt;
[ 做些事情&lt;br /&gt;
] on: Warning do: [ :ex |&lt;br /&gt;
    处理ex中异常&lt;br /&gt;
]&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
处理器子句使用它能获得的异常对象，可以退出或恢复一个块；退出是缺省的，但也可以显式的指示：&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;smalltalk&amp;quot;&amp;gt;&lt;br /&gt;
[ Error signal: &amp;#039;foo&amp;#039; &lt;br /&gt;
] on: Error do: [ :ex |&lt;br /&gt;
    ex return: 5&lt;br /&gt;
]&lt;br /&gt;
&lt;br /&gt;
(Warning signal: &amp;#039;now what?&amp;#039;) printNl     &amp;quot;=&amp;gt; nil&amp;quot;&lt;br /&gt;
&lt;br /&gt;
[ (Warning signal: &amp;#039;now what?&amp;#039;) printNl&lt;br /&gt;
] on: Warning do: [ :ex |&lt;br /&gt;
    ex resume: 5 &lt;br /&gt;
]                &amp;quot;=&amp;gt; 5&amp;quot;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
在因异常状况而要进入[[调试器]]，可以调用对象类（&amp;lt;code&amp;gt;Object&amp;lt;/code&amp;gt;）的&amp;lt;code&amp;gt;halt&amp;lt;/code&amp;gt;方法，或增加了一个消息参数的&amp;lt;code&amp;gt;halt:&amp;lt;/code&amp;gt;方法；这二者实际上调用了对象类的&amp;lt;code&amp;gt;error:&amp;lt;/code&amp;gt;方法，它通过原始操作停止执行{{le|及或|And/or}}启动调试器，并展示这个错误消息：&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;smalltalk&amp;quot;&amp;gt;&lt;br /&gt;
self halt. &amp;quot;halt encountered&amp;quot;&lt;br /&gt;
self halt: &amp;#039;This is a message&amp;#039;.&lt;br /&gt;
self error: &amp;#039;This is a message&amp;#039;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== 参见 ==&lt;br /&gt;
* {{le|Ruby语法|Ruby syntax}}&lt;br /&gt;
* [[解决方案堆栈#GLASS|GLASS]]&lt;br /&gt;
&lt;br /&gt;
==引用==&lt;br /&gt;
{{reflist|2}}&lt;br /&gt;
&lt;br /&gt;
== 外部链接 ==&lt;br /&gt;
* {{Official website|https://www.gnu.org/software/smalltalk/}}&lt;br /&gt;
&lt;br /&gt;
{{Smalltalk programming language}}&lt;br /&gt;
{{GTK|state=collapsed}}&lt;br /&gt;
{{GNU|state=collapsed}}&lt;br /&gt;
&lt;br /&gt;
{{DEFAULTSORT:Gnu Smalltalk}}&lt;br /&gt;
[[Category:Smalltalk编程语言家族]]&lt;br /&gt;
[[Category:GNU计划软件|Smalltalk]]&lt;br /&gt;
[[Category:脚本语言]]&lt;br /&gt;
[[Category:自由教育软件]]&lt;/div&gt;</summary>
		<author><name>imported&gt;ExultantEditor</name></author>
	</entry>
</feed>