AppleScript语言简介
最近我把我的“移动装备”从Sony换成了Apple,就是俗称“小白”的那种苹果本本。很多人说在Apple上搞开发不方便,其实那只是不习惯而已。现在,我的本本上各类开发环境基本齐备,语言环境有gcc, jdk, python, php, ruby, logo(logo是给小孩子玩的)... IDE有eclipse和Xcode(这个Xcode是MAC安装盘上提供的,可以做c++, objective-c, java等各种语言的应用,感觉在集成和开放之间的平衡做得比较好,只是我还没有用熟)...调试和测试用的小工具也有不少……编程序没有任何问题!
总的感觉是,功能和兼容性不比Linux差(MACOSX内核也是UNIX),界面和趣味性却又比Linux强上许多倍(这个自然了,Apple是人性化设计的专家嘛)。最最重要的是,在这个苹果的本本上,我终于可以尝试一种以前早有耳闻却一直无法上机实践的脚本语言了。这个著名的脚本语言就是:
AppleScript
这几天趁着出差的空闲时间把AppleScript的基本特性试了一下,先写一份语言的简介,权当是学习笔记吧。以后有时间,再把这个语言的细节一一笔记下来。
AppleScript的三大特点(这个是我自己归纳的,不代表官方意见)
----------------------------------------------------
(1) 好玩——人性化的语言
这个没什么好解释的,苹果上的东东都好玩得不得了,连一向古板的Microsoft做的苹果版的Office也比windows版的兄弟好玩许多倍,更不用说苹果人做的AppleScript了。给几个例子吧,苹果手册上推荐的调试AppleScript程序的一种方法是在发生错误的地方加上:
say "Oh damn! I've got an error!"
然后,一旦发生错误,苹果本本就会大叫着通知你!
还有,大家都见过从字符串里拆出单词的代码,可多半没见过下面这么拆的:
return some word of "one two three four five"
这行代码的意思是返回字符串中的“任何”一个单词,至于到底是哪一个单词,您就甭管了。
(2) 好懂——英语化的语言
没错!就算没学过编程的人看了下面的AppleScript代码也多半可以猜出是怎么回事:
tell application "Microsoft Excel" to open file "test.xls"
以前老有人说BASIC语言像英语,其实,最像英语的程序设计语言应该是AppleScript!看下面这行代码:
tell application "Finder"
if the name of the front window is greater than "HELLO" then say "Hello"
end tell
还有下面这行代码:
date "2005-5-20" + 100 * days + 10 * hours
它的运行结果是
date "2005年8月28日星期日 10:00:00 AM"
也就是计算出比2005年5月20日正午晚100天零10小时的那个时刻,这种写法可要比c++、Java里直观多了。
(3) 好用——真正系统级的脚本语言
操作系统开发者总希望能有一种和操作系统各层次、各部分(包括系统功能和应用程序)都紧密集成的脚本语言,以便给用户提供真正“系统级”的自动化支持。可这个事情说起来容易做起来难。
UNIX/Linux的各种Shell语言是系统级的脚本语言。如果采用广义的说法,shell层面的脚本语言既包括早期的csh,ksh等等,也包括晚出的perl, python等等,这些脚本语言与命令行方式运行的UNIX/Linux程序可以非常好地集成在一起(主要是UNIX管道和流比较强大),但与图形界面程序的集成就缺乏统一、简便的途径了(比如,在X11下,用bash脚本向正在运行的emacs发送指令,用bash调用OpenOffice的某个功能,完成这两种任务的方法就会有不小的差别)。
Windows上做得就更糟糕了。DOS命令行的可怜就不说了。微软为了统一不同应用程序间的自动化方式,基于COM发明了ActiveX技术,又给出了VBScript和VBA这样的语言,但除了微软自己的Office对它们的支持非常好以外,其他应用软件在自动化和功能集成方面的技术选型就五花八门,难以互通了(比如,为了控制Flash MX 2004而编写的JavaScript程序(通过JSAPI)显然就和为了控制Excel而编写的VBScript程序(通过Excel VBA的ActiveX接口)大不一样。
在MACOSX里,情况就好很多了。因为MACOSX在操作系统层面定义了应用程序之间的互操作接口Apple Events(基于事件机制实现,比ActiveX和UNIX管道都简单些),提供了通用的AppleScript语言,然后鼓励所有MACOSX的应用支持这些标准。事实上,大多数Apple上的应用程序(包括微软的Office)都可以在AppleScript的控制下完成互操作,或者相互连接成统一的“工作流”。比如说,我们可以在一段AppleScript里先通知截屏程序将屏幕保存为图像文件,然后通知Finder(苹果上的资源管理器)将图像文件保存并同时备份到……再命令Photoshop调整该图像的颜色,最后命令PowerPoint将图像嵌入到幻灯片里……这一连串操作要是在Windows里实现起来,可就不那么容易了。
AppleScript语言的主要语法特性
---------------------------
(*) 支持的数据类型:
Boolean, Class, Constant, Data, Date, File Specification, Integer, List, Number, Real, Record, Reference, RGB Color, String, Styled Clipboard Text, Styled Text, Text, Unicode Text, Unit Type Value Classes
其中,Styled Text表示含有字体和格式信息的字符串,这种在语言层面支持RichText的做法并不多见。
(*) 控制结构
分支、循环等各种形式都有,语法非常接近英语。其中,循环结构有很多种,当然也支持最时髦的for each结构:
repeat with loopVariable in list
[ statement ]...
end [ repeat ]
(*) 面向对象
AppleScript是面向对象的。首先,所有AppleScript能控制的应用都是对象的集合,为此,AppleScript还提供了统一的对象字典,在字典里,可以查到任何一个支持AppleScript的程序(比如Photoshop)提供了哪些对象,每个对象有哪些属性和方法。其次,我们自己也可以创建对象,而且可以从其他对象继承:
script X
on sayHello()
return "Hello, " & getName()
end sayHello
on getName()
return "Emily"
end getName
end script
script Y
property parent : X
on getName()
return "Andrew"
end getName
end script
tell Y to sayHello()
(*) 表处理
list结构在AppleScript里非常重要,也非常好用,像这样的代码在其他支持表的语言里很常见:
length of {"a", "b", "c", 1, 2, 3}
但下面这样的代码就不那么常见了
count integers in {"a", "b", "c", 1, 2, 3}
还有更神奇的代码:
the items in {"this", "is", "a", "list"} whose first character is "t"
这种代码差不多就是Python里面为支持函数式编程而引入的Filter功能了。或者,上面这行AppleScript代码也可以等价于Python里面的这样一个表达式:
[w for w in ["this", "is", "a", "list"] if w.startswith("t")]
相比之下,Python的代码要比AppleScript的代码费解多了。
(*) 异常处理
用Try来处理异常当然没问题,最好玩的是还有这样的超时控制:
with timeout of 5 seconds
tell application "AppleWorks"
close front document saving ask
end tell
end timeout
先写这些特性吧,只是个简介嘛,何况我自己也没有学全呢。以后有时间再详细介绍。