使用Cusp Eclipse插件开发Lisp应用程序

Cusp,用于Lisp的Eclipse开发环境

Cusp是Common Lisp编程语言的开发环境。 使用Lisp,您可以开发各种应用程序,包括Web应用程序。 Lisp是第二种最古老的编程语言,至今仍在使用(在Fortran之后),并且被称为第一功能语言。 Lisp的创建始于1950年代后期,并于1958年由MIT人工智能(AI)项目首次实施。 它的优势在于处理列表:AI和符号数学。 实际上,Lisp是“列表处理器”的缩写,这是创建此编程语言的必要条件,如您在以下各段中所见( 有关 Lisp历史信息,请参阅参考资料)。

您会注意到Lisp与其他通用编程语言完全不同。 例如,在大多数通用编程语言中,就像在纸上一样执行乘法: int times = 5 * 5 ;。

使用Lisp,将产生75: (* 5 5 3) 。 此列表中的最大值: (MAX 9 8 7 6 20)返回20。

注意,这里的短语“第一功能语言”是恰当的,因为一切都是基于功能的。 每个功能可以具有可变数量的参数。 使用递归和Lisp函数(例如carcdr )处理这些列表是使用Lisp进行列表处理的强大功能。

鉴于Lisp的年龄,您可以找到许多开发环境。 但是,这也是旧编程语言所固有的,该工具支持主要是基于文本的,对于新手来说并不直观。 因此,尝试Cusp的一个原因是它具有供新手学习和开发Lisp的直观GUI,而不是基于文本的“尝试记住所有这些命令”类型的界面。 它还具有Eclipse GUI框架固有的卓越项目管理功能的优势。

在继续之前,您需要从Eclipse.org下载最新的Eclipse经典捆绑包。 然后,您将学习如何安装和设置Cusp。

安装Cusp

现在,您应该具有Eclipse经典捆绑软件的压缩存档。 取消存档,然后运行eclipse.exe。

要获取最新版本的Cusp:单击帮助>软件更新>查找并安装 。 单击“ 搜索要安装的新功能”选项。 现在,单击“ 新建远程站点”按钮。 输入名称作为Cusp update site ,输入URL作为http://www.sergeykolos.com/cusp/update ,然后单击OK (参见图1)。

图1.输入Cusp的远程站点信息
输入Cusp的远程站点信息

单击添加的新远程站点旁边的复选框,然后单击Finish (参见图2)。

图2.选择Cusp Eclipse更新站点
选择Cusp Eclipse更新站点

您将被带到另一个窗口,您需要在其中扩展Cusp Eclipse Update Site并选择Cusp,如下所示。

图3.选择要安装的功能
选择要安装的功能

单击下一步 。 然后单击“ 我接受许可协议中的条款” ,然后单击“ 下一步”,阅读并接受许可协议。 确保选择了所有库,如下所示, 然后再次单击“ 下一步”

图4.选择可选功能
选择可选功能

最后一页为您提供要安装功能的安装摘要。 点击完成 。 该插件及其组件将下载并安装。 下载后,您会收到一条警告,提示您将要安装未签名的功能。 单击全部安装 。 在安装结束时,将要求您重新启动Eclipse。 单击

您已经安装了Eclipse Cusp插件。 接下来,您将设置一个Lisp项目。

设置一个Lisp项目

在开始Lisp开发之前,您需要建立一个新的Lisp项目。 您可以通过转到File> New> Project来实现 。 展开Lisp文件夹,单击Lisp Project ,然后单击下一步 。 选择新项目的名称my_new_lisp_project,如下所示,然后单击Finish

图5.命名新的Lisp项目
命名新的Lisp项目

单击Finish后 ,将创建新项目,并打开Lisp透视图,如下所示。

图6. Lisp透视图
Lisp的观点

看一下Lisp的观点。 Lisp Navigator窗口显示打开的项目及其关联文件。 “大纲”窗口显示当前打开的文件的大纲。 右上角显示main.lisp的窗口是Lisp开发窗口。 右下角的窗口REPL是命令行Lisp解释器,您可以在其中运行Lisp命令。

如果您关闭Eclipse并重新打开它,则需要加载项目.asd文件,如下所示。

