Icon (编程语言)

Icon是一门非常高级编程语言,有着“目的(goal)导向执行”特征和管理字符串和文本模式的很多设施。它与SNOBOL和SL5字符串处理语言有关。Icon不是面向对象的,但在1996年开发了叫做Idol的面向对象扩展并最终变成了Unicon

Icon
多范型结构化, 面向文本
設計者Ralph Griswold
1977年1977
穩定版本
9.5.1
( 2018年9月27日2018-09-27
型態系統动态
網站www.cs.arizona.edu/icon
主要實作產品
Icon, Jcon
衍生副語言
Unicon
啟發語言
SNOBOL, SL5, ALGOL
影響語言
Unicon, Python[1], Goaldi

基本语法

Icon语言衍生自ALGOL类的结构化编程语言,因而有着类似CPascal的语法。Icon最类似于Pascal的是,使用了:=语法的赋值,procedure关键字和类似的语法。在另一方面,Icon使用C风格的花括号来结构化执行句组,并且程序开始于运行叫做main的过程。

Icon还在很多方面分享了多数脚本语言(还有SNOBOL及SL5)的特征:变量不需要声明,类型是自动转换的,就说数字和字符串可以自动来回转换。另一个常见于很多而非全部的脚本语言的特征是,缺少行终止字符;在Icon中,不结束于分号的行由暗含的分号来终结,如果这有意义的话。

过程是Icon程序的基本建造块。尽管它们使用Pascal名称,但工效上更像C函数并可以返回值;在Icon中没有function关键字。

 procedure doSomething(aString)
   write(aString)
 end

目的导向执行

Icon的关键概念之一就是其控制结构基于表达式的“成功”或“失败”,而非大多数其他编程语言中的布尔逻辑。这个特征直接派生自SNOBOL,在其中任何模式匹配和/或替换操作,都可以跟随着成功和/或失败子句,它指定在这个必备条件下要分支到一个语句标签。在这种目的导向分支模型下,一个简单的比较如if a < b不意味着:“如果对右侧的操作运算的求值为真”,就像在多数语言中那样;转而它的意味更像是:“如果对右侧的操作运算成功了”。在这种情况下, < 算子成功,如果这个比较为真,所以结束结果是相同的。此外, < 算子如果成功返回它的第二个实际参数,允许像if a & < b < c这样的事情,在多数语言中平常类型的比较必须写为两个不等式的结合比如if (a < b) && (b < c)

Icon对所有流程控制使用成功或失败,所以如下这个简单代码:

if a := read() then write(a)

将复制一行标准输入到标准输入。即使read()导致一个错误它都会工作,例如,如果文件不存在。在这种情况下语句a := read()会失败,而写操作简单的不调用。

成功和失败将通过函数“向上”传递,意味着在嵌套函数内的失败将导致调用它的函数也失败。例如,下面是复制整个文件的一个程序:

while write(read())

read()命令失败的时候,比如在文件结束之处,失败将沿着调用链上传,而write()也会失败。while作为一个控制结构,在失败时停止。类型的例子可以用伪代码写成(使用类似Java的语法):

 try {
   while ((a = read()) != EOF) {
     write(a);
   }
 } catch (Exception e) {
   // do nothing, exit the loop
 }

这种情况需要两个比较:一个用于文件结束(EOF)而另一个用于所有其他错误。因为Java不允许异常作为逻辑元素来比较,就像Icon中那样,转而必须使用冗长的try/catch语法。try块还强加了性能上的惩罚,即使没有异常抛出,Icon避免了这种分配的代价。

Icon称谓这个概念为“目的导向执行”,指称这种只要某个目的达到执行就继续的方式。在上面的例子中目的是读整个文件;读命令在有信息读到的时候成功,而在没有的时候失败。目的因此直接编码于语言中,不用再去检查返回码或类似的构造。

生成器

在Icon中表达式经常返回一个单一的值,例如x < 5,将求值并且如果x的值小于5则成功,否则失败。但是,很多表达式在返回值的同时,不“立即”返回成功或失败。下面用everyto来驱动例子;every导致to继续返回值,直到失败。

这是Icon中的一个关键概念,叫做生成器。生成器驱动了在语言中多数的循环功能,但是不需要在每次迭代都显式循环比较值。

在Icon的用语中,一个表达式活函数的求值产生一个“结果序列”。结果序列包含这个表达式或函数生成的所有可能的值。在结果序列被耗尽的时候,这个表达式或函数失败。完成在结果序列上的迭代,要么隐式的通过Icon的目的导向求值,要么显式的通过every子句。

Icon包括一些生成器建造器。“轮选器”(alternator)语法允许一系列项目被生成于一个序列中,直到其中一个失败:

 1 | "hello" | x < 5

可以生成1hello5如果x小于5的话。轮选器在很多情况下可以读作“或”,例如:

 if y < (x | 5) then write("y=", y)

将写出y的值,如果它小于x“或”5。Icon在内部从左至右的检查所有的值,知道一个成功,或列表成空从而它返回一个失败。函数将不被调用,除非求值它们的形式参数成功,所以这个例子可以简写成:

 write("y=", (x | 5) > y)

另一个简单的生成器是to,它生成整数的列表;every write(1 to 10)将调用write()10次。“叹号语法”生成一个列表的所有项目;every write(!aString)将输出aString的每个字符于一个新行上。

这个概念对于字符串操作是很强大的。多数语言包含一个函数叫做findindexOf,返回一个字符串在另一个字符串中的位置。例如:

 s = "All the world's a stage. And all the men and women merely players";
 i = indexOf("the", s)

这将返回4,这是单词“the”的首次出现位置(假定索引起始于0)。要得到“the”的下一个实例,必须使用替代的形式:

 i = indexOf("the", s, 5)

在结束处的5应当从位置5可是查找。所以要提取出“the”的所有出现,必须使用循环:

 s = "All the world's a stage. And all the men and women merely players";
 i = indexOf("the", s)
 while i != -1 {
   write(i);
   i =  indexOf("the", s, i+1);
 }

在Icon中,find函数是个生成器,在每次被恢复(resume)的时候,它将返回这个字符串的下一个实例,直到它达到字符串结束处而失败。相同的代码可以写为:

 s := "All the world's a stage. And all the men and women merely players"
 every write(find("the", s))

find在每次被every恢复的时候,将返回“the”的下一个实例的索引,最终达到字符串结束处并失败。

当然人们有时会想要找到在输入中某点之后的一个字符串,例如,扫描包换多列数据的一个文本文件。目的导向执行也能起效:

 write(5 < find("the", s))

只返回“the”出现在位置5之后的那些位置;否则比较会失败。成功的比较返回右手侧的结果,所以把find放置到这个比较的右手侧是重要的。如果写成了:

 write(find("the", s) > 5)

则写出来的是5而不是find的结果。

Icon增加了一些循环经过生成器的控制结构。every类似于while,循环经过一个生成器的所有项目,在失败时退出:

  every k := i to j do
   write(someFunction(k))

while重新求值第一个结果,而every产生所有结果。every语法实际上以类似于在Smalltalk下的块的风格,将值注入函数中。例如,上面的循环可以用这种方式重新写为:

 every write(someFunction(i to j))

生成器可以定义为使用suspend关键字的过程:

 procedure findOnlyOdd(pattern, theString)
   every i := find(pattern, theString) do
     if i % 2 = 1 then suspend i
 end

这个例子在theString上循环,使用find来查找pattern。当找到一个位置并且它是奇数的时候,用suspend从这个函数返回这个位置。不同于returnsuspend记住这个生成器的状态,允许在下次迭代时在上次中止的地方恢复。

参见

引用

  • 权威著作是《The Icon Programming Language》(第三版),Griswold和Griswold著,ISBN 1-57398-001-3。可以下载为PDF文件页面存档备份,存于
  1. Schemenauer, Neil; Peters, Tim; Hetland, Magnus. . 2001-12-21 [2008-09-05]. (原始内容存档于2020-06-05).

外部链接

維基教科書中的相關電子:Icon Programming

This article is issued from Wikipedia. The text is licensed under Creative Commons - Attribution - Sharealike. Additional terms may apply for the media files.