使用 Cusp Eclipse 插件开发 Lisp 应用程序
Lisp 不再只适用于人工智能 —— 试试它,您可能会用不同的方式思考 Java 和 C 编程
简介:
Lisp
是一种极好的编程语言,由于它具有很强的无类型特性,因此使您可以扩展编程语言知识。它还可以帮助那些拥有丰富的 Java™、PHP 或 C/C++
等编程语言经验的人士在开发应用程序时用新的方式思考。此外,您可以用 Lisp 来实现一些很棒的操作。了解如何使用 Cusp Eclipse
插件来开发 Lisp 应用程序。
发布日期:
2007 年 11 月 26 日
级别:
中级
访问情况
1307 次浏览
建议:
0 (添加评论
)
Cusp,Lisp 的 Eclipse 开发环境
Cusp 是 Common Lisp 编程语言的开发环境。使用 Lisp 可以开发所有类型的应用程序,包括 Web
应用程序。Lisp 是目前仍在使用的第二种最古老的编程语言(在 Fortran 之后)并被称为第一种函数语言。Lisp
的创建开始于二十世纪五十年代后期,并且于 1958 年由 MIT 人工智能 (AI) 项目首次实现。它的强大之处在于处理列表:AI
和符号数学。实际上,Lisp 是 “list processor”
的简写,正是出于对列表处理器的需求创建了这种编程语言,您将在稍后的段落中看到相关说明(有关 Lisp 的历史信息,请参阅 参考资料
)。
您将会发现 Lisp 与其他普通的编程语言根本不同。例如,在大多数普通编程语言中,执行乘法就像您在纸上作运算一样:int times = 5 * 5
;。
使用 Lisp,将通过代码 (* 5 5 3)
得到 75。要获得此列表中的最大值,使用 (MAX 9 8 7 6 20)
将返回 20。
注意,这里所说的 “第一种函数语言” 十分贴切,因为一切都基于函数。每个函数都可以有若干数目不定的参数。使用递归和诸如 car
和 cdr
之类的 Lisp 函数处理这些列表是使用 Lisp 处理列表的强大之处。
由于 Lisp 历史较久,因此您可以找到许多适用于 Lisp
的开发环境,但是,也存在旧编程语言固有的问题,工具支持大部分都是基于文本的,并且对于新手来说不够直观。因此,尝试使用 Cusp
的一个原因是它提供了供新手了解和开发 Lisp 的直观 GUI,而不使用基于文本的 “尝试记住所有这些命令” 类型的界面。它还比 Eclipse
GUI 框架固有的 superb 项目管理功能更具优势。
继续之前,您需要从 Eclipse.org
下载最新的 Eclipse 标准包。然后了解如何安装和设置 Cusp。
回页首
安装 Cusp
现在应当有一个经过压缩的 Eclipse 标准包归档。请将其解压缩并运行 eclipse.exe。
要获得最新版本的 Cusp,请单击 Help > Software Updates > Find and Install
。单击 Search
for new features to install
选项。现在单击 New Remote Site
按钮。键入名称 Cusp update site
和 URL http://www.sergeykolos.com/cusp/update
,然后单击 OK
(参见图 1)。
图 1. 为 Cusp 输入远程站点信息
单击已添加的新远程站点旁边的复选框并单击 Finish
(参见图 2)。
图 2. 选择 Cusp Eclipse Update Site
系统将显示另一个窗口,在该窗口中需要展开 Cusp Eclipse Update Site 并选择 Cusp,如下所示:
图 3. 选择要安装的功能
单击 Next
。然后阅读许可证协议并单击 I accept the terms in the license agreement
接受许可证协议,然后单击 Next
。确保选中所有库,如下所示,然后再次单击 Next
。
图 4. 选择可选功能
最后一个页面将显示要安装功能的安装汇总。单击 Finish
。插件及其组件将下载并安装。下载后,您将收到一则警告,表明将要安装一个未签名的功能。单击 Install all
。在安装结束时,系统将询问您是否要重新启动 Eclipse;请单击 Yes
。
您已经安装了 Eclipse Cusp 插件。接下来,将创建一个 Lisp 项目。
回页首
创建 Lisp 项目
在开始进行 Lisp 开发之前,必须先创建一个新的 Lisp 项目。您可以通过转到 File > New > Project
来完成此操作。展开 Lisp 文件夹,单击 Lisp Project
,然后单击 Next
。为新项目选择一个名称 my_new_lisp_project,如下所示,然后单击 Finish
。
图 5. 命名新 Lisp 项目
单击 Finish
后,将创建新项目并打开 Lisp 透视图,如下所示:
图 6. Lisp 透视图
查看 Lisp 透视图。Lisp Navigator 窗口显示打开的项目及其相关文件。Outline
窗口显示当前打开文件的概要。位于右上侧显示 main.lisp 的窗口是 Lisp 开发窗口。位于右下侧的窗口 REPL 是 Lisp 的命令行
Lisp 解析程序,您可以在这里运行 Lisp 命令。
如果关闭并重新打开 Eclipse,则需要装入项目的 .asd 文件,如下所示:
图 7. 装入 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 中导出函数,则这是您必须键入的代码。
单击 Send
,然后查看输出。输入上面任意一条命令所得到的输出都是:
COMMON-LISP-USER>
(my_new_lisp_project:first_howdy_function)
"howdy ho"
|
您已经得到它了:第一个 Lisp Howdy 函数。
尝试为 echo
函数提供一个输入:
...
(defun first_echo_function (echoval)
echoval)
|
同上一个函数一样,将其导出到 defpackage.lisp 中。在 REPL 窗口中位置靠下的部分中键入以下代码 (my_new_lisp_project:first_echo_function '("howd" "y h" "o"))
来测试这个 first_echo_function
。注意,'("howd" "y h" "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
函数的输入和输出类型定义为字符串。此方法还使用内置的 concatenate 函数把两个字符串组合在一起,并将其作为单个字符串返回。
要测试 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 car
和 cdr
函数创建更通用化的 concatenation 函数。
清单 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),则返回使用 (cdr args_list)
的结果作为参数(参见第 5 行)连接(使用 concat2
)列表的第一个元素(参见第 4 行)与递归调用 concat_recursive
的结果的结果。
当传递列表 '("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. 触发调试器
注意,触发调试器的主要错误是无法对列表 (55 "
ho")
调用 concat2
。另请注意,在触发该错误之前已经连接了 "h"
和 "o"
。
在调试器窗口中,您还可以看到 ==Backtrace==
,如图 8 所示。调试器下部的每行(本例中为 0 至 19 行)给出了从单击 Send
到发生错误的详细跟踪。在这里,您还可以查看并跟踪在触发了错误的数字 55 之前的递归。
现在做什么?遇到上面的情况,您有三种选择退出调试器并修改和验证函数输入:可以中止命令并返回到正常的 REPL
窗口;可以关闭连接(通过测试发现,如果选择此选项,则需要重新引导 Eclipse 来重新启动 Lisp
处理器);可以简单地中止调试器并返回到正常的 REPL 窗口。退出调试器的最佳选项始终是中止命令并返回到正常的 REPL 窗口。
就是这样。您已经在 Lisp 中实现了递归函数。
回页首
结束语
您已经成功地使用 Cusp Eclipse 插件完成了 Lisp 开发。现在应当知道 Lisp
为什么如此强大。通过简单的递归语句,可以轻松地推动处理符号和数据列表。Cusp 为 Lisp 的功能补充了内置 Cusp
调试器、拥有项目管理功能的可靠 GUI、交互式 Lisp 编辑器以及可以输入命令和测试代码的 Lisp
处理器命令行接口。要获得更多信息,请一定要查看 参考资料
。
分享到:
相关推荐
cusp-0.9.390-veket 安装eclipse需要用到得一个插件!
CUDA(Compute Unified Device Architecture)是由NVIDIA开发的一种并行计算平台和编程模型,它允许开发者利用GPU(图形处理单元)的高性能来进行通用计算任务。在CUDA中,Cusp是一个开源库,专门设计用于解决线性...
在“cusplibrary-develop”这个压缩包中,通常包含了CUSP库的源代码、编译脚本、示例程序、测试用例和相关的文档。开发者可以通过阅读源代码,了解其内部实现机制,学习如何在自己的项目中使用或扩展CUSP。为了开始...
《PyPI与aiida-cusp-0.1.0b1.tar.gz:探索Python库的发布与使用》 PyPI(Python Package Index)是Python世界中的一个重要组成部分,它是Python开发者分享和分发自己软件包的官方平台。PyPI的存在使得Python用户...
使用Cirq实施CUSP 描述 压缩无监督状态准备(CUSP)是一种通过使用量子自动编码器构建更高效的量子电路的方法。 该协议执行一种电路综合,如果训练成功,则电路更紧凑。 由于通常情况下,更短深度的电路在真实的...
在实际应用中,Cusp可以广泛用于各种领域,包括但不限于游戏开发中的角色动画、UI设计中的平滑过渡、物理模拟中的轨迹规划等。对于初学者,Cusp提供了一个学习样条曲线和曲线插值理论的良好平台;对于专业开发者,它...
语言:English 将URL中CSS文件插入活动页面。 重新加载后保持设置。 ... 这很棒,因为每次重新加载CSS文件后,都会将其重新插入到页面中。 当我必须为网页创建CSS文件并且没有FTP访问权限时,会用到它。
将一个CSS文件从一个URL插入到活动页面。重新加载后维护设置。 ... 这很棒,因为每次重新加载CSS文件后都会将其重新插入到页面中。 当我必须为网页创建CSS文件并且没有FTP访问权限时,会用到它。 支持语言:English
Nyu-cusp-pui-ebike
在半导体行业中,随着晶片尺寸的扩大,传统的Cusp磁场(勾型磁场)由于能耗高、磁场强度不足(约为1000GS)等问题,已不能满足大尺寸晶体生长的需求。超导横向磁场的出现,解决了这些问题,它采用超导材料,当处于...
为了进行这项研究,邓克忠和刘汉梅使用了多种生物信息学工具,包括CUSP、CHIPS程序和CodonW程序,对固氮酶基因的密码子进行了细致的分析。研究发现固氮酶基因偏好使用以G或C结尾的密码子,而与水稻和玉米等植物的...
"Coverity® Software Integrity Report"是由Synopsys公司提供的静态应用程序安全测试(SAST)工具,用于分析源代码中的安全漏洞和质量问题。报告中提到的统计数据显示了在分析过程中发现的问题类型: 1. OWASP Top...
该网络应用程序是纽约市城市科学与进步中心( )的顶峰项目,是与公共交通倡导组织合作。 战略 随着MTA公交车在日益超载的地铁系统中继续失去乘客,TransitCenter力图确定公交系统中的薄弱环节,在这些薄弱环节上,...
微信小程序中的Canvas增强组件WeZRender是一个非常实用的工具,它基于HTML5的Canvas库ZRender,为开发者提供了更加强大的功能和便利...通过深入学习和使用WeZRender,开发者可以创造出更加生动、富有交互性的应用界面。
方形矩阵乘的CUDA实现,包含了多种实现方式
其中,磁场直拉法因其能抑制大熔体的热对流,改善晶体质量,尤其是通过Cusp磁场的应用,可以控制晶体中的氧含量和电阻率的均匀性,从而更好地满足超大规模集成电路(VLSI)的要求。磁场的类型和强度设计对于控制晶体...
cudaSpmv 使用切片坐标格式的CUDA稀疏矩阵矢量乘法(以及其他处于尖峰的格式) prep :对输入矩阵进行分区,将分区后的矩阵存储在二进制文件中,以加快访问速度spmv :使用prep好的文件执行spmv cusp :使用cusp库...
我们已经使用各种稀疏矩阵评估了LightSpMV,并将其与最新的CUSP和cuSPARSE中基于CSR的SpMV子程序进行了比较。 性能评估表明,在单个Tesla K40c GPU上,LightSpMV优于CUSP和cuSPARSE,与CUSP相比,分别提高了2.60和...
这七种初等突变形态对应不同的势函数,例如折叠型(cusp)、燕尾型(swallowtail)、蝴蝶型(butterfly)等。 在环境承载力的定量评价中,突变级数法会先对评价目标进行多层次矛盾分解,利用突变理论与模糊数学相...