图7.加载您的ASD文件
加载您的ASD文件

请注意,您需要右键单击my_new_lisp_project文件夹下的my_new_lisp_project.asd文件,然后选择Load asd 。 这实际上是在REPL窗口中编译Lisp项目,从而允许您输入可以使用新代码的Lisp命令。

接下来,您将尝试使用Cusp进行一些Lisp开发。

使用Cusp开发Lisp

首先,您将定义一个简单的自定义函数并对其进行测试。 打开main.lisp文件,并使用defun (限定函数)命令,并添加以下:

...
(defun first_howdy_function ()
  "howdy ho")

保存文件。 要从包中导出函数,请在defpackage.lisp中键入以下代码:

...
   ;; Exported symbols go here
  first_howdy_function
   ))

可以从包装外部使用该功能。 要测试您的新功能,请在REPL的下部窗口中键入以下内容: (my_new_lisp_project:first_howdy_function)

请注意,对于您所在的范围,这与输入(my_new_lisp_project::first_howdy_function) 。 如果未在defpackage.lisp中导出函数,则必须输入该内容。

单击发送并签出输出。 输入以上任一命令的输出如下:

COMMON-LISP-USER>
(my_new_lisp_project:first_howdy_function)

"howdy ho"

在那里,您便拥有了:第一个Lisp Howdy函数。

尝试将echo函数与输入一起使用:

...
(defun first_echo_function (echoval)
  echoval)

