BT

如何利用碎片时间提升技术认知与能力? 点击获取答案

在Lisp中使用RDNZL调用.NET类库

| 作者 Jonathan Allen 关注 525 他的粉丝 ,译者 Jason lai 关注 0 他的粉丝 发布于 2007年8月25日. 估计阅读时间: 2 分钟 | GMTC大前端的下一站,PWA、Web框架、Node等最新最热的大前端话题邀你一起共同探讨。

长期以来对Lisp的诟病之一就是Lisp缺乏高质量的类库。尽管有不少人在争论这个观点是否正确,但是能够访问.NET平台下不计其数的高质量类库,确实能给人们带来很多价值。

RDNZL为Windows平台下的Lisp开发人员提供了一个访问.NET类库的途径。尽管目前它还不能支持其它的CLR实现,比如说Mono,但是RDNZL的维护人员正在接纳这些平台的补丁。

在Lisp一方,这套类库支持Corman Common List、ECL、Allegro和LispWorks。SBCL和GNU CLISP的移植版目前尚在开发中。

RDNZL完成诸如对象创建、.NET风格数组、枚举类型、装箱(Boxing)、.NET/Lisp类型转换和起来类似的基础工作,相对来说容易不少,而方法调用可以用两种方式完成。最为容易的方式是使用Lisp函数调用、属性或者字段。这些方法使用反射来调用下面的.NET方法。如果希望避免反射,并使调用时间减半,开发人员可以使用define-rdnzl-call来为相应函数创建一个Lisp包装器。

使用这个类库对性能最严重的影响就是对所传送数据的重新编组的时间损耗。出于这一原因,控制跨平台方法调用的数量是更可取的,而人们尤其应当注意避免在Lisp中的一个紧凑循环中频繁调用.NET代码。

由于要为COM类库创建CLR可调用的包装器(CLR Callable Wrapper)是件易如反掌的事情,RDNZL也为开发人员提供了调用Windows平台上浩如烟海的COM类库的途径。在链接页面中,有不少示例,其中就有一个从Lisp中通过Microsoft Office自动化调用Excel对象的例子。

事件处理器和其它的委托(delegate)可以通过向委托的构造方法传入一个Lisp闭包的方式创建。不过要这样做必须小心从事,因为这样可能会创建出一个循环引用,从而扰乱Lisp和.NET的垃圾收集器。

查看英文原文:Call .NET Libraries from Lisp Using RDNZL

评价本文

专业度
风格

您好,朋友!

您需要 注册一个InfoQ账号 或者 才能进行评论。在您完成注册后还需要进行一些设置。

获得来自InfoQ的更多体验。

告诉我们您的想法

允许的HTML标签: a,b,br,blockquote,i,li,pre,u,ul,p

当有人回复此评论时请E-mail通知我
社区评论

允许的HTML标签: a,b,br,blockquote,i,li,pre,u,ul,p

当有人回复此评论时请E-mail通知我

允许的HTML标签: a,b,br,blockquote,i,li,pre,u,ul,p

当有人回复此评论时请E-mail通知我

讨论

登陆InfoQ,与你最关心的话题互动。


找回密码....

Follow

关注你最喜爱的话题和作者

快速浏览网站内你所感兴趣话题的精选内容。

Like

内容自由定制

选择想要阅读的主题和喜爱的作者定制自己的新闻源。

Notifications

获取更新

设置通知机制以获取内容更新对您而言是否重要

BT