Lisp与其他语言互相调用

Common lisp 与其它语言的集成

ECL

ECL使用C/C++来编译lisp程序,可以同c/c++很好的集成在一起,互相调用。它同guile 类似,不同的是guile不支持Common lisp。

Corman

Corman是为windows量身打造的,开放源代码,其IDE不免费。可以很好的同c/c++集成,互相调用(in-process COM server),其提供的widnows api接口使用了CLOS,使用自然简洁。

(defmethod handle-message ((window <hello-window>) (message <paint-message>) wparam lparam)
    (declare (ignore wparam lparam))
    (begin-paint window)
    (let ((rect (hello-text-rect window)))
        (GetClientRect (window-hwnd window) rect)
        (DrawText (window-hdc window)
            (ct:create-c-string "Hello, World")
            -1
            rect
            (logior DT_SINGLELINE DT_CENTER DT_VCENTER)))
    (end-paint window)
    0)

cffi

cffi(Common Foreign Function Interface)为各种common lisp方言提供了统一的与c/c++语言通讯的接口。可以调用windows api。同时由于swig支持cffi,所以可以使用swig来自动生成lisp下的接口代码。lispbuilder提供了一个lispbuilder-windows(windows.h wrapper)模块,提供了windows.h的接口代码。并有一个演示gui的例子。

ltk

如果使用common lisp进行一些gui编程,可以考虑ltk,它使用tcl/tk做为gui前端,并将 tk的代码转换成common lisp风格。扩展起来也比较容易。

 --------------------------------------------------------------------

二、从C/C++中调用Lisp

http://objectmix.com/lisp/701820-call-lisp-c-c.html

http://objectmix.com/lisp/362409-howto-use-lisp-scripting-language-within-c.html

 

--------------------------------------------------------------------

三、

Ecl是一个开源的Lisp语言实现,他最大的特点就是能作为嵌入式脚本语言来使用,另外还能将lisp代码编译生成原生的程序。

下面介绍如何使用Visual Studio来编译Ecl。


下载最新版本的Ecl代码,最新版本是12.2.1。点击下载

将代码解压到指定的目录下,然后打开visual studio的命令行提示界面,进入到ecl代码目录下的msvc目录中。


输入nmake,开始编译代码。

编译完成后,输入nmake install prefix=d:\ecl 将编译好的ecl项目拷贝到d:\ecl下。


进入d:\ecl,输入ecl,出现以下提示

ECL (Embeddable Common-Lisp) 12.2.1 (git:UNKNOWN)
Copyright (C) 1984 Taiichi Yuasa and Masami Hagiya
Copyright (C) 1993 Giuseppe Attardi
Copyright (C) 2000 Juan J. Garcia-Ripoll
ECL is free software, and you are welcome to redistribute it
under certain conditions; see file 'Copyright' for details.
Type :h for Help.
Top level in: #<process TOP-LEVEL>.


这样ecl就安装完成了。


接下来编辑一个hello.lisp的文件,保存到ecl目录下,测试下编译成可执行代码。

代码内容如下:

(princ "Hello world!")
(terpri)
(quit)


这就是一个lisp版本的hello world了。按照ecl官方的manual,输入

>(compile-file "hello.lisp" :system-p t)

悲剧的事情出现了,编译成c语言的步骤为nil,编译终止了。在这卡了很久,包括到处google。


最后到mail list下搜索,发现正确步骤:

> (require :cmp)

;;; Loading #P"D:/ECL/cmp.fas"
("CMP")


> (setf C::*COMPILE-IN-CONSTANTS* t)


T


再输入

> (compile-file "hello.lisp" :system-p t)

;;;
;;; Compiling hello.lisp.
;;; OPTIMIZE levels: Safety=2, Space=0, Speed=3, Debug=0
;;;
;;; End of Pass 1.hello.c

;;; Finished compiling hello.lisp.
;;;
#P"D:/ECL/hello.obj"
NIL
NIL
> (c:build-program "myecl" :lisp-files '("hello.obj"))
eB1tmp.c
   正在创建库 D:/ECL/myecl.lib 和对象 D:/ECL/myecl.exp

#P"myecl.exe"


查看ecl文件夹下,多出来一个myecl.exe,看来ecl确实不错。

他的问题是开发人员似乎很少,所以项目的文档旧而且奇缺。

 

------------------------------------------------------------------------------

总结:lisp与c/c++可以实现互相调用;lisp可以调用其它语言;其他语言调用lisp不能;

            可以将LISP做为COM,服务等方式,通过IPC方式调用

           

 

 

  • 0
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值