与最后一个函数一样,将其导出到defpackage.lisp中。 您将在REPL窗口的下部键入以下内容来测试first_echo_function(my_new_lisp_project:first_echo_function '("howd" "yh" "o")) 。 请注意, '("howd" "yh" "o")部分是用于定义列表的语法。 首先,单引号必须在括号之前,然后在括号内定义列表元素。 输出如下所示:

COMMON-LISP-USER>
(my_new_lisp_project:first_echo_function '("howd" "y h" "o"))

("howd" "y h" "o")

您将创建一种方法来单独处理每个列表元素,这是Lisp的真正功能。 定义如下:

(defmethod concat2 ((str1 string) (str2 string))
  (concatenate 'string str1 str2))

请注意,上述方法实际上定义了类型字符串。 到目前为止,您一直在使用Lisp作为一种基本上没有类型的语言。 尽管双引号将数据隐式地键入为字符串,但是上述方法显式地将concat2函数的输入和输出都键入为字符串。 此方法还使用内置的串联函数来组合两个字符串,并将它们作为单个字符串返回。

要测试concat2 ,请导出它,然后键入(my_new_lisp_project:concat2 "howd" "y ho") 。 其输出如下:

清单7.连接两个字符串的输出
COMMON-LISP-USER>
(my_new_lisp_project:concat2 "howd" "y ho")

"howdy ho"

你有它。 字符串"howd""y ho"变为"howdy ho." 现在,您将使用Lisp闻名的两个函数carcdr创建一个更通用的串联函数。

清单1.连接列表中的三个元素
(defun concat3 (args_list)
  (concat2 (car args_list)
           (concat2 (car (cdr args_list))
                    (car (cdr (cdr args_list))))))

请注意,该函数仍然使用concat2函数,但是将参数列表作为输入。 注意如何从args_list检索连接的每个部分。 car从列表中取出第一个元素。 cdr返回减去第一个元素的列表。 您只需调用列表中的car函数即可看到如何获得第一个元素。 获取第二个元素需要先调用列表中的cdr ,然后再调用新列表中的car 。 第三个元素是通过两次调用列表中的cdr并在最终列表中调用car来获取的。

导出后,上述函数的输出如下:

COMMON-LISP-USER>
(my_new_lisp_project:concat3 '("howd" "y h" "o"))

"howdy ho"

然后你去。 正确地连接了三个字符串以产生"howdy ho." 接下来,您将创建一个递归函数。

使用Lisp递归

您要创建的最后一个函数将要进行一些递归,这就是使用Lisp进行列表处理的真正能力所在。 可以进行迭代(一个接一个地循环遍历每个项目),但是与Java语言之类的通用语言不同,递归到目前为止是处理Lisp中列表的最简单方法。 在本节的最后,您将确切地知道什么是递归。

首先创建一个递归的concat函数。

清单2.递归串联(无限的参数)
1   (defun concat_recursive (args_list)
2     (if (equal (cdr args_list) nil)
3         (car args_list)
4         (concat2 (car args_list)
5                  (concat_recursive (cdr args_list)))))

递归可能是一个很难解决的概念,因此让我们逐步了解一下:

  • 假定将任意参数列表传递给上述函数。
  • 如果列表中只有一个元素(第2行的(cdr args_list)部分返回nil),则返回单个元素(第3行的(car args_list) )。
  • 如果列表中有多个元素(意味着第2行的(cdr args_list)部分未返回nil),则返回连接(使用concat2 )列表中第一个元素的结果(请参见第4行)和结果(cdr args_list)的结果作为参数递归调用concat_recursive的说明(请参见第5行)。

在将以下列表作为参数'("ho" "wd" "y" " h" "o")传递时,以下是输出的演练:

  • 到达第一时间线2时, if语句为false,并且用"ho"(concat_recursive '("wd" "y" " h" "o"))调用concat2
  • 到达第二条时间线2时, if语句再次为false,并用"wd"(concat_recursive '("y" " h" "o"))调用concat2
  • 到达第三条时间线2时, if语句再次为false,并用"y"(concat_recursive '(" h" "o"))调用concat2
  • 到达第四条时间线2时, if语句再次为false,并用" h"(concat_recursive '("o"))调用concat2
  • 第五次是递归结束的神奇时间。 这是因为这一次,第2行的if语句现在为true,并且仅返回了"o" 。 递归展开如下:
    • 第四次:将" h""o"连接并返回。
    • 第三次: "y"" ho"被连接并返回。
    • 第二次:将"wd""y ho"连接并返回。
    • 第一次:将"ho""wdy ho"连接起来并作为最终结果返回。

一切就绪–“ howdy ho”最终会返回,如下所示:

COMMON-LISP-USER>
(my_new_lisp_project:concat_recursive '("ho" "wd" "y" " h" "o"))

"howdy ho"

您已将递归添加到Cusp开发库中。 接下来尝试调试器。

使用Cusp进行调试

考虑将导致concat_recursive失败的输入条件,以便调试器可能派上用场。 一种是您可以发送一个与字符串混合的数字以查看会发生什么。 请记住,使用concat2的串联需要两个字符串,因此使用数字将导致此函数在递归范围内中断。

键入以下命令: (my_new_lisp_project:concat_recursive '("ho" "wd" "y" 55 " h" "o")) 。 请注意,没有用双引号引起来的数字55不是字符串,并且将导致调试器出现,如下所示。

图8.触发调试器
触发调试器

注意,触发调试器的主要错误是无法在列表中调用concat2 (55 " ho") 。 还要注意,在触发错误之前, " h""o"已经连接在一起。

在调试器窗口中,您还可以看到==Backtrace== ,如图8所示。它下面的每一行(在本例中为0-19)都提供了从单击“ 发送到发生的故障”时的详细跟踪。 在这里,您还可以查看并遵循递归导致数值55触发故障。

现在怎么办? 在上述情况下,您有三个选项可以退出调试器,并修改和验证对函数的输入:您可以中止命令并返回到常规REPL窗口。 您可以关闭连接(通过测试,发现如果选择此选项,则需要重新引导Eclipse以重新启动Lisp处理器); 或者您可以简单地中止调试器并返回常规REPL窗口。 退出调试器的最佳选择是始终中止命令并返回常规REPL窗口。

你有它。 您已经在Lisp中实现了递归函数。

摘要

您已成功使用Cusp Eclipse插件完成了Lisp开发。 您现在应该知道为什么Lisp如此强大。 通过简单的递归语句,您可以轻松地处理符号和数据列表。 Cusp借助内置的Cusp调试器,具有项目管理功能的可靠GUI,交互式Lisp编辑器以及Lisp处理器的命令行界面来补充Lisp的功能,您可以在其中输入命令并测试代码。 请确保查看参考资料以获取更多信息。


翻译自: https://www.ibm.com/developerworks/opensource/library/os-eclipse-lispcusp/index.